ERC-721
Overview
Max Total Supply
3,320 GS
Holders
845
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
3 GSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FantomDigital
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-06-16 */ // Sources flattened with hardhat v2.3.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. 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; } } } // File contracts/FantomDigital.sol pragma solidity ^0.8.0; contract FantomDigital is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() ERC721('Gantom Stone', 'GS') {} function getPrice() public view returns(uint256) { uint256 price; if (totalSupply() < 1000) { price = 15 ether; } else { price = (totalSupply() * 7 / 50 - 125) * 1 ether; } return price; } function mint(address to, string memory uri) internal { require(totalSupply() <= 10000, 'supply depleted'); uint256 id = _tokenIdCounter.current(); _safeMint(to, id); _setTokenURI(id, uri); _tokenIdCounter.increment(); } function safeMint(address to, string memory uri) public onlyOwner { mint(to, uri); } function buyMint(string memory uri) public payable { require(getPrice() <= msg.value, 'not enough paid!'); mint(msg.sender, uri); } function payout() payable public onlyOwner { address payable AdminOne = payable(0x8D1f0c53b3c2faaE5a2db074dBfAC191e4e2CE39); address payable AdminTwo = payable(0x68F5F8367eeD81F6F7F9c463De6c4C0d2AdB2ccA); uint256 balance = address(this).balance; uint256 split = balance / 2; AdminOne.transfer(split); AdminTwo.transfer(split); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _baseURI() internal pure override returns (string memory) { return 'https://ipfs.io/ipfs/'; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"buyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payout","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600c81526b47616e746f6d2053746f6e6560a01b602080830191825283518085019094526002845261475360f01b9084015281519192916200006091600091620000ef565b50805162000076906001906020840190620000ef565b5050600b805460ff191690555060006200008f620000eb565b600b8054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001d2565b3390565b828054620000fd9062000195565b90600052602060002090601f0160209004810192826200012157600085556200016c565b82601f106200013c57805160ff19168380011785556200016c565b828001600101855582156200016c579182015b828111156200016c5782518255916020019190600101906200014f565b506200017a9291506200017e565b5090565b5b808211156200017a57600081556001016200017f565b600281046001821680620001aa57607f821691505b60208210811415620001cc57634e487b7160e01b600052602260045260246000fd5b50919050565b6126f880620001e26000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec57806398d5fdca1161008a578063c87b56dd11610064578063c87b56dd14610438578063d204c45e14610458578063e985e9c514610478578063f2fde38b146104985761019c565b806398d5fdca146103e3578063a22cb465146103f8578063b88d4fde146104185761019c565b8063715018a6116100c6578063715018a61461038f5780638456cb59146103a45780638da5cb5b146103b957806395d89b41146103ce5761019c565b80636352211e1461034757806363bd1d4a1461036757806370a082311461036f5761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e146102d257806342966c68146102f25780634f6ccce7146103125780635c975abb146103325761019c565b806323b872dd1461027d5780632f745c591461029d5780633f4ba83a146102bd5761019c565b806301ffc9a7146101a157806306fdde03146101d7578063081812fc146101f9578063095ea7b31461022657806318160ddd146102485780631abcfa8a1461026a575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004611d85565b6104b8565b6040516101ce9190611eb4565b60405180910390f35b3480156101e357600080fd5b506101ec6104cb565b6040516101ce9190611ebf565b34801561020557600080fd5b50610219610214366004611df0565b61055d565b6040516101ce9190611e63565b34801561023257600080fd5b50610246610241366004611d5c565b6105a9565b005b34801561025457600080fd5b5061025d610641565b6040516101ce9190612569565b610246610278366004611dbd565b610647565b34801561028957600080fd5b50610246610298366004611c22565b61067b565b3480156102a957600080fd5b5061025d6102b8366004611d5c565b6106b3565b3480156102c957600080fd5b50610246610705565b3480156102de57600080fd5b506102466102ed366004611c22565b61074e565b3480156102fe57600080fd5b5061024661030d366004611df0565b610769565b34801561031e57600080fd5b5061025d61032d366004611df0565b610799565b34801561033e57600080fd5b506101c16107f4565b34801561035357600080fd5b50610219610362366004611df0565b6107fd565b610246610832565b34801561037b57600080fd5b5061025d61038a366004611bd6565b610920565b34801561039b57600080fd5b50610246610964565b3480156103b057600080fd5b506102466109f3565b3480156103c557600080fd5b50610219610a3a565b3480156103da57600080fd5b506101ec610a4e565b3480156103ef57600080fd5b5061025d610a5d565b34801561040457600080fd5b50610246610413366004611cd6565b610ac5565b34801561042457600080fd5b50610246610433366004611c5d565b610b93565b34801561044457600080fd5b506101ec610453366004611df0565b610bd2565b34801561046457600080fd5b50610246610473366004611d10565b610bdd565b34801561048457600080fd5b506101c1610493366004611bf0565b610c2a565b3480156104a457600080fd5b506102466104b3366004611bd6565b610c58565b60006104c382610d24565b90505b919050565b6060600080546104da90612600565b80601f016020809104026020016040519081016040528092919081815260200182805461050690612600565b80156105535780601f1061052857610100808354040283529160200191610553565b820191906000526020600020905b81548152906001019060200180831161053657829003601f168201915b5050505050905090565b600061056882610d49565b61058d5760405162461bcd60e51b815260040161058490612322565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105b4826107fd565b9050806001600160a01b0316836001600160a01b031614156105e85760405162461bcd60e51b81526004016105849061243b565b806001600160a01b03166105fa610d66565b6001600160a01b03161480610616575061061681610493610d66565b6106325760405162461bcd60e51b81526004016105849061215e565b61063c8383610d6a565b505050565b60085490565b34610650610a5d565b111561066e5760405162461bcd60e51b815260040161058490611ed2565b6106783382610dd8565b50565b61068c610686610d66565b82610e2d565b6106a85760405162461bcd60e51b81526004016105849061247c565b61063c838383610eb2565b60006106be83610920565b82106106dc5760405162461bcd60e51b815260040161058490611f53565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61070d610d66565b6001600160a01b031661071e610a3a565b6001600160a01b0316146107445760405162461bcd60e51b81526004016105849061236e565b61074c610fdf565b565b61063c83838360405180602001604052806000815250610b93565b610774610686610d66565b6107905760405162461bcd60e51b815260040161058490612519565b6106788161104d565b60006107a3610641565b82106107c15760405162461bcd60e51b8152600401610584906124cd565b600882815481106107e257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b5460ff1690565b6000818152600260205260408120546001600160a01b0316806104c35760405162461bcd60e51b815260040161058490612205565b61083a610d66565b6001600160a01b031661084b610a3a565b6001600160a01b0316146108715760405162461bcd60e51b81526004016105849061236e565b738d1f0c53b3c2faae5a2db074dbfac191e4e2ce397368f5f8367eed81f6f7f9c463de6c4c0d2adb2cca4760006108a960028361258a565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f193505050501580156108e2573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610919573d6000803e3d6000fd5b5050505050565b60006001600160a01b0382166109485760405162461bcd60e51b8152600401610584906121bb565b506001600160a01b031660009081526003602052604090205490565b61096c610d66565b6001600160a01b031661097d610a3a565b6001600160a01b0316146109a35760405162461bcd60e51b81526004016105849061236e565b600b5460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b8054610100600160a81b0319169055565b6109fb610d66565b6001600160a01b0316610a0c610a3a565b6001600160a01b031614610a325760405162461bcd60e51b81526004016105849061236e565b61074c611056565b600b5461010090046001600160a01b031690565b6060600180546104da90612600565b6000806103e8610a6b610641565b1015610a80575067d02ab486cedc0000610ac0565b607d6032610a8c610641565b610a9790600761259e565b610aa1919061258a565b610aab91906125bd565b610abd90670de0b6b3a764000061259e565b90505b905090565b610acd610d66565b6001600160a01b0316826001600160a01b03161415610afe5760405162461bcd60e51b8152600401610584906120b1565b8060056000610b0b610d66565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b4f610d66565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b879190611eb4565b60405180910390a35050565b610ba4610b9e610d66565b83610e2d565b610bc05760405162461bcd60e51b81526004016105849061247c565b610bcc848484846110b1565b50505050565b60606104c3826110e4565b610be5610d66565b6001600160a01b0316610bf6610a3a565b6001600160a01b031614610c1c5760405162461bcd60e51b81526004016105849061236e565b610c268282610dd8565b5050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610c60610d66565b6001600160a01b0316610c71610a3a565b6001600160a01b031614610c975760405162461bcd60e51b81526004016105849061236e565b6001600160a01b038116610cbd5760405162461bcd60e51b815260040161058490611ff0565b600b546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806104c357506104c3826111fd565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d9f826107fd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612710610de3610641565b1115610e015760405162461bcd60e51b815260040161058490611f2a565b6000610e0d600c61123d565b9050610e198382611241565b610e23818361125b565b61063c600c61129f565b6000610e3882610d49565b610e545760405162461bcd60e51b8152600401610584906120e8565b6000610e5f836107fd565b9050806001600160a01b0316846001600160a01b03161480610e9a5750836001600160a01b0316610e8f8461055d565b6001600160a01b0316145b80610eaa5750610eaa8185610c2a565b949350505050565b826001600160a01b0316610ec5826107fd565b6001600160a01b031614610eeb5760405162461bcd60e51b8152600401610584906123a3565b6001600160a01b038216610f115760405162461bcd60e51b81526004016105849061206d565b610f1c8383836112a8565b610f27600082610d6a565b6001600160a01b0383166000908152600360205260408120805460019290610f509084906125bd565b90915550506001600160a01b0382166000908152600360205260408120805460019290610f7e908490612572565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610fe76107f4565b6110035760405162461bcd60e51b815260040161058490611efc565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611036610d66565b6040516110439190611e63565b60405180910390a1565b610678816112d8565b61105e6107f4565b1561107b5760405162461bcd60e51b815260040161058490612134565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611036610d66565b6110bc848484610eb2565b6110c884848484611318565b610bcc5760405162461bcd60e51b815260040161058490611f9e565b60606110ef82610d49565b61110b5760405162461bcd60e51b8152600401610584906122d1565b6000828152600a60205260408120805461112490612600565b80601f016020809104026020016040519081016040528092919081815260200182805461115090612600565b801561119d5780601f106111725761010080835404028352916020019161119d565b820191906000526020600020905b81548152906001019060200180831161118057829003601f168201915b5050505050905060006111ae611433565b90508051600014156111c2575090506104c6565b8151156111f45780826040516020016111dc929190611e34565b604051602081830303815290604052925050506104c6565b610eaa84611462565b60006001600160e01b031982166380ac58cd60e01b148061122e57506001600160e01b03198216635b5e139f60e01b145b806104c357506104c3826114e5565b5490565b610c268282604051806020016040528060008152506114fe565b61126482610d49565b6112805760405162461bcd60e51b81526004016105849061224e565b6000828152600a60209081526040909120825161063c92840190611a5f565b80546001019055565b6112b06107f4565b156112cd5760405162461bcd60e51b815260040161058490612134565b61063c838383611531565b6112e1816115ba565b6000818152600a6020526040902080546112fa90612600565b159050610678576000818152600a6020526040812061067891611ae3565b600061132c846001600160a01b0316611661565b1561142857836001600160a01b031663150b7a02611348610d66565b8786866040518563ffffffff1660e01b815260040161136a9493929190611e77565b602060405180830381600087803b15801561138457600080fd5b505af19250505080156113b4575060408051601f3d908101601f191682019092526113b191810190611da1565b60015b61140e573d8080156113e2576040519150601f19603f3d011682016040523d82523d6000602084013e6113e7565b606091505b5080516114065760405162461bcd60e51b815260040161058490611f9e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610eaa565b506001949350505050565b60408051808201909152601581527468747470733a2f2f697066732e696f2f697066732f60581b602082015290565b606061146d82610d49565b6114895760405162461bcd60e51b8152600401610584906123ec565b6000611493611433565b905060008151116114b357604051806020016040528060008152506114de565b806114bd84611667565b6040516020016114ce929190611e34565b6040516020818303038152906040525b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6115088383611782565b6115156000848484611318565b61063c5760405162461bcd60e51b815260040161058490611f9e565b61153c83838361063c565b6001600160a01b0383166115585761155381611861565b61157b565b816001600160a01b0316836001600160a01b03161461157b5761157b83826118a5565b6001600160a01b0382166115975761159281611942565b61063c565b826001600160a01b0316826001600160a01b03161461063c5761063c8282611a1b565b60006115c5826107fd565b90506115d3816000846112a8565b6115de600083610d6a565b6001600160a01b03811660009081526003602052604081208054600192906116079084906125bd565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b3b151590565b60608161168c57506040805180820190915260018152600360fc1b60208201526104c6565b8160005b81156116b657806116a08161263b565b91506116af9050600a8361258a565b9150611690565b60008167ffffffffffffffff8111156116df57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611709576020820181803683370190505b5090505b8415610eaa5761171e6001836125bd565b915061172b600a86612656565b611736906030612572565b60f81b81838151811061175957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061177b600a8661258a565b945061170d565b6001600160a01b0382166117a85760405162461bcd60e51b81526004016105849061229c565b6117b181610d49565b156117ce5760405162461bcd60e51b815260040161058490612036565b6117da600083836112a8565b6001600160a01b0382166000908152600360205260408120805460019290611803908490612572565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016118b284610920565b6118bc91906125bd565b60008381526007602052604090205490915080821461190f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611954906001906125bd565b6000838152600960205260408120546008805493945090928490811061198a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106119b957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806119ff57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611a2683610920565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611a6b90612600565b90600052602060002090601f016020900481019282611a8d5760008555611ad3565b82601f10611aa657805160ff1916838001178555611ad3565b82800160010185558215611ad3579182015b82811115611ad3578251825591602001919060010190611ab8565b50611adf929150611b1b565b5090565b508054611aef90612600565b6000825580601f10611b015750610678565b601f01602090049060005260206000209081019061067891905b5b80821115611adf5760008155600101611b1c565b600067ffffffffffffffff80841115611b4b57611b4b612696565b604051601f8501601f191681016020018281118282101715611b6f57611b6f612696565b604052848152915081838501861015611b8757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146104c657600080fd5b600082601f830112611bc7578081fd5b6114de83833560208501611b30565b600060208284031215611be7578081fd5b6114de82611ba0565b60008060408385031215611c02578081fd5b611c0b83611ba0565b9150611c1960208401611ba0565b90509250929050565b600080600060608486031215611c36578081fd5b611c3f84611ba0565b9250611c4d60208501611ba0565b9150604084013590509250925092565b60008060008060808587031215611c72578081fd5b611c7b85611ba0565b9350611c8960208601611ba0565b925060408501359150606085013567ffffffffffffffff811115611cab578182fd5b8501601f81018713611cbb578182fd5b611cca87823560208401611b30565b91505092959194509250565b60008060408385031215611ce8578182fd5b611cf183611ba0565b915060208301358015158114611d05578182fd5b809150509250929050565b60008060408385031215611d22578182fd5b611d2b83611ba0565b9150602083013567ffffffffffffffff811115611d46578182fd5b611d5285828601611bb7565b9150509250929050565b60008060408385031215611d6e578182fd5b611d7783611ba0565b946020939093013593505050565b600060208284031215611d96578081fd5b81356114de816126ac565b600060208284031215611db2578081fd5b81516114de816126ac565b600060208284031215611dce578081fd5b813567ffffffffffffffff811115611de4578182fd5b610eaa84828501611bb7565b600060208284031215611e01578081fd5b5035919050565b60008151808452611e208160208601602086016125d4565b601f01601f19169290920160200192915050565b60008351611e468184602088016125d4565b835190830190611e5a8183602088016125d4565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eaa90830184611e08565b9695505050505050565b901515815260200190565b6000602082526114de6020830184611e08565b60208082526010908201526f6e6f7420656e6f75676820706169642160801b604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600f908201526e1cdd5c1c1b1e4819195c1b195d1959608a1b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b90815260200190565b600082198211156125855761258561266a565b500190565b60008261259957612599612680565b500490565b60008160001904831182151516156125b8576125b861266a565b500290565b6000828210156125cf576125cf61266a565b500390565b60005b838110156125ef5781810151838201526020016125d7565b83811115610bcc5750506000910152565b60028104600182168061261457607f821691505b6020821081141561263557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561264f5761264f61266a565b5060010190565b60008261266557612665612680565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461067857600080fdfea264697066735822122081cf4324be0f193e602440c184059437619eb4171ecd1cdcff99cd73a4fdb89d64736f6c63430008000033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636352211e116100ec57806398d5fdca1161008a578063c87b56dd11610064578063c87b56dd14610438578063d204c45e14610458578063e985e9c514610478578063f2fde38b146104985761019c565b806398d5fdca146103e3578063a22cb465146103f8578063b88d4fde146104185761019c565b8063715018a6116100c6578063715018a61461038f5780638456cb59146103a45780638da5cb5b146103b957806395d89b41146103ce5761019c565b80636352211e1461034757806363bd1d4a1461036757806370a082311461036f5761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e146102d257806342966c68146102f25780634f6ccce7146103125780635c975abb146103325761019c565b806323b872dd1461027d5780632f745c591461029d5780633f4ba83a146102bd5761019c565b806301ffc9a7146101a157806306fdde03146101d7578063081812fc146101f9578063095ea7b31461022657806318160ddd146102485780631abcfa8a1461026a575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004611d85565b6104b8565b6040516101ce9190611eb4565b60405180910390f35b3480156101e357600080fd5b506101ec6104cb565b6040516101ce9190611ebf565b34801561020557600080fd5b50610219610214366004611df0565b61055d565b6040516101ce9190611e63565b34801561023257600080fd5b50610246610241366004611d5c565b6105a9565b005b34801561025457600080fd5b5061025d610641565b6040516101ce9190612569565b610246610278366004611dbd565b610647565b34801561028957600080fd5b50610246610298366004611c22565b61067b565b3480156102a957600080fd5b5061025d6102b8366004611d5c565b6106b3565b3480156102c957600080fd5b50610246610705565b3480156102de57600080fd5b506102466102ed366004611c22565b61074e565b3480156102fe57600080fd5b5061024661030d366004611df0565b610769565b34801561031e57600080fd5b5061025d61032d366004611df0565b610799565b34801561033e57600080fd5b506101c16107f4565b34801561035357600080fd5b50610219610362366004611df0565b6107fd565b610246610832565b34801561037b57600080fd5b5061025d61038a366004611bd6565b610920565b34801561039b57600080fd5b50610246610964565b3480156103b057600080fd5b506102466109f3565b3480156103c557600080fd5b50610219610a3a565b3480156103da57600080fd5b506101ec610a4e565b3480156103ef57600080fd5b5061025d610a5d565b34801561040457600080fd5b50610246610413366004611cd6565b610ac5565b34801561042457600080fd5b50610246610433366004611c5d565b610b93565b34801561044457600080fd5b506101ec610453366004611df0565b610bd2565b34801561046457600080fd5b50610246610473366004611d10565b610bdd565b34801561048457600080fd5b506101c1610493366004611bf0565b610c2a565b3480156104a457600080fd5b506102466104b3366004611bd6565b610c58565b60006104c382610d24565b90505b919050565b6060600080546104da90612600565b80601f016020809104026020016040519081016040528092919081815260200182805461050690612600565b80156105535780601f1061052857610100808354040283529160200191610553565b820191906000526020600020905b81548152906001019060200180831161053657829003601f168201915b5050505050905090565b600061056882610d49565b61058d5760405162461bcd60e51b815260040161058490612322565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105b4826107fd565b9050806001600160a01b0316836001600160a01b031614156105e85760405162461bcd60e51b81526004016105849061243b565b806001600160a01b03166105fa610d66565b6001600160a01b03161480610616575061061681610493610d66565b6106325760405162461bcd60e51b81526004016105849061215e565b61063c8383610d6a565b505050565b60085490565b34610650610a5d565b111561066e5760405162461bcd60e51b815260040161058490611ed2565b6106783382610dd8565b50565b61068c610686610d66565b82610e2d565b6106a85760405162461bcd60e51b81526004016105849061247c565b61063c838383610eb2565b60006106be83610920565b82106106dc5760405162461bcd60e51b815260040161058490611f53565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61070d610d66565b6001600160a01b031661071e610a3a565b6001600160a01b0316146107445760405162461bcd60e51b81526004016105849061236e565b61074c610fdf565b565b61063c83838360405180602001604052806000815250610b93565b610774610686610d66565b6107905760405162461bcd60e51b815260040161058490612519565b6106788161104d565b60006107a3610641565b82106107c15760405162461bcd60e51b8152600401610584906124cd565b600882815481106107e257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600b5460ff1690565b6000818152600260205260408120546001600160a01b0316806104c35760405162461bcd60e51b815260040161058490612205565b61083a610d66565b6001600160a01b031661084b610a3a565b6001600160a01b0316146108715760405162461bcd60e51b81526004016105849061236e565b738d1f0c53b3c2faae5a2db074dbfac191e4e2ce397368f5f8367eed81f6f7f9c463de6c4c0d2adb2cca4760006108a960028361258a565b6040519091506001600160a01b0385169082156108fc029083906000818181858888f193505050501580156108e2573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610919573d6000803e3d6000fd5b5050505050565b60006001600160a01b0382166109485760405162461bcd60e51b8152600401610584906121bb565b506001600160a01b031660009081526003602052604090205490565b61096c610d66565b6001600160a01b031661097d610a3a565b6001600160a01b0316146109a35760405162461bcd60e51b81526004016105849061236e565b600b5460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b8054610100600160a81b0319169055565b6109fb610d66565b6001600160a01b0316610a0c610a3a565b6001600160a01b031614610a325760405162461bcd60e51b81526004016105849061236e565b61074c611056565b600b5461010090046001600160a01b031690565b6060600180546104da90612600565b6000806103e8610a6b610641565b1015610a80575067d02ab486cedc0000610ac0565b607d6032610a8c610641565b610a9790600761259e565b610aa1919061258a565b610aab91906125bd565b610abd90670de0b6b3a764000061259e565b90505b905090565b610acd610d66565b6001600160a01b0316826001600160a01b03161415610afe5760405162461bcd60e51b8152600401610584906120b1565b8060056000610b0b610d66565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b4f610d66565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610b879190611eb4565b60405180910390a35050565b610ba4610b9e610d66565b83610e2d565b610bc05760405162461bcd60e51b81526004016105849061247c565b610bcc848484846110b1565b50505050565b60606104c3826110e4565b610be5610d66565b6001600160a01b0316610bf6610a3a565b6001600160a01b031614610c1c5760405162461bcd60e51b81526004016105849061236e565b610c268282610dd8565b5050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610c60610d66565b6001600160a01b0316610c71610a3a565b6001600160a01b031614610c975760405162461bcd60e51b81526004016105849061236e565b6001600160a01b038116610cbd5760405162461bcd60e51b815260040161058490611ff0565b600b546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806104c357506104c3826111fd565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d9f826107fd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612710610de3610641565b1115610e015760405162461bcd60e51b815260040161058490611f2a565b6000610e0d600c61123d565b9050610e198382611241565b610e23818361125b565b61063c600c61129f565b6000610e3882610d49565b610e545760405162461bcd60e51b8152600401610584906120e8565b6000610e5f836107fd565b9050806001600160a01b0316846001600160a01b03161480610e9a5750836001600160a01b0316610e8f8461055d565b6001600160a01b0316145b80610eaa5750610eaa8185610c2a565b949350505050565b826001600160a01b0316610ec5826107fd565b6001600160a01b031614610eeb5760405162461bcd60e51b8152600401610584906123a3565b6001600160a01b038216610f115760405162461bcd60e51b81526004016105849061206d565b610f1c8383836112a8565b610f27600082610d6a565b6001600160a01b0383166000908152600360205260408120805460019290610f509084906125bd565b90915550506001600160a01b0382166000908152600360205260408120805460019290610f7e908490612572565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610fe76107f4565b6110035760405162461bcd60e51b815260040161058490611efc565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611036610d66565b6040516110439190611e63565b60405180910390a1565b610678816112d8565b61105e6107f4565b1561107b5760405162461bcd60e51b815260040161058490612134565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611036610d66565b6110bc848484610eb2565b6110c884848484611318565b610bcc5760405162461bcd60e51b815260040161058490611f9e565b60606110ef82610d49565b61110b5760405162461bcd60e51b8152600401610584906122d1565b6000828152600a60205260408120805461112490612600565b80601f016020809104026020016040519081016040528092919081815260200182805461115090612600565b801561119d5780601f106111725761010080835404028352916020019161119d565b820191906000526020600020905b81548152906001019060200180831161118057829003601f168201915b5050505050905060006111ae611433565b90508051600014156111c2575090506104c6565b8151156111f45780826040516020016111dc929190611e34565b604051602081830303815290604052925050506104c6565b610eaa84611462565b60006001600160e01b031982166380ac58cd60e01b148061122e57506001600160e01b03198216635b5e139f60e01b145b806104c357506104c3826114e5565b5490565b610c268282604051806020016040528060008152506114fe565b61126482610d49565b6112805760405162461bcd60e51b81526004016105849061224e565b6000828152600a60209081526040909120825161063c92840190611a5f565b80546001019055565b6112b06107f4565b156112cd5760405162461bcd60e51b815260040161058490612134565b61063c838383611531565b6112e1816115ba565b6000818152600a6020526040902080546112fa90612600565b159050610678576000818152600a6020526040812061067891611ae3565b600061132c846001600160a01b0316611661565b1561142857836001600160a01b031663150b7a02611348610d66565b8786866040518563ffffffff1660e01b815260040161136a9493929190611e77565b602060405180830381600087803b15801561138457600080fd5b505af19250505080156113b4575060408051601f3d908101601f191682019092526113b191810190611da1565b60015b61140e573d8080156113e2576040519150601f19603f3d011682016040523d82523d6000602084013e6113e7565b606091505b5080516114065760405162461bcd60e51b815260040161058490611f9e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610eaa565b506001949350505050565b60408051808201909152601581527468747470733a2f2f697066732e696f2f697066732f60581b602082015290565b606061146d82610d49565b6114895760405162461bcd60e51b8152600401610584906123ec565b6000611493611433565b905060008151116114b357604051806020016040528060008152506114de565b806114bd84611667565b6040516020016114ce929190611e34565b6040516020818303038152906040525b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6115088383611782565b6115156000848484611318565b61063c5760405162461bcd60e51b815260040161058490611f9e565b61153c83838361063c565b6001600160a01b0383166115585761155381611861565b61157b565b816001600160a01b0316836001600160a01b03161461157b5761157b83826118a5565b6001600160a01b0382166115975761159281611942565b61063c565b826001600160a01b0316826001600160a01b03161461063c5761063c8282611a1b565b60006115c5826107fd565b90506115d3816000846112a8565b6115de600083610d6a565b6001600160a01b03811660009081526003602052604081208054600192906116079084906125bd565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b3b151590565b60608161168c57506040805180820190915260018152600360fc1b60208201526104c6565b8160005b81156116b657806116a08161263b565b91506116af9050600a8361258a565b9150611690565b60008167ffffffffffffffff8111156116df57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611709576020820181803683370190505b5090505b8415610eaa5761171e6001836125bd565b915061172b600a86612656565b611736906030612572565b60f81b81838151811061175957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061177b600a8661258a565b945061170d565b6001600160a01b0382166117a85760405162461bcd60e51b81526004016105849061229c565b6117b181610d49565b156117ce5760405162461bcd60e51b815260040161058490612036565b6117da600083836112a8565b6001600160a01b0382166000908152600360205260408120805460019290611803908490612572565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016118b284610920565b6118bc91906125bd565b60008381526007602052604090205490915080821461190f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611954906001906125bd565b6000838152600960205260408120546008805493945090928490811061198a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106119b957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806119ff57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611a2683610920565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611a6b90612600565b90600052602060002090601f016020900481019282611a8d5760008555611ad3565b82601f10611aa657805160ff1916838001178555611ad3565b82800160010185558215611ad3579182015b82811115611ad3578251825591602001919060010190611ab8565b50611adf929150611b1b565b5090565b508054611aef90612600565b6000825580601f10611b015750610678565b601f01602090049060005260206000209081019061067891905b5b80821115611adf5760008155600101611b1c565b600067ffffffffffffffff80841115611b4b57611b4b612696565b604051601f8501601f191681016020018281118282101715611b6f57611b6f612696565b604052848152915081838501861015611b8757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146104c657600080fd5b600082601f830112611bc7578081fd5b6114de83833560208501611b30565b600060208284031215611be7578081fd5b6114de82611ba0565b60008060408385031215611c02578081fd5b611c0b83611ba0565b9150611c1960208401611ba0565b90509250929050565b600080600060608486031215611c36578081fd5b611c3f84611ba0565b9250611c4d60208501611ba0565b9150604084013590509250925092565b60008060008060808587031215611c72578081fd5b611c7b85611ba0565b9350611c8960208601611ba0565b925060408501359150606085013567ffffffffffffffff811115611cab578182fd5b8501601f81018713611cbb578182fd5b611cca87823560208401611b30565b91505092959194509250565b60008060408385031215611ce8578182fd5b611cf183611ba0565b915060208301358015158114611d05578182fd5b809150509250929050565b60008060408385031215611d22578182fd5b611d2b83611ba0565b9150602083013567ffffffffffffffff811115611d46578182fd5b611d5285828601611bb7565b9150509250929050565b60008060408385031215611d6e578182fd5b611d7783611ba0565b946020939093013593505050565b600060208284031215611d96578081fd5b81356114de816126ac565b600060208284031215611db2578081fd5b81516114de816126ac565b600060208284031215611dce578081fd5b813567ffffffffffffffff811115611de4578182fd5b610eaa84828501611bb7565b600060208284031215611e01578081fd5b5035919050565b60008151808452611e208160208601602086016125d4565b601f01601f19169290920160200192915050565b60008351611e468184602088016125d4565b835190830190611e5a8183602088016125d4565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eaa90830184611e08565b9695505050505050565b901515815260200190565b6000602082526114de6020830184611e08565b60208082526010908201526f6e6f7420656e6f75676820706169642160801b604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600f908201526e1cdd5c1c1b1e4819195c1b195d1959608a1b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b90815260200190565b600082198211156125855761258561266a565b500190565b60008261259957612599612680565b500490565b60008160001904831182151516156125b8576125b861266a565b500290565b6000828210156125cf576125cf61266a565b500390565b60005b838110156125ef5781810151838201526020016125d7565b83811115610bcc5750506000910152565b60028104600182168061261457607f821691505b6020821081141561263557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561264f5761264f61266a565b5060010190565b60008261266557612665612680565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461067857600080fdfea264697066735822122081cf4324be0f193e602440c184059437619eb4171ecd1cdcff99cd73a4fdb89d64736f6c63430008000033
Deployed Bytecode Sourcemap
49151:2581:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51517:212;;;;;;;;;;-1:-1:-1;51517:212:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21623:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23083:221::-;;;;;;;;;;-1:-1:-1;23083:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22620:397::-;;;;;;;;;;-1:-1:-1;22620:397:0;;;;;:::i;:::-;;:::i;:::-;;35075:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50116:154::-;;;;;;:::i;:::-;;:::i;23973:305::-;;;;;;;;;;-1:-1:-1;23973:305:0;;;;;:::i;:::-;;:::i;34743:256::-;;;;;;;;;;-1:-1:-1;34743:256:0;;;;;:::i;:::-;;:::i;50758:65::-;;;;;;;;;;;;;:::i;24349:151::-;;;;;;;;;;-1:-1:-1;24349:151:0;;;;;:::i;:::-;;:::i;47501:245::-;;;;;;;;;;-1:-1:-1;47501:245:0;;;;;:::i;:::-;;:::i;35265:233::-;;;;;;;;;;-1:-1:-1;35265:233:0;;;;;:::i;:::-;;:::i;43553:86::-;;;;;;;;;;;;;:::i;21317:239::-;;;;;;;;;;-1:-1:-1;21317:239:0;;;;;:::i;:::-;;:::i;50282:389::-;;;:::i;21047:208::-;;;;;;;;;;-1:-1:-1;21047:208:0;;;;;:::i;:::-;;:::i;46488:148::-;;;;;;;;;;;;;:::i;50689:61::-;;;;;;;;;;;;;:::i;45837:87::-;;;;;;;;;;;;;:::i;21792:104::-;;;;;;;;;;;;;:::i;49412:284::-;;;;;;;;;;;;;:::i;23376:295::-;;;;;;;;;;-1:-1:-1;23376:295:0;;;;;:::i;:::-;;:::i;24571:285::-;;;;;;;;;;-1:-1:-1;24571:285:0;;;;;:::i;:::-;;:::i;51313:196::-;;;;;;;;;;-1:-1:-1;51313:196:0;;;;;:::i;:::-;;:::i;50006:98::-;;;;;;;;;;-1:-1:-1;50006:98:0;;;;;:::i;:::-;;:::i;23742:164::-;;;;;;;;;;-1:-1:-1;23742:164:0;;;;;:::i;:::-;;:::i;46791:244::-;;;;;;;;;;-1:-1:-1;46791:244:0;;;;;:::i;:::-;;:::i;51517:212::-;51656:4;51685:36;51709:11;51685:23;:36::i;:::-;51678:43;;51517:212;;;;:::o;21623:100::-;21677:13;21710:5;21703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21623:100;:::o;23083:221::-;23159:7;23187:16;23195:7;23187;:16::i;:::-;23179:73;;;;-1:-1:-1;;;23179:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23272:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23272:24:0;;23083:221::o;22620:397::-;22701:13;22717:23;22732:7;22717:14;:23::i;:::-;22701:39;;22765:5;-1:-1:-1;;;;;22759:11:0;:2;-1:-1:-1;;;;;22759:11:0;;;22751:57;;;;-1:-1:-1;;;22751:57:0;;;;;;;:::i;:::-;22845:5;-1:-1:-1;;;;;22829:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22829:21:0;;:62;;;;22854:37;22871:5;22878:12;:10;:12::i;22854:37::-;22821:154;;;;-1:-1:-1;;;22821:154:0;;;;;;;:::i;:::-;22988:21;22997:2;23001:7;22988:8;:21::i;:::-;22620:397;;;:::o;35075:113::-;35163:10;:17;35075:113;:::o;50116:154::-;50200:9;50186:10;:8;:10::i;:::-;:23;;50178:52;;;;-1:-1:-1;;;50178:52:0;;;;;;;:::i;:::-;50241:21;50246:10;50258:3;50241:4;:21::i;:::-;50116:154;:::o;23973:305::-;24134:41;24153:12;:10;:12::i;:::-;24167:7;24134:18;:41::i;:::-;24126:103;;;;-1:-1:-1;;;24126:103:0;;;;;;;:::i;:::-;24242:28;24252:4;24258:2;24262:7;24242:9;:28::i;34743:256::-;34840:7;34876:23;34893:5;34876:16;:23::i;:::-;34868:5;:31;34860:87;;;;-1:-1:-1;;;34860:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34965:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34743:256::o;50758:65::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;50805:10:::1;:8;:10::i;:::-;50758:65::o:0;24349:151::-;24453:39;24470:4;24476:2;24480:7;24453:39;;;;;;;;;;;;:16;:39::i;47501:245::-;47619:41;47638:12;:10;:12::i;47619:41::-;47611:102;;;;-1:-1:-1;;;47611:102:0;;;;;;;:::i;:::-;47724:14;47730:7;47724:5;:14::i;35265:233::-;35340:7;35376:30;:28;:30::i;:::-;35368:5;:38;35360:95;;;;-1:-1:-1;;;35360:95:0;;;;;;;:::i;:::-;35473:10;35484:5;35473:17;;;;;;-1:-1:-1;;;35473:17:0;;;;;;;;;;;;;;;;;35466:24;;35265:233;;;:::o;43553:86::-;43624:7;;;;43553:86;:::o;21317:239::-;21389:7;21425:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21425:16:0;21460:19;21452:73;;;;-1:-1:-1;;;21452:73:0;;;;;;;:::i;50282:389::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;50371:42:::1;50460;50534:21;50336:24;50582:11;50592:1;50534:21:::0;50582:11:::1;:::i;:::-;50604:24;::::0;50566:27;;-1:-1:-1;;;;;;50604:17:0;::::1;::::0;:24;::::1;;;::::0;50566:27;;50604:24:::1;::::0;;;50566:27;50604:17;:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50639:24:0::1;::::0;-1:-1:-1;;;;;50639:17:0;::::1;::::0;:24;::::1;;;::::0;50657:5;;50639:24:::1;::::0;;;50657:5;50639:17;:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;46128:1;;;;50282:389::o:0;21047:208::-;21119:7;-1:-1:-1;;;;;21147:19:0;;21139:74;;;;-1:-1:-1;;;21139:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21231:16:0;;;;;:9;:16;;;;;;;21047:208::o;46488:148::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;46579:6:::1;::::0;46558:40:::1;::::0;46595:1:::1;::::0;46579:6:::1;::::0;::::1;-1:-1:-1::0;;;;;46579:6:0::1;::::0;46558:40:::1;::::0;46595:1;;46558:40:::1;46609:6;:19:::0;;-1:-1:-1;;;;;;46609:19:0::1;::::0;;46488:148::o;50689:61::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;50734:8:::1;:6;:8::i;45837:87::-:0;45910:6;;;;;-1:-1:-1;;;;;45910:6:0;;45837:87::o;21792:104::-;21848:13;21881:7;21874:14;;;;;:::i;49412:284::-;49452:7;49472:13;49526:4;49510:13;:11;:13::i;:::-;:20;49506:150;;;-1:-1:-1;49555:8:0;49506:150;;;49630:3;49625:2;49605:13;:11;:13::i;:::-;:17;;49621:1;49605:17;:::i;:::-;:22;;;;:::i;:::-;:28;;;;:::i;:::-;49604:40;;49637:7;49604:40;:::i;:::-;49596:48;;49506:150;49683:5;-1:-1:-1;49412:284:0;:::o;23376:295::-;23491:12;:10;:12::i;:::-;-1:-1:-1;;;;;23479:24:0;:8;-1:-1:-1;;;;;23479:24:0;;;23471:62;;;;-1:-1:-1;;;23471:62:0;;;;;;;:::i;:::-;23591:8;23546:18;:32;23565:12;:10;:12::i;:::-;-1:-1:-1;;;;;23546:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23546:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23546:53:0;;;;;;;;;;;23630:12;:10;:12::i;:::-;-1:-1:-1;;;;;23615:48:0;;23654:8;23615:48;;;;;;:::i;:::-;;;;;;;;23376:295;;:::o;24571:285::-;24703:41;24722:12;:10;:12::i;:::-;24736:7;24703:18;:41::i;:::-;24695:103;;;;-1:-1:-1;;;24695:103:0;;;;;;;:::i;:::-;24809:39;24823:4;24829:2;24833:7;24842:5;24809:13;:39::i;:::-;24571:285;;;;:::o;51313:196::-;51440:13;51478:23;51493:7;51478:14;:23::i;50006:98::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;50083:13:::1;50088:2;50092:3;50083:4;:13::i;:::-;50006:98:::0;;:::o;23742:164::-;-1:-1:-1;;;;;23863:25:0;;;23839:4;23863:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23742:164::o;46791:244::-;46068:12;:10;:12::i;:::-;-1:-1:-1;;;;;46057:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;46057:23:0;;46049:68;;;;-1:-1:-1;;;46049:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46880:22:0;::::1;46872:73;;;;-1:-1:-1::0;;;46872:73:0::1;;;;;;;:::i;:::-;46982:6;::::0;46961:38:::1;::::0;-1:-1:-1;;;;;46961:38:0;;::::1;::::0;46982:6:::1;::::0;::::1;;::::0;46961:38:::1;::::0;;;::::1;47010:6;:17:::0;;-1:-1:-1;;;;;47010:17:0;;::::1;;;-1:-1:-1::0;;;;;;47010:17:0;;::::1;::::0;;;::::1;::::0;;46791:244::o;34422:237::-;34524:4;-1:-1:-1;;;;;;34548:50:0;;-1:-1:-1;;;34548:50:0;;:103;;;34615:36;34639:11;34615:23;:36::i;26323:127::-;26388:4;26412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26412:16:0;:30;;;26323:127::o;15971:98::-;16051:10;15971:98;:::o;30200:174::-;30275:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30275:29:0;-1:-1:-1;;;;;30275:29:0;;;;;;;;:24;;30329:23;30275:24;30329:14;:23::i;:::-;-1:-1:-1;;;;;30320:46:0;;;;;;;;;;;30200:174;;:::o;49708:280::-;49798:5;49781:13;:11;:13::i;:::-;:22;;49773:50;;;;-1:-1:-1;;;49773:50:0;;;;;;;:::i;:::-;49844:10;49857:25;:15;:23;:25::i;:::-;49844:38;;49893:17;49903:2;49907;49893:9;:17::i;:::-;49921:21;49934:2;49938:3;49921:12;:21::i;:::-;49953:27;:15;:25;:27::i;26617:348::-;26710:4;26735:16;26743:7;26735;:16::i;:::-;26727:73;;;;-1:-1:-1;;;26727:73:0;;;;;;;:::i;:::-;26811:13;26827:23;26842:7;26827:14;:23::i;:::-;26811:39;;26880:5;-1:-1:-1;;;;;26869:16:0;:7;-1:-1:-1;;;;;26869:16:0;;:51;;;;26913:7;-1:-1:-1;;;;;26889:31:0;:20;26901:7;26889:11;:20::i;:::-;-1:-1:-1;;;;;26889:31:0;;26869:51;:87;;;;26924:32;26941:5;26948:7;26924:16;:32::i;:::-;26861:96;26617:348;-1:-1:-1;;;;26617:348:0:o;29538:544::-;29663:4;-1:-1:-1;;;;;29636:31:0;:23;29651:7;29636:14;:23::i;:::-;-1:-1:-1;;;;;29636:31:0;;29628:85;;;;-1:-1:-1;;;29628:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29732:16:0;;29724:65;;;;-1:-1:-1;;;29724:65:0;;;;;;;:::i;:::-;29802:39;29823:4;29829:2;29833:7;29802:20;:39::i;:::-;29906:29;29923:1;29927:7;29906:8;:29::i;:::-;-1:-1:-1;;;;;29948:15:0;;;;;;:9;:15;;;;;:20;;29967:1;;29948:15;:20;;29967:1;;29948:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29979:13:0;;;;;;:9;:13;;;;;:18;;29996:1;;29979:13;:18;;29996:1;;29979:18;:::i;:::-;;;;-1:-1:-1;;30008:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30008:21:0;-1:-1:-1;;;;;30008:21:0;;;;;;;;;30047:27;;30008:16;;30047:27;;;;;;;29538:544;;;:::o;44612:120::-;44156:8;:6;:8::i;:::-;44148:41;;;;-1:-1:-1;;;44148:41:0;;;;;;;:::i;:::-;44671:7:::1;:15:::0;;-1:-1:-1;;44671:15:0::1;::::0;;44702:22:::1;44711:12;:10;:12::i;:::-;44702:22;;;;;;:::i;:::-;;;;;;;;44612:120::o:0;51190:115::-;51277:20;51289:7;51277:11;:20::i;44353:118::-;43879:8;:6;:8::i;:::-;43878:9;43870:38;;;;-1:-1:-1;;;43870:38:0;;;;;;;:::i;:::-;44413:7:::1;:14:::0;;-1:-1:-1;;44413:14:0::1;44423:4;44413:14;::::0;;44443:20:::1;44450:12;:10;:12::i;25738:272::-:0;25852:28;25862:4;25868:2;25872:7;25852:9;:28::i;:::-;25899:48;25922:4;25928:2;25932:7;25941:5;25899:22;:48::i;:::-;25891:111;;;;-1:-1:-1;;;25891:111:0;;;;;;;:::i;40982:679::-;41055:13;41089:16;41097:7;41089;:16::i;:::-;41081:78;;;;-1:-1:-1;;;41081:78:0;;;;;;;:::i;:::-;41172:23;41198:19;;;:10;:19;;;;;41172:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41228:18;41249:10;:8;:10::i;:::-;41228:31;;41341:4;41335:18;41357:1;41335:23;41331:72;;;-1:-1:-1;41382:9:0;-1:-1:-1;41375:16:0;;41331:72;41507:23;;:27;41503:108;;41582:4;41588:9;41565:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41551:48;;;;;;41503:108;41630:23;41645:7;41630:14;:23::i;20691:292::-;20793:4;-1:-1:-1;;;;;;20817:40:0;;-1:-1:-1;;;20817:40:0;;:105;;-1:-1:-1;;;;;;;20874:48:0;;-1:-1:-1;;;20874:48:0;20817:105;:158;;;;20939:36;20963:11;20939:23;:36::i;48574:114::-;48666:14;;48574:114::o;27307:110::-;27383:26;27393:2;27397:7;27383:26;;;;;;;;;;;;:9;:26::i;41817:217::-;41917:16;41925:7;41917;:16::i;:::-;41909:75;;;;-1:-1:-1;;;41909:75:0;;;;;;;:::i;:::-;41995:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;48696:127::-;48785:19;;48803:1;48785:19;;;48696:127::o;50955:227::-;43879:8;:6;:8::i;:::-;43878:9;43870:38;;;;-1:-1:-1;;;43870:38:0;;;;;;;:::i;:::-;51129:45:::1;51156:4;51162:2;51166:7;51129:26;:45::i;42263:206::-:0;42332:20;42344:7;42332:11;:20::i;:::-;42375:19;;;;:10;:19;;;;;42369:33;;;;;:::i;:::-;:38;;-1:-1:-1;42365:97:0;;42431:19;;;;:10;:19;;;;;42424:26;;;:::i;30939:843::-;31060:4;31086:15;:2;-1:-1:-1;;;;;31086:13:0;;:15::i;:::-;31082:693;;;31138:2;-1:-1:-1;;;;;31122:36:0;;31159:12;:10;:12::i;:::-;31173:4;31179:7;31188:5;31122:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31122:72:0;;;;;;;;-1:-1:-1;;31122:72:0;;;;;;;;;;;;:::i;:::-;;;31118:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31368:13:0;;31364:341;;31411:60;;-1:-1:-1;;;31411:60:0;;;;;;;:::i;31364:341::-;31655:6;31649:13;31640:6;31636:2;31632:15;31625:38;31118:602;-1:-1:-1;;;;;;31245:55:0;-1:-1:-1;;;31245:55:0;;-1:-1:-1;31238:62:0;;31082:693;-1:-1:-1;31759:4:0;30939:843;;;;;;:::o;50831:116::-;50909:30;;;;;;;;;;;;-1:-1:-1;;;50909:30:0;;;;50831:116;:::o;21967:360::-;22040:13;22074:16;22082:7;22074;:16::i;:::-;22066:76;;;;-1:-1:-1;;;22066:76:0;;;;;;;:::i;:::-;22155:21;22179:10;:8;:10::i;:::-;22155:34;;22231:1;22213:7;22207:21;:25;:112;;;;;;;;;;;;;;;;;22272:7;22281:18;:7;:16;:18::i;:::-;22255:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22207:112;22200:119;21967:360;-1:-1:-1;;;21967:360:0:o;19187:157::-;-1:-1:-1;;;;;;19296:40:0;;-1:-1:-1;;;19296:40:0;19187:157;;;:::o;27644:250::-;27740:18;27746:2;27750:7;27740:5;:18::i;:::-;27777:54;27808:1;27812:2;27816:7;27825:5;27777:22;:54::i;:::-;27769:117;;;;-1:-1:-1;;;27769:117:0;;;;;;;:::i;36111:555::-;36221:45;36248:4;36254:2;36258:7;36221:26;:45::i;:::-;-1:-1:-1;;;;;36283:18:0;;36279:187;;36318:40;36350:7;36318:31;:40::i;:::-;36279:187;;;36388:2;-1:-1:-1;;;;;36380:10:0;:4;-1:-1:-1;;;;;36380:10:0;;36376:90;;36407:47;36440:4;36446:7;36407:32;:47::i;:::-;-1:-1:-1;;;;;36480:16:0;;36476:183;;36513:45;36550:7;36513:36;:45::i;:::-;36476:183;;;36586:4;-1:-1:-1;;;;;36580:10:0;:2;-1:-1:-1;;;;;36580:10:0;;36576:83;;36607:40;36635:2;36639:7;36607:27;:40::i;28841:360::-;28901:13;28917:23;28932:7;28917:14;:23::i;:::-;28901:39;;28953:48;28974:5;28989:1;28993:7;28953:20;:48::i;:::-;29042:29;29059:1;29063:7;29042:8;:29::i;:::-;-1:-1:-1;;;;;29084:16:0;;;;;;:9;:16;;;;;:21;;29104:1;;29084:16;:21;;29104:1;;29084:21;:::i;:::-;;;;-1:-1:-1;;29123:16:0;;;;:7;:16;;;;;;29116:23;;-1:-1:-1;;;;;;29116:23:0;;;29157:36;29131:7;;29123:16;-1:-1:-1;;;;;29157:36:0;;;;;29123:16;;29157:36;28841:360;;:::o;8084:422::-;8451:20;8490:8;;;8084:422::o;16630:723::-;16686:13;16907:10;16903:53;;-1:-1:-1;16934:10:0;;;;;;;;;;;;-1:-1:-1;;;16934:10:0;;;;;;16903:53;16981:5;16966:12;17022:78;17029:9;;17022:78;;17055:8;;;;:::i;:::-;;-1:-1:-1;17078:10:0;;-1:-1:-1;17086:2:0;17078:10;;:::i;:::-;;;17022:78;;;17110:19;17142:6;17132:17;;;;;;-1:-1:-1;;;17132:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17132:17:0;;17110:39;;17160:154;17167:10;;17160:154;;17194:11;17204:1;17194:11;;:::i;:::-;;-1:-1:-1;17263:10:0;17271:2;17263:5;:10;:::i;:::-;17250:24;;:2;:24;:::i;:::-;17237:39;;17220:6;17227;17220:14;;;;;;-1:-1:-1;;;17220:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17220:56:0;;;;;;;;-1:-1:-1;17291:11:0;17300:2;17291:11;;:::i;:::-;;;17160:154;;28230:382;-1:-1:-1;;;;;28310:16:0;;28302:61;;;;-1:-1:-1;;;28302:61:0;;;;;;;:::i;:::-;28383:16;28391:7;28383;:16::i;:::-;28382:17;28374:58;;;;-1:-1:-1;;;28374:58:0;;;;;;;:::i;:::-;28445:45;28474:1;28478:2;28482:7;28445:20;:45::i;:::-;-1:-1:-1;;;;;28503:13:0;;;;;;:9;:13;;;;;:18;;28520:1;;28503:13;:18;;28520:1;;28503:18;:::i;:::-;;;;-1:-1:-1;;28532:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28532:21:0;-1:-1:-1;;;;;28532:21:0;;;;;;;;28571:33;;28532:16;;;28571:33;;28532:16;;28571:33;28230:382;;:::o;37389:164::-;37493:10;:17;;37466:24;;;;:15;:24;;;;;:44;;;37521:24;;;;;;;;;;;;37389:164::o;38180:988::-;38446:22;38496:1;38471:22;38488:4;38471:16;:22::i;:::-;:26;;;;:::i;:::-;38508:18;38529:26;;;:17;:26;;;;;;38446:51;;-1:-1:-1;38662:28:0;;;38658:328;;-1:-1:-1;;;;;38729:18:0;;38707:19;38729:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38780:30;;;;;;:44;;;38897:30;;:17;:30;;;;;:43;;;38658:328;-1:-1:-1;39082:26:0;;;;:17;:26;;;;;;;;39075:33;;;-1:-1:-1;;;;;39126:18:0;;;;;:12;:18;;;;;:34;;;;;;;39119:41;38180:988::o;39463:1079::-;39741:10;:17;39716:22;;39741:21;;39761:1;;39741:21;:::i;:::-;39773:18;39794:24;;;:15;:24;;;;;;40167:10;:26;;39716:46;;-1:-1:-1;39794:24:0;;39716:46;;40167:26;;;;-1:-1:-1;;;40167:26:0;;;;;;;;;;;;;;;;;40145:48;;40231:11;40206:10;40217;40206:22;;;;;;-1:-1:-1;;;40206:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40311:28;;;:15;:28;;;;;;;:41;;;40483:24;;;;;40476:31;40518:10;:16;;;;;-1:-1:-1;;;40518:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39463:1079;;;;:::o;36967:221::-;37052:14;37069:20;37086:2;37069:16;:20::i;:::-;-1:-1:-1;;;;;37100:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37145:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36967:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:233;;904:3;897:4;889:6;885:17;881:27;871:2;;926:5;919;912:20;871:2;952:81;1029:3;1020:6;1007:20;1000:4;992:6;988:17;952:81;:::i;1044:198::-;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1205:31;1226:9;1205:31;:::i;1247:274::-;;;1376:2;1364:9;1355:7;1351:23;1347:32;1344:2;;;1397:6;1389;1382:22;1344:2;1425:31;1446:9;1425:31;:::i;:::-;1415:41;;1475:40;1511:2;1500:9;1496:18;1475:40;:::i;:::-;1465:50;;1334:187;;;;;:::o;1526:342::-;;;;1672:2;1660:9;1651:7;1647:23;1643:32;1640:2;;;1693:6;1685;1678:22;1640:2;1721:31;1742:9;1721:31;:::i;:::-;1711:41;;1771:40;1807:2;1796:9;1792:18;1771:40;:::i;:::-;1761:50;;1858:2;1847:9;1843:18;1830:32;1820:42;;1630:238;;;;;:::o;1873:702::-;;;;;2045:3;2033:9;2024:7;2020:23;2016:33;2013:2;;;2067:6;2059;2052:22;2013:2;2095:31;2116:9;2095:31;:::i;:::-;2085:41;;2145:40;2181:2;2170:9;2166:18;2145:40;:::i;:::-;2135:50;;2232:2;2221:9;2217:18;2204:32;2194:42;;2287:2;2276:9;2272:18;2259:32;2314:18;2306:6;2303:30;2300:2;;;2351:6;2343;2336:22;2300:2;2379:22;;2432:4;2424:13;;2420:27;-1:-1:-1;2410:2:1;;2466:6;2458;2451:22;2410:2;2494:75;2561:7;2556:2;2543:16;2538:2;2534;2530:11;2494:75;:::i;:::-;2484:85;;;2003:572;;;;;;;:::o;2580:369::-;;;2706:2;2694:9;2685:7;2681:23;2677:32;2674:2;;;2727:6;2719;2712:22;2674:2;2755:31;2776:9;2755:31;:::i;:::-;2745:41;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2664:285;;;;;:::o;2954:420::-;;;3093:2;3081:9;3072:7;3068:23;3064:32;3061:2;;;3114:6;3106;3099:22;3061:2;3142:31;3163:9;3142:31;:::i;:::-;3132:41;;3224:2;3213:9;3209:18;3196:32;3251:18;3243:6;3240:30;3237:2;;;3288:6;3280;3273:22;3237:2;3316:52;3360:7;3351:6;3340:9;3336:22;3316:52;:::i;:::-;3306:62;;;3051:323;;;;;:::o;3379:266::-;;;3508:2;3496:9;3487:7;3483:23;3479:32;3476:2;;;3529:6;3521;3514:22;3476:2;3557:31;3578:9;3557:31;:::i;:::-;3547:41;3635:2;3620:18;;;;3607:32;;-1:-1:-1;;;3466:179:1:o;3650:257::-;;3761:2;3749:9;3740:7;3736:23;3732:32;3729:2;;;3782:6;3774;3767:22;3729:2;3826:9;3813:23;3845:32;3871:5;3845:32;:::i;3912:261::-;;4034:2;4022:9;4013:7;4009:23;4005:32;4002:2;;;4055:6;4047;4040:22;4002:2;4092:9;4086:16;4111:32;4137:5;4111:32;:::i;4178:344::-;;4300:2;4288:9;4279:7;4275:23;4271:32;4268:2;;;4321:6;4313;4306:22;4268:2;4366:9;4353:23;4399:18;4391:6;4388:30;4385:2;;;4436:6;4428;4421:22;4385:2;4464:52;4508:7;4499:6;4488:9;4484:22;4464:52;:::i;4527:190::-;;4639:2;4627:9;4618:7;4614:23;4610:32;4607:2;;;4660:6;4652;4645:22;4607:2;-1:-1:-1;4688:23:1;;4597:120;-1:-1:-1;4597:120:1:o;4722:259::-;;4803:5;4797:12;4830:6;4825:3;4818:19;4846:63;4902:6;4895:4;4890:3;4886:14;4879:4;4872:5;4868:16;4846:63;:::i;:::-;4963:2;4942:15;-1:-1:-1;;4938:29:1;4929:39;;;;4970:4;4925:50;;4773:208;-1:-1:-1;;4773:208:1:o;4986:470::-;;5203:6;5197:13;5219:53;5265:6;5260:3;5253:4;5245:6;5241:17;5219:53;:::i;:::-;5335:13;;5294:16;;;;5357:57;5335:13;5294:16;5391:4;5379:17;;5357:57;:::i;:::-;5430:20;;5173:283;-1:-1:-1;;;;5173:283:1:o;5461:203::-;-1:-1:-1;;;;;5625:32:1;;;;5607:51;;5595:2;5580:18;;5562:102::o;5669:490::-;-1:-1:-1;;;;;5938:15:1;;;5920:34;;5990:15;;5985:2;5970:18;;5963:43;6037:2;6022:18;;6015:34;;;6085:3;6080:2;6065:18;;6058:31;;;5669:490;;6106:47;;6133:19;;6125:6;6106:47;:::i;:::-;6098:55;5872:287;-1:-1:-1;;;;;;5872:287:1:o;6164:187::-;6329:14;;6322:22;6304:41;;6292:2;6277:18;;6259:92::o;6356:221::-;;6505:2;6494:9;6487:21;6525:46;6567:2;6556:9;6552:18;6544:6;6525:46;:::i;6582:340::-;6784:2;6766:21;;;6823:2;6803:18;;;6796:30;-1:-1:-1;;;6857:2:1;6842:18;;6835:46;6913:2;6898:18;;6756:166::o;6927:344::-;7129:2;7111:21;;;7168:2;7148:18;;;7141:30;-1:-1:-1;;;7202:2:1;7187:18;;7180:50;7262:2;7247:18;;7101:170::o;7276:339::-;7478:2;7460:21;;;7517:2;7497:18;;;7490:30;-1:-1:-1;;;7551:2:1;7536:18;;7529:45;7606:2;7591:18;;7450:165::o;7620:407::-;7822:2;7804:21;;;7861:2;7841:18;;;7834:30;7900:34;7895:2;7880:18;;7873:62;-1:-1:-1;;;7966:2:1;7951:18;;7944:41;8017:3;8002:19;;7794:233::o;8032:414::-;8234:2;8216:21;;;8273:2;8253:18;;;8246:30;8312:34;8307:2;8292:18;;8285:62;-1:-1:-1;;;8378:2:1;8363:18;;8356:48;8436:3;8421:19;;8206:240::o;8451:402::-;8653:2;8635:21;;;8692:2;8672:18;;;8665:30;8731:34;8726:2;8711:18;;8704:62;-1:-1:-1;;;8797:2:1;8782:18;;8775:36;8843:3;8828:19;;8625:228::o;8858:352::-;9060:2;9042:21;;;9099:2;9079:18;;;9072:30;9138;9133:2;9118:18;;9111:58;9201:2;9186:18;;9032:178::o;9215:400::-;9417:2;9399:21;;;9456:2;9436:18;;;9429:30;9495:34;9490:2;9475:18;;9468:62;-1:-1:-1;;;9561:2:1;9546:18;;9539:34;9605:3;9590:19;;9389:226::o;9620:349::-;9822:2;9804:21;;;9861:2;9841:18;;;9834:30;9900:27;9895:2;9880:18;;9873:55;9960:2;9945:18;;9794:175::o;9974:408::-;10176:2;10158:21;;;10215:2;10195:18;;;10188:30;10254:34;10249:2;10234:18;;10227:62;-1:-1:-1;;;10320:2:1;10305:18;;10298:42;10372:3;10357:19;;10148:234::o;10387:340::-;10589:2;10571:21;;;10628:2;10608:18;;;10601:30;-1:-1:-1;;;10662:2:1;10647:18;;10640:46;10718:2;10703:18;;10561:166::o;10732:420::-;10934:2;10916:21;;;10973:2;10953:18;;;10946:30;11012:34;11007:2;10992:18;;10985:62;11083:26;11078:2;11063:18;;11056:54;11142:3;11127:19;;10906:246::o;11157:406::-;11359:2;11341:21;;;11398:2;11378:18;;;11371:30;11437:34;11432:2;11417:18;;11410:62;-1:-1:-1;;;11503:2:1;11488:18;;11481:40;11553:3;11538:19;;11331:232::o;11568:405::-;11770:2;11752:21;;;11809:2;11789:18;;;11782:30;11848:34;11843:2;11828:18;;11821:62;-1:-1:-1;;;11914:2:1;11899:18;;11892:39;11963:3;11948:19;;11742:231::o;11978:410::-;12180:2;12162:21;;;12219:2;12199:18;;;12192:30;12258:34;12253:2;12238:18;;12231:62;-1:-1:-1;;;12324:2:1;12309:18;;12302:44;12378:3;12363:19;;12152:236::o;12393:356::-;12595:2;12577:21;;;12614:18;;;12607:30;12673:34;12668:2;12653:18;;12646:62;12740:2;12725:18;;12567:182::o;12754:413::-;12956:2;12938:21;;;12995:2;12975:18;;;12968:30;13034:34;13029:2;13014:18;;13007:62;-1:-1:-1;;;13100:2:1;13085:18;;13078:47;13157:3;13142:19;;12928:239::o;13172:408::-;13374:2;13356:21;;;13413:2;13393:18;;;13386:30;13452:34;13447:2;13432:18;;13425:62;-1:-1:-1;;;13518:2:1;13503:18;;13496:42;13570:3;13555:19;;13346:234::o;13585:356::-;13787:2;13769:21;;;13806:18;;;13799:30;13865:34;13860:2;13845:18;;13838:62;13932:2;13917:18;;13759:182::o;13946:405::-;14148:2;14130:21;;;14187:2;14167:18;;;14160:30;14226:34;14221:2;14206:18;;14199:62;-1:-1:-1;;;14292:2:1;14277:18;;14270:39;14341:3;14326:19;;14120:231::o;14356:411::-;14558:2;14540:21;;;14597:2;14577:18;;;14570:30;14636:34;14631:2;14616:18;;14609:62;-1:-1:-1;;;14702:2:1;14687:18;;14680:45;14757:3;14742:19;;14530:237::o;14772:397::-;14974:2;14956:21;;;15013:2;14993:18;;;14986:30;15052:34;15047:2;15032:18;;15025:62;-1:-1:-1;;;15118:2:1;15103:18;;15096:31;15159:3;15144:19;;14946:223::o;15174:413::-;15376:2;15358:21;;;15415:2;15395:18;;;15388:30;15454:34;15449:2;15434:18;;15427:62;-1:-1:-1;;;15520:2:1;15505:18;;15498:47;15577:3;15562:19;;15348:239::o;15592:408::-;15794:2;15776:21;;;15833:2;15813:18;;;15806:30;15872:34;15867:2;15852:18;;15845:62;-1:-1:-1;;;15938:2:1;15923:18;;15916:42;15990:3;15975:19;;15766:234::o;16005:412::-;16207:2;16189:21;;;16246:2;16226:18;;;16219:30;16285:34;16280:2;16265:18;;16258:62;-1:-1:-1;;;16351:2:1;16336:18;;16329:46;16407:3;16392:19;;16179:238::o;16422:177::-;16568:25;;;16556:2;16541:18;;16523:76::o;16604:128::-;;16675:1;16671:6;16668:1;16665:13;16662:2;;;16681:18;;:::i;:::-;-1:-1:-1;16717:9:1;;16652:80::o;16737:120::-;;16803:1;16793:2;;16808:18;;:::i;:::-;-1:-1:-1;16842:9:1;;16783:74::o;16862:168::-;;16968:1;16964;16960:6;16956:14;16953:1;16950:21;16945:1;16938:9;16931:17;16927:45;16924:2;;;16975:18;;:::i;:::-;-1:-1:-1;17015:9:1;;16914:116::o;17035:125::-;;17103:1;17100;17097:8;17094:2;;;17108:18;;:::i;:::-;-1:-1:-1;17145:9:1;;17084:76::o;17165:258::-;17237:1;17247:113;17261:6;17258:1;17255:13;17247:113;;;17337:11;;;17331:18;17318:11;;;17311:39;17283:2;17276:10;17247:113;;;17378:6;17375:1;17372:13;17369:2;;;-1:-1:-1;;17413:1:1;17395:16;;17388:27;17218:205::o;17428:380::-;17513:1;17503:12;;17560:1;17550:12;;;17571:2;;17625:4;17617:6;17613:17;17603:27;;17571:2;17678;17670:6;17667:14;17647:18;17644:38;17641:2;;;17724:10;17719:3;17715:20;17712:1;17705:31;17759:4;17756:1;17749:15;17787:4;17784:1;17777:15;17641:2;;17483:325;;;:::o;17813:135::-;;-1:-1:-1;;17873:17:1;;17870:2;;;17893:18;;:::i;:::-;-1:-1:-1;17940:1:1;17929:13;;17860:88::o;17953:112::-;;18011:1;18001:2;;18016:18;;:::i;:::-;-1:-1:-1;18050:9:1;;17991:74::o;18070:127::-;18131:10;18126:3;18122:20;18119:1;18112:31;18162:4;18159:1;18152:15;18186:4;18183:1;18176:15;18202:127;18263:10;18258:3;18254:20;18251:1;18244:31;18294:4;18291:1;18284:15;18318:4;18315:1;18308:15;18334:127;18395:10;18390:3;18386:20;18383:1;18376:31;18426:4;18423:1;18416:15;18450:4;18447:1;18440:15;18466:133;-1:-1:-1;;;;;;18542:32:1;;18532:43;;18522:2;;18589:1;18586;18579:12
Swarm Source
ipfs://81cf4324be0f193e602440c184059437619eb4171ecd1cdcff99cd73a4fdb89d
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.