ERC-721
Overview
Max Total Supply
101 DCKPICS
Holders
34
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 DCKPICSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Duckpics
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-01 */ // File: @openzeppelin/contracts/access/Ownable.sol // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol 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/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } 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/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { 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 { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev 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/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol 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; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: duckpics.sol pragma solidity ^0.8.0; contract Duckpics is ERC721Enumerable, Ownable{ using Address for address; using Strings for uint256; uint256 public constant NFT_PRICE = 30000000000000000; // 0.03 ETH uint256 public constant MAX_NFT_PURCHASE = 20; uint256 public constant RESERVED_TOKENS = 50; uint256 public constant MAX_SUPPLY_MALE = 5000; uint256 public constant MAX_SUPPLY_FEMALE = 10000; bool public salePhase = false; bool public claimPhase = false; bool public claimPhase2 = false; string private _baseTokenURI; mapping (uint256 => string) _tokenURIs; constructor() ERC721("Duckpics","DCKPICS"){ } function toggleSalePhase() public onlyOwner { salePhase = !salePhase; } function toggleClaimPhase() public onlyOwner { claimPhase = !claimPhase; } function toggleClaimPhase2() public onlyOwner { claimPhase2 = !claimPhase2; } function reserveTokens(uint256 numberOfTokens) public onlyOwner { uint256 totalSupply = totalSupply(); require((totalSupply + numberOfTokens) <= RESERVED_TOKENS, "Purchase exceeding max reserve token supply"); for (uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply + i); } } function duckMint(uint256 numberOfTokens) public payable { uint256 totalSupply = totalSupply(); require(salePhase, "Sale not started yet"); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require((totalSupply + numberOfTokens) <= MAX_SUPPLY_MALE, "Purchase exceeding max token supply"); require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint a max of 20 tokens per transaction"); require(NFT_PRICE * numberOfTokens == msg.value, "Sent ether value is incorrect"); for (uint256 i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply + i); } } function duckClaim(uint256 tokenId) public payable { require(claimPhase, "Claim phase not started yet"); require(tokenId < MAX_SUPPLY_MALE, "Invalid token"); require(ownerOf(tokenId) == msg.sender, "You are not the owner of this token"); require(!_exists(tokenId + MAX_SUPPLY_MALE), "Token already claimed"); _safeMint(msg.sender, tokenId + MAX_SUPPLY_MALE); } function duckClaim2(uint256 maleTokenId, uint256 femaleTokenId) public payable { require(claimPhase2, "Claim phase not started yet"); require(maleTokenId < MAX_SUPPLY_MALE, "Invalid token"); require(femaleTokenId < MAX_SUPPLY_FEMALE, "Invalid token"); require(femaleTokenId >= MAX_SUPPLY_MALE, "Invalid token"); require(ownerOf(maleTokenId) == msg.sender, "You are not the owner of this token"); require(ownerOf(femaleTokenId) == msg.sender, "You are not the owner of this token"); require(!_exists(maleTokenId + MAX_SUPPLY_FEMALE), "Token already claimed"); require(!_exists(femaleTokenId + MAX_SUPPLY_FEMALE), "Token already claimed"); _safeMint(msg.sender, maleTokenId + MAX_SUPPLY_FEMALE); _safeMint(msg.sender, femaleTokenId + MAX_SUPPLY_FEMALE); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function withdraw() public payable onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function getBalance() public view onlyOwner returns (uint256){ return address(this).balance; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } // Sets base URI for all tokens, only able to be called by contract owner function setBaseURI(string memory baseURI_) public onlyOwner { _baseTokenURI = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { // Concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseTokenURI, tokenId.toString())); } }
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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_FEMALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_MALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPhase2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"duckClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maleTokenId","type":"uint256"},{"internalType":"uint256","name":"femaleTokenId","type":"uint256"}],"name":"duckClaim2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"duckMint","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":"getBalance","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaimPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaimPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSalePhase","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052600a805462ffffff60a01b191690553480156200002057600080fd5b5060408051808201825260088152674475636b7069637360c01b60208083019182528351808501909452600784526644434b5049435360c81b9084015281519192916200007091600091620000ff565b50805162000086906001906020840190620000ff565b505050620000a36200009d620000a960201b60201c565b620000ad565b620001e2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010d90620001a5565b90600052602060002090601f0160209004810192826200013157600085556200017c565b82601f106200014c57805160ff19168380011785556200017c565b828001600101855582156200017c579182015b828111156200017c5782518255916020019190600101906200015f565b506200018a9291506200018e565b5090565b5b808211156200018a57600081556001016200018f565b600181811c90821680620001ba57607f821691505b60208210811415620001dc57634e487b7160e01b600052602260045260246000fd5b50919050565b61343c80620001f26000396000f3fe6080604052600436106102855760003560e01c806368fc68c711610153578063a25afbe7116100cb578063d031370b1161007f578063e985e9c511610064578063e985e9c5146106d6578063f2fde38b1461072c578063fc461bf21461074c57600080fd5b8063d031370b14610684578063e4f2487a146106a457600080fd5b8063ba013c77116100b0578063ba013c771461063b578063c87b56dd1461064e578063cf3e6faa1461066e57600080fd5b8063a25afbe7146105e8578063b88d4fde1461061b57600080fd5b806380bb94ea116101225780638da5cb5b116101075780638da5cb5b1461058857806395d89b41146105b3578063a22cb465146105c857600080fd5b806380bb94ea1461055e5780638212232e1461057357600080fd5b806368fc68c7146104ff57806370a0823114610514578063715018a6146105345780637ae11e241461054957600080fd5b806323b872dd1161020157806349883167116101b557806355f804b31161019a57806355f804b3146104a45780636352211e146104c4578063676dd563146104e457600080fd5b806349883167146104505780634f6ccce71461048457600080fd5b80633ccfd60b116101e65780633ccfd60b146103fb57806342842e0e14610403578063438b63001461042357600080fd5b806323b872dd146103bb5780632f745c59146103db57600080fd5b8063095ea7b31161025857806311c460481161023d57806311c460481461037e57806312065fe01461039157806318160ddd146103a657600080fd5b8063095ea7b31461034957806310b922d11461036b57600080fd5b806301ffc9a71461028a578063020b39cc146102bf57806306fdde03146102e2578063081812fc14610304575b600080fd5b34801561029657600080fd5b506102aa6102a5366004612efe565b610762565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d4601481565b6040519081526020016102b6565b3480156102ee57600080fd5b506102f76107be565b6040516102b6919061318d565b34801561031057600080fd5b5061032461031f366004612f81565b610850565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b34801561035557600080fd5b50610369610364366004612ed4565b610915565b005b610369610379366004612f9a565b610a6e565b61036961038c366004612f81565b610dff565b34801561039d57600080fd5b506102d461106f565b3480156103b257600080fd5b506008546102d4565b3480156103c757600080fd5b506103696103d6366004612de0565b6110de565b3480156103e757600080fd5b506102d46103f6366004612ed4565b611165565b61036961121a565b34801561040f57600080fd5b5061036961041e366004612de0565b6112b0565b34801561042f57600080fd5b5061044361043e366004612d8b565b6112cb565b6040516102b69190613149565b34801561045c57600080fd5b50600a546102aa90760100000000000000000000000000000000000000000000900460ff1681565b34801561049057600080fd5b506102d461049f366004612f81565b61136d565b3480156104b057600080fd5b506103696104bf366004612f38565b611411565b3480156104d057600080fd5b506103246104df366004612f81565b61148b565b3480156104f057600080fd5b506102d4666a94d74f43000081565b34801561050b57600080fd5b506102d4603281565b34801561052057600080fd5b506102d461052f366004612d8b565b611523565b34801561054057600080fd5b506103696115d7565b34801561055557600080fd5b5061036961164a565b34801561056a57600080fd5b506103696116ff565b34801561057f57600080fd5b506103696117b5565b34801561059457600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610324565b3480156105bf57600080fd5b506102f7611869565b3480156105d457600080fd5b506103696105e3366004612e98565b611878565b3480156105f457600080fd5b50600a546102aa907501000000000000000000000000000000000000000000900460ff1681565b34801561062757600080fd5b50610369610636366004612e1c565b611975565b610369610649366004612f81565b611a03565b34801561065a57600080fd5b506102f7610669366004612f81565b611bc1565b34801561067a57600080fd5b506102d461271081565b34801561069057600080fd5b5061036961069f366004612f81565b611bf5565b3480156106b057600080fd5b50600a546102aa9074010000000000000000000000000000000000000000900460ff1681565b3480156106e257600080fd5b506102aa6106f1366004612dad565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561073857600080fd5b50610369610747366004612d8b565b611d14565b34801561075857600080fd5b506102d461138881565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107b857506107b882611e0d565b92915050565b6060600080546107cd9061324c565b80601f01602080910402602001604051908101604052809291908181526020018280546107f99061324c565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166108ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006109208261148b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b3373ffffffffffffffffffffffffffffffffffffffff821614806109ed57506109ed81336106f1565b610a5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108e3565b610a698383611ef0565b505050565b600a54760100000000000000000000000000000000000000000000900460ff16610ada5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d207068617365206e6f74207374617274656420796574000000000060448201526064016108e3565b6113888210610b2b5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b6127108110610b7c5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b611388811015610bce5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b33610bd88361148b565b73ffffffffffffffffffffffffffffffffffffffff1614610c615760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b33610c6b8261148b565b73ffffffffffffffffffffffffffffffffffffffff1614610cf45760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b610d2d610d03612710846131a0565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b15610d7a5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b610d89610d03612710836131a0565b15610dd65760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b610deb33610de6612710856131a0565b611f90565b610dfb33610de6612710846131a0565b5050565b6000610e0a60085490565b600a5490915074010000000000000000000000000000000000000000900460ff16610e775760405162461bcd60e51b815260206004820152601460248201527f53616c65206e6f7420737461727465642079657400000000000000000000000060448201526064016108e3565b60008211610eed5760405162461bcd60e51b815260206004820152603360248201527f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360448201527f207468616e206f7220657175616c20746f20300000000000000000000000000060648201526084016108e3565b611388610efa83836131a0565b1115610f6e5760405162461bcd60e51b815260206004820152602360248201527f507572636861736520657863656564696e67206d617820746f6b656e2073757060448201527f706c79000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b6014821115610fe55760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79206d696e742061206d6178206f6620323020746f6b656e7360448201527f20706572207472616e73616374696f6e0000000000000000000000000000000060648201526084016108e3565b34610ff783666a94d74f4300006131cc565b146110445760405162461bcd60e51b815260206004820152601d60248201527f53656e742065746865722076616c756520697320696e636f727265637400000060448201526064016108e3565b60005b82811015610a695761105d33610de683856131a0565b80611067816132a0565b915050611047565b600a5460009073ffffffffffffffffffffffffffffffffffffffff1633146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b504790565b6110e83382611faa565b61115a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e3565b610a69838383612100565b600061117083611523565b82106111e45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016108e3565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146112815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b6040514790339082156108fc029083906000818181858888f19350505050158015610dfb573d6000803e3d6000fd5b610a6983838360405180602001604052806000815250611975565b606060006112d883611523565b905060008167ffffffffffffffff8111156112f5576112f56133a9565b60405190808252806020026020018201604052801561131e578160200160208202803683370190505b50905060005b82811015611365576113368582611165565b8282815181106113485761134861337a565b60209081029190910101528061135d816132a0565b915050611324565b509392505050565b600061137860085490565b82106113ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016108e3565b600882815481106113ff576113ff61337a565b90600052602060002001549050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146114785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b8051610dfb90600b906020840190612c35565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108e3565b600073ffffffffffffffffffffffffffffffffffffffff82166115ae5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108e3565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461163e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b611648600061233e565b565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116b15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615909102179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146117665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff81167601000000000000000000000000000000000000000000009182900460ff1615909102179055565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461181c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6060600180546107cd9061324c565b73ffffffffffffffffffffffffffffffffffffffff82163314156118de5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108e3565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61197f3383611faa565b6119f15760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e3565b6119fd848484846123b5565b50505050565b600a547501000000000000000000000000000000000000000000900460ff16611a6e5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d207068617365206e6f74207374617274656420796574000000000060448201526064016108e3565b6113888110611abf5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b33611ac98261148b565b73ffffffffffffffffffffffffffffffffffffffff1614611b525760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b611b61610d03611388836131a0565b15611bae5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b611bbe33610de6611388846131a0565b50565b6060600b611bce8361243e565b604051602001611bdf929190613022565b6040516020818303038152906040529050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611c5c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b6000611c6760085490565b90506032611c7583836131a0565b1115611ce95760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520657863656564696e67206d61782072657365727665207460448201527f6f6b656e20737570706c7900000000000000000000000000000000000000000060648201526084016108e3565b60005b82811015610a6957611d0233610de683856131a0565b80611d0c816132a0565b915050611cec565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611d7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b73ffffffffffffffffffffffffffffffffffffffff8116611e045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e3565b611bbe8161233e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611ea057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107b857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107b8565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611f4a8261148b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610dfb828260405180602001604052806000815250612570565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166120415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108e3565b600061204c8361148b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120bb57508373ffffffffffffffffffffffffffffffffffffffff166120a384610850565b73ffffffffffffffffffffffffffffffffffffffff16145b806120f8575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166121208261148b565b73ffffffffffffffffffffffffffffffffffffffff16146121a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108e3565b73ffffffffffffffffffffffffffffffffffffffff82166122315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e3565b61223c8383836125f9565b612247600082611ef0565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061227d908490613209565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906122b89084906131a0565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123c0848484612100565b6123cc848484846126ff565b6119fd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b60608161247e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156124a85780612492816132a0565b91506124a19050600a836131b8565b9150612482565b60008167ffffffffffffffff8111156124c3576124c36133a9565b6040519080825280601f01601f1916602001820160405280156124ed576020820181803683370190505b5090505b84156120f857612502600183613209565b915061250f600a866132d9565b61251a9060306131a0565b60f81b81838151811061252f5761252f61337a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612569600a866131b8565b94506124f1565b61257a83836128e4565b61258760008484846126ff565b610a695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b73ffffffffffffffffffffffffffffffffffffffff83166126615761265c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61269e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461269e5761269e8382612a7e565b73ffffffffffffffffffffffffffffffffffffffff82166126c257610a6981612b35565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a6957610a698282612be4565b600073ffffffffffffffffffffffffffffffffffffffff84163b156128d9576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612776903390899088908890600401613100565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127de575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526127db91810190612f1b565b60015b61288e573d80801561280c576040519150601f19603f3d011682016040523d82523d6000602084013e612811565b606091505b5080516128865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506120f8565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166129475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108e3565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156129b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108e3565b6129c5600083836125f9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129fb9084906131a0565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a8b84611523565b612a959190613209565b600083815260076020526040902054909150808214612af55773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090612b4790600190613209565b60008381526009602052604081205460088054939450909284908110612b6f57612b6f61337a565b906000526020600020015490508060088381548110612b9057612b9061337a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612bc857612bc861334b565b6001900381819060005260206000200160009055905550505050565b6000612bef83611523565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612c419061324c565b90600052602060002090601f016020900481019282612c635760008555612ca9565b82601f10612c7c57805160ff1916838001178555612ca9565b82800160010185558215612ca9579182015b82811115612ca9578251825591602001919060010190612c8e565b50612cb5929150612cb9565b5090565b5b80821115612cb55760008155600101612cba565b600067ffffffffffffffff80841115612ce957612ce96133a9565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612d2f57612d2f6133a9565b81604052809350858152868686011115612d4857600080fd5b858560208301376000602087830101525050509392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d8657600080fd5b919050565b600060208284031215612d9d57600080fd5b612da682612d62565b9392505050565b60008060408385031215612dc057600080fd5b612dc983612d62565b9150612dd760208401612d62565b90509250929050565b600080600060608486031215612df557600080fd5b612dfe84612d62565b9250612e0c60208501612d62565b9150604084013590509250925092565b60008060008060808587031215612e3257600080fd5b612e3b85612d62565b9350612e4960208601612d62565b925060408501359150606085013567ffffffffffffffff811115612e6c57600080fd5b8501601f81018713612e7d57600080fd5b612e8c87823560208401612cce565b91505092959194509250565b60008060408385031215612eab57600080fd5b612eb483612d62565b915060208301358015158114612ec957600080fd5b809150509250929050565b60008060408385031215612ee757600080fd5b612ef083612d62565b946020939093013593505050565b600060208284031215612f1057600080fd5b8135612da6816133d8565b600060208284031215612f2d57600080fd5b8151612da6816133d8565b600060208284031215612f4a57600080fd5b813567ffffffffffffffff811115612f6157600080fd5b8201601f81018413612f7257600080fd5b6120f884823560208401612cce565b600060208284031215612f9357600080fd5b5035919050565b60008060408385031215612fad57600080fd5b50508035926020909101359150565b60008151808452612fd4816020860160208601613220565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613018818560208601613220565b9290920192915050565b600080845481600182811c91508083168061303e57607f831692505b6020808410821415613077577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561308b57600181146130ba576130e7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506130e7565b60008b81526020902060005b868110156130df5781548b8201529085019083016130c6565b505084890196505b5050505050506130f78185613006565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261313f6080830184612fbc565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561318157835183529284019291840191600101613165565b50909695505050505050565b602081526000612da66020830184612fbc565b600082198211156131b3576131b36132ed565b500190565b6000826131c7576131c761331c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613204576132046132ed565b500290565b60008282101561321b5761321b6132ed565b500390565b60005b8381101561323b578181015183820152602001613223565b838111156119fd5750506000910152565b600181811c9082168061326057607f821691505b6020821081141561329a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132d2576132d26132ed565b5060010190565b6000826132e8576132e861331c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611bbe57600080fdfea2646970667358221220151cb5c86fa8a9a4f492885eafcd1a2d3e92909f06144731e5abcbcfeb2ef3c764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102855760003560e01c806368fc68c711610153578063a25afbe7116100cb578063d031370b1161007f578063e985e9c511610064578063e985e9c5146106d6578063f2fde38b1461072c578063fc461bf21461074c57600080fd5b8063d031370b14610684578063e4f2487a146106a457600080fd5b8063ba013c77116100b0578063ba013c771461063b578063c87b56dd1461064e578063cf3e6faa1461066e57600080fd5b8063a25afbe7146105e8578063b88d4fde1461061b57600080fd5b806380bb94ea116101225780638da5cb5b116101075780638da5cb5b1461058857806395d89b41146105b3578063a22cb465146105c857600080fd5b806380bb94ea1461055e5780638212232e1461057357600080fd5b806368fc68c7146104ff57806370a0823114610514578063715018a6146105345780637ae11e241461054957600080fd5b806323b872dd1161020157806349883167116101b557806355f804b31161019a57806355f804b3146104a45780636352211e146104c4578063676dd563146104e457600080fd5b806349883167146104505780634f6ccce71461048457600080fd5b80633ccfd60b116101e65780633ccfd60b146103fb57806342842e0e14610403578063438b63001461042357600080fd5b806323b872dd146103bb5780632f745c59146103db57600080fd5b8063095ea7b31161025857806311c460481161023d57806311c460481461037e57806312065fe01461039157806318160ddd146103a657600080fd5b8063095ea7b31461034957806310b922d11461036b57600080fd5b806301ffc9a71461028a578063020b39cc146102bf57806306fdde03146102e2578063081812fc14610304575b600080fd5b34801561029657600080fd5b506102aa6102a5366004612efe565b610762565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d4601481565b6040519081526020016102b6565b3480156102ee57600080fd5b506102f76107be565b6040516102b6919061318d565b34801561031057600080fd5b5061032461031f366004612f81565b610850565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b34801561035557600080fd5b50610369610364366004612ed4565b610915565b005b610369610379366004612f9a565b610a6e565b61036961038c366004612f81565b610dff565b34801561039d57600080fd5b506102d461106f565b3480156103b257600080fd5b506008546102d4565b3480156103c757600080fd5b506103696103d6366004612de0565b6110de565b3480156103e757600080fd5b506102d46103f6366004612ed4565b611165565b61036961121a565b34801561040f57600080fd5b5061036961041e366004612de0565b6112b0565b34801561042f57600080fd5b5061044361043e366004612d8b565b6112cb565b6040516102b69190613149565b34801561045c57600080fd5b50600a546102aa90760100000000000000000000000000000000000000000000900460ff1681565b34801561049057600080fd5b506102d461049f366004612f81565b61136d565b3480156104b057600080fd5b506103696104bf366004612f38565b611411565b3480156104d057600080fd5b506103246104df366004612f81565b61148b565b3480156104f057600080fd5b506102d4666a94d74f43000081565b34801561050b57600080fd5b506102d4603281565b34801561052057600080fd5b506102d461052f366004612d8b565b611523565b34801561054057600080fd5b506103696115d7565b34801561055557600080fd5b5061036961164a565b34801561056a57600080fd5b506103696116ff565b34801561057f57600080fd5b506103696117b5565b34801561059457600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610324565b3480156105bf57600080fd5b506102f7611869565b3480156105d457600080fd5b506103696105e3366004612e98565b611878565b3480156105f457600080fd5b50600a546102aa907501000000000000000000000000000000000000000000900460ff1681565b34801561062757600080fd5b50610369610636366004612e1c565b611975565b610369610649366004612f81565b611a03565b34801561065a57600080fd5b506102f7610669366004612f81565b611bc1565b34801561067a57600080fd5b506102d461271081565b34801561069057600080fd5b5061036961069f366004612f81565b611bf5565b3480156106b057600080fd5b50600a546102aa9074010000000000000000000000000000000000000000900460ff1681565b3480156106e257600080fd5b506102aa6106f1366004612dad565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561073857600080fd5b50610369610747366004612d8b565b611d14565b34801561075857600080fd5b506102d461138881565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107b857506107b882611e0d565b92915050565b6060600080546107cd9061324c565b80601f01602080910402602001604051908101604052809291908181526020018280546107f99061324c565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166108ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006109208261148b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b3373ffffffffffffffffffffffffffffffffffffffff821614806109ed57506109ed81336106f1565b610a5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108e3565b610a698383611ef0565b505050565b600a54760100000000000000000000000000000000000000000000900460ff16610ada5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d207068617365206e6f74207374617274656420796574000000000060448201526064016108e3565b6113888210610b2b5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b6127108110610b7c5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b611388811015610bce5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b33610bd88361148b565b73ffffffffffffffffffffffffffffffffffffffff1614610c615760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b33610c6b8261148b565b73ffffffffffffffffffffffffffffffffffffffff1614610cf45760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b610d2d610d03612710846131a0565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b15610d7a5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b610d89610d03612710836131a0565b15610dd65760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b610deb33610de6612710856131a0565b611f90565b610dfb33610de6612710846131a0565b5050565b6000610e0a60085490565b600a5490915074010000000000000000000000000000000000000000900460ff16610e775760405162461bcd60e51b815260206004820152601460248201527f53616c65206e6f7420737461727465642079657400000000000000000000000060448201526064016108e3565b60008211610eed5760405162461bcd60e51b815260206004820152603360248201527f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360448201527f207468616e206f7220657175616c20746f20300000000000000000000000000060648201526084016108e3565b611388610efa83836131a0565b1115610f6e5760405162461bcd60e51b815260206004820152602360248201527f507572636861736520657863656564696e67206d617820746f6b656e2073757060448201527f706c79000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b6014821115610fe55760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79206d696e742061206d6178206f6620323020746f6b656e7360448201527f20706572207472616e73616374696f6e0000000000000000000000000000000060648201526084016108e3565b34610ff783666a94d74f4300006131cc565b146110445760405162461bcd60e51b815260206004820152601d60248201527f53656e742065746865722076616c756520697320696e636f727265637400000060448201526064016108e3565b60005b82811015610a695761105d33610de683856131a0565b80611067816132a0565b915050611047565b600a5460009073ffffffffffffffffffffffffffffffffffffffff1633146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b504790565b6110e83382611faa565b61115a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e3565b610a69838383612100565b600061117083611523565b82106111e45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016108e3565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146112815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b6040514790339082156108fc029083906000818181858888f19350505050158015610dfb573d6000803e3d6000fd5b610a6983838360405180602001604052806000815250611975565b606060006112d883611523565b905060008167ffffffffffffffff8111156112f5576112f56133a9565b60405190808252806020026020018201604052801561131e578160200160208202803683370190505b50905060005b82811015611365576113368582611165565b8282815181106113485761134861337a565b60209081029190910101528061135d816132a0565b915050611324565b509392505050565b600061137860085490565b82106113ec5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016108e3565b600882815481106113ff576113ff61337a565b90600052602060002001549050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146114785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b8051610dfb90600b906020840190612c35565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108e3565b600073ffffffffffffffffffffffffffffffffffffffff82166115ae5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108e3565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461163e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b611648600061233e565b565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116b15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615909102179055565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146117665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff81167601000000000000000000000000000000000000000000009182900460ff1615909102179055565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461181c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b6060600180546107cd9061324c565b73ffffffffffffffffffffffffffffffffffffffff82163314156118de5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108e3565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61197f3383611faa565b6119f15760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108e3565b6119fd848484846123b5565b50505050565b600a547501000000000000000000000000000000000000000000900460ff16611a6e5760405162461bcd60e51b815260206004820152601b60248201527f436c61696d207068617365206e6f74207374617274656420796574000000000060448201526064016108e3565b6113888110611abf5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016108e3565b33611ac98261148b565b73ffffffffffffffffffffffffffffffffffffffff1614611b525760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201527f6b656e000000000000000000000000000000000000000000000000000000000060648201526084016108e3565b611b61610d03611388836131a0565b15611bae5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c726561647920636c61696d6564000000000000000000000060448201526064016108e3565b611bbe33610de6611388846131a0565b50565b6060600b611bce8361243e565b604051602001611bdf929190613022565b6040516020818303038152906040529050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611c5c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b6000611c6760085490565b90506032611c7583836131a0565b1115611ce95760405162461bcd60e51b815260206004820152602b60248201527f507572636861736520657863656564696e67206d61782072657365727665207460448201527f6f6b656e20737570706c7900000000000000000000000000000000000000000060648201526084016108e3565b60005b82811015610a6957611d0233610de683856131a0565b80611d0c816132a0565b915050611cec565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611d7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e3565b73ffffffffffffffffffffffffffffffffffffffff8116611e045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e3565b611bbe8161233e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611ea057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107b857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107b8565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611f4a8261148b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610dfb828260405180602001604052806000815250612570565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166120415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108e3565b600061204c8361148b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120bb57508373ffffffffffffffffffffffffffffffffffffffff166120a384610850565b73ffffffffffffffffffffffffffffffffffffffff16145b806120f8575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166121208261148b565b73ffffffffffffffffffffffffffffffffffffffff16146121a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108e3565b73ffffffffffffffffffffffffffffffffffffffff82166122315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e3565b61223c8383836125f9565b612247600082611ef0565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061227d908490613209565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906122b89084906131a0565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123c0848484612100565b6123cc848484846126ff565b6119fd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b60608161247e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156124a85780612492816132a0565b91506124a19050600a836131b8565b9150612482565b60008167ffffffffffffffff8111156124c3576124c36133a9565b6040519080825280601f01601f1916602001820160405280156124ed576020820181803683370190505b5090505b84156120f857612502600183613209565b915061250f600a866132d9565b61251a9060306131a0565b60f81b81838151811061252f5761252f61337a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612569600a866131b8565b94506124f1565b61257a83836128e4565b61258760008484846126ff565b610a695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b73ffffffffffffffffffffffffffffffffffffffff83166126615761265c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61269e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461269e5761269e8382612a7e565b73ffffffffffffffffffffffffffffffffffffffff82166126c257610a6981612b35565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a6957610a698282612be4565b600073ffffffffffffffffffffffffffffffffffffffff84163b156128d9576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612776903390899088908890600401613100565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127de575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526127db91810190612f1b565b60015b61288e573d80801561280c576040519150601f19603f3d011682016040523d82523d6000602084013e612811565b606091505b5080516128865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108e3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506120f8565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166129475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108e3565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156129b95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108e3565b6129c5600083836125f9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129fb9084906131a0565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a8b84611523565b612a959190613209565b600083815260076020526040902054909150808214612af55773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090612b4790600190613209565b60008381526009602052604081205460088054939450909284908110612b6f57612b6f61337a565b906000526020600020015490508060088381548110612b9057612b9061337a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612bc857612bc861334b565b6001900381819060005260206000200160009055905550505050565b6000612bef83611523565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612c419061324c565b90600052602060002090601f016020900481019282612c635760008555612ca9565b82601f10612c7c57805160ff1916838001178555612ca9565b82800160010185558215612ca9579182015b82811115612ca9578251825591602001919060010190612c8e565b50612cb5929150612cb9565b5090565b5b80821115612cb55760008155600101612cba565b600067ffffffffffffffff80841115612ce957612ce96133a9565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612d2f57612d2f6133a9565b81604052809350858152868686011115612d4857600080fd5b858560208301376000602087830101525050509392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d8657600080fd5b919050565b600060208284031215612d9d57600080fd5b612da682612d62565b9392505050565b60008060408385031215612dc057600080fd5b612dc983612d62565b9150612dd760208401612d62565b90509250929050565b600080600060608486031215612df557600080fd5b612dfe84612d62565b9250612e0c60208501612d62565b9150604084013590509250925092565b60008060008060808587031215612e3257600080fd5b612e3b85612d62565b9350612e4960208601612d62565b925060408501359150606085013567ffffffffffffffff811115612e6c57600080fd5b8501601f81018713612e7d57600080fd5b612e8c87823560208401612cce565b91505092959194509250565b60008060408385031215612eab57600080fd5b612eb483612d62565b915060208301358015158114612ec957600080fd5b809150509250929050565b60008060408385031215612ee757600080fd5b612ef083612d62565b946020939093013593505050565b600060208284031215612f1057600080fd5b8135612da6816133d8565b600060208284031215612f2d57600080fd5b8151612da6816133d8565b600060208284031215612f4a57600080fd5b813567ffffffffffffffff811115612f6157600080fd5b8201601f81018413612f7257600080fd5b6120f884823560208401612cce565b600060208284031215612f9357600080fd5b5035919050565b60008060408385031215612fad57600080fd5b50508035926020909101359150565b60008151808452612fd4816020860160208601613220565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151613018818560208601613220565b9290920192915050565b600080845481600182811c91508083168061303e57607f831692505b6020808410821415613077577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561308b57600181146130ba576130e7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506130e7565b60008b81526020902060005b868110156130df5781548b8201529085019083016130c6565b505084890196505b5050505050506130f78185613006565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261313f6080830184612fbc565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561318157835183529284019291840191600101613165565b50909695505050505050565b602081526000612da66020830184612fbc565b600082198211156131b3576131b36132ed565b500190565b6000826131c7576131c761331c565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613204576132046132ed565b500290565b60008282101561321b5761321b6132ed565b500390565b60005b8381101561323b578181015183820152602001613223565b838111156119fd5750506000910152565b600181811c9082168061326057607f821691505b6020821081141561329a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132d2576132d26132ed565b5060010190565b6000826132e8576132e861331c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611bbe57600080fdfea2646970667358221220151cb5c86fa8a9a4f492885eafcd1a2d3e92909f06144731e5abcbcfeb2ef3c764736f6c63430008070033
Deployed Bytecode Sourcemap
42726:4515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23409:224;;;;;;;;;;-1:-1:-1;23409:224:0;;;;;:::i;:::-;;:::i;:::-;;;7732:14:1;;7725:22;7707:41;;7695:2;7680:18;23409:224:0;;;;;;;;42921:45;;;;;;;;;;;;42964:2;42921:45;;;;;18732:25:1;;;18720:2;18705:18;42921:45:0;18586:177:1;11413:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12972:221::-;;;;;;;;;;-1:-1:-1;12972:221:0;;;;;:::i;:::-;;:::i;:::-;;;6359:42:1;6347:55;;;6329:74;;6317:2;6302:18;12972:221:0;6183:226:1;12495:411:0;;;;;;;;;;-1:-1:-1;12495:411:0;;;;;:::i;:::-;;:::i;:::-;;45190:863;;;;;;:::i;:::-;;:::i;44057:684::-;;;;;;:::i;:::-;;:::i;46584:108::-;;;;;;;;;;;;;:::i;24049:113::-;;;;;;;;;;-1:-1:-1;24137:10:0;:17;24049:113;;13862:339;;;;;;;;;;-1:-1:-1;13862:339:0;;;;;:::i;:::-;;:::i;23717:256::-;;;;;;;;;;-1:-1:-1;23717:256:0;;;;;:::i;:::-;;:::i;46424:148::-;;;:::i;14272:185::-;;;;;;;;;;-1:-1:-1;14272:185:0;;;;;:::i;:::-;;:::i;46064:348::-;;;;;;;;;;-1:-1:-1;46064:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43212:31::-;;;;;;;;;;-1:-1:-1;43212:31:0;;;;;;;;;;;24239:233;;;;;;;;;;-1:-1:-1;24239:233:0;;;;;:::i;:::-;;:::i;46901:104::-;;;;;;;;;;-1:-1:-1;46901:104:0;;;;;:::i;:::-;;:::i;11107:239::-;;;;;;;;;;-1:-1:-1;11107:239:0;;;;;:::i;:::-;;:::i;42849:53::-;;;;;;;;;;;;42885:17;42849:53;;42973:44;;;;;;;;;;;;43015:2;42973:44;;10837:208;;;;;;;;;;-1:-1:-1;10837:208:0;;;;;:::i;:::-;;:::i;42045:94::-;;;;;;;;;;;;;:::i;43496:88::-;;;;;;;;;;;;;:::i;43596:91::-;;;;;;;;;;;;;:::i;43399:85::-;;;;;;;;;;;;;:::i;41394:87::-;;;;;;;;;;-1:-1:-1;41467:6:0;;;;41394:87;;11582:104;;;;;;;;;;;;;:::i;13265:295::-;;;;;;;;;;-1:-1:-1;13265:295:0;;;;;:::i;:::-;;:::i;43175:30::-;;;;;;;;;;-1:-1:-1;43175:30:0;;;;;;;;;;;14528:328;;;;;;;;;;-1:-1:-1;14528:328:0;;;;;:::i;:::-;;:::i;44753:425::-;;;;;;:::i;:::-;;:::i;47013:225::-;;;;;;;;;;-1:-1:-1;47013:225:0;;;;;:::i;:::-;;:::i;43077:49::-;;;;;;;;;;;;43121:5;43077:49;;43695:354;;;;;;;;;;-1:-1:-1;43695:354:0;;;;;:::i;:::-;;:::i;43139:29::-;;;;;;;;;;-1:-1:-1;43139:29:0;;;;;;;;;;;13631:164;;;;;;;;;;-1:-1:-1;13631:164:0;;;;;:::i;:::-;13752:25;;;;13728:4;13752:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13631:164;42294:192;;;;;;;;;;-1:-1:-1;42294:192:0;;;;;:::i;:::-;;:::i;43024:46::-;;;;;;;;;;;;43066:4;43024:46;;23409:224;23511:4;23535:50;;;23550:35;23535:50;;:90;;;23589:36;23613:11;23589:23;:36::i;:::-;23528:97;23409:224;-1:-1:-1;;23409:224:0:o;11413:100::-;11467:13;11500:5;11493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11413:100;:::o;12972:221::-;13048:7;16455:16;;;:7;:16;;;;;;:30;:16;13068:73;;;;-1:-1:-1;;;13068:73:0;;15199:2:1;13068:73:0;;;15181:21:1;15238:2;15218:18;;;15211:30;15277:34;15257:18;;;15250:62;15348:14;15328:18;;;15321:42;15380:19;;13068:73:0;;;;;;;;;-1:-1:-1;13161:24:0;;;;:15;:24;;;;;;;;;12972:221::o;12495:411::-;12576:13;12592:23;12607:7;12592:14;:23::i;:::-;12576:39;;12640:5;12634:11;;:2;:11;;;;12626:57;;;;-1:-1:-1;;;12626:57:0;;16795:2:1;12626:57:0;;;16777:21:1;16834:2;16814:18;;;16807:30;16873:34;16853:18;;;16846:62;16944:3;16924:18;;;16917:31;16965:19;;12626:57:0;16593:397:1;12626:57:0;790:10;12718:21;;;;;:62;;-1:-1:-1;12743:37:0;12760:5;790:10;13631:164;:::i;12743:37::-;12696:168;;;;-1:-1:-1;;;12696:168:0;;12817:2:1;12696:168:0;;;12799:21:1;12856:2;12836:18;;;12829:30;12895:34;12875:18;;;12868:62;12966:26;12946:18;;;12939:54;13010:19;;12696:168:0;12615:420:1;12696:168:0;12877:21;12886:2;12890:7;12877:8;:21::i;:::-;12565:341;12495:411;;:::o;45190:863::-;45293:11;;;;;;;45285:51;;;;-1:-1:-1;;;45285:51:0;;18432:2:1;45285:51:0;;;18414:21:1;18471:2;18451:18;;;18444:30;18510:29;18490:18;;;18483:57;18557:18;;45285:51:0;18230:351:1;45285:51:0;43066:4;45355:11;:29;45347:55;;;;-1:-1:-1;;;45347:55:0;;12475:2:1;45347:55:0;;;12457:21:1;12514:2;12494:18;;;12487:30;12553:15;12533:18;;;12526:43;12586:18;;45347:55:0;12273:337:1;45347:55:0;43121:5;45421:13;:33;45413:59;;;;-1:-1:-1;;;45413:59:0;;12475:2:1;45413:59:0;;;12457:21:1;12514:2;12494:18;;;12487:30;12553:15;12533:18;;;12526:43;12586:18;;45413:59:0;12273:337:1;45413:59:0;43066:4;45491:13;:32;;45483:58;;;;-1:-1:-1;;;45483:58:0;;12475:2:1;45483:58:0;;;12457:21:1;12514:2;12494:18;;;12487:30;12553:15;12533:18;;;12526:43;12586:18;;45483:58:0;12273:337:1;45483:58:0;45584:10;45560:20;45568:11;45560:7;:20::i;:::-;:34;;;45552:82;;;;-1:-1:-1;;;45552:82:0;;18028:2:1;45552:82:0;;;18010:21:1;18067:2;18047:18;;;18040:30;18106:34;18086:18;;;18079:62;18177:5;18157:18;;;18150:33;18200:19;;45552:82:0;17826:399:1;45552:82:0;45679:10;45653:22;45661:13;45653:7;:22::i;:::-;:36;;;45645:84;;;;-1:-1:-1;;;45645:84:0;;18028:2:1;45645:84:0;;;18010:21:1;18067:2;18047:18;;;18040:30;18106:34;18086:18;;;18079:62;18177:5;18157:18;;;18150:33;18200:19;;45645:84:0;17826:399:1;45645:84:0;45749:40;45757:31;43121:5;45757:11;:31;:::i;:::-;16431:4;16455:16;;;:7;:16;;;;;;:30;:16;:30;;;16366:127;45749:40;45748:41;45740:75;;;;-1:-1:-1;;;45740:75:0;;11712:2:1;45740:75:0;;;11694:21:1;11751:2;11731:18;;;11724:30;11790:23;11770:18;;;11763:51;11831:18;;45740:75:0;11510:345:1;45740:75:0;45835:42;45843:33;43121:5;45843:13;:33;:::i;45835:42::-;45834:43;45826:77;;;;-1:-1:-1;;;45826:77:0;;11712:2:1;45826:77:0;;;11694:21:1;11751:2;11731:18;;;11724:30;11790:23;11770:18;;;11763:51;11831:18;;45826:77:0;11510:345:1;45826:77:0;45924:54;45934:10;45946:31;43121:5;45946:11;:31;:::i;:::-;45924:9;:54::i;:::-;45989:56;45999:10;46011:33;43121:5;46011:13;:33;:::i;45989:56::-;45190:863;;:::o;44057:684::-;44125:19;44147:13;24137:10;:17;;24049:113;44147:13;44179:9;;44125:35;;-1:-1:-1;44179:9:0;;;;;44171:42;;;;-1:-1:-1;;;44171:42:0;;8185:2:1;44171:42:0;;;8167:21:1;8224:2;8204:18;;;8197:30;8263:22;8243:18;;;8236:50;8303:18;;44171:42:0;7983:344:1;44171:42:0;44249:1;44232:14;:18;44224:82;;;;-1:-1:-1;;;44224:82:0;;8534:2:1;44224:82:0;;;8516:21:1;8573:2;8553:18;;;8546:30;8612:34;8592:18;;;8585:62;8683:21;8663:18;;;8656:49;8722:19;;44224:82:0;8332:415:1;44224:82:0;43066:4;44326:28;44340:14;44326:11;:28;:::i;:::-;44325:49;;44317:97;;;;-1:-1:-1;;;44317:97:0;;10549:2:1;44317:97:0;;;10531:21:1;10588:2;10568:18;;;10561:30;10627:34;10607:18;;;10600:62;10698:5;10678:18;;;10671:33;10721:19;;44317:97:0;10347:399:1;44317:97:0;42964:2;44433:14;:34;;44425:94;;;;-1:-1:-1;;;44425:94:0;;14421:2:1;44425:94:0;;;14403:21:1;14460:2;14440:18;;;14433:30;14499:34;14479:18;;;14472:62;14570:18;14550;;;14543:46;14606:19;;44425:94:0;14219:412:1;44425:94:0;44568:9;44538:26;44550:14;42885:17;44538:26;:::i;:::-;:39;44530:81;;;;-1:-1:-1;;;44530:81:0;;14063:2:1;44530:81:0;;;14045:21:1;14102:2;14082:18;;;14075:30;14141:31;14121:18;;;14114:59;14190:18;;44530:81:0;13861:353:1;44530:81:0;44629:9;44624:110;44648:14;44644:1;:18;44624:110;;;44684:38;44694:10;44706:15;44720:1;44706:11;:15;:::i;44684:38::-;44664:3;;;;:::i;:::-;;;;44624:110;;46584:108;41467:6;;46637:7;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;-1:-1:-1;46663:21:0::1;46584:108:::0;:::o;13862:339::-;14057:41;790:10;14090:7;14057:18;:41::i;:::-;14049:103;;;;-1:-1:-1;;;14049:103:0;;17197:2:1;14049:103:0;;;17179:21:1;17236:2;17216:18;;;17209:30;17275:34;17255:18;;;17248:62;17346:19;17326:18;;;17319:47;17383:19;;14049:103:0;16995:413:1;14049:103:0;14165:28;14175:4;14181:2;14185:7;14165:9;:28::i;23717:256::-;23814:7;23850:23;23867:5;23850:16;:23::i;:::-;23842:5;:31;23834:87;;;;-1:-1:-1;;;23834:87:0;;8954:2:1;23834:87:0;;;8936:21:1;8993:2;8973:18;;;8966:30;9032:34;9012:18;;;9005:62;9103:13;9083:18;;;9076:41;9134:19;;23834:87:0;8752:407:1;23834:87:0;-1:-1:-1;23939:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;23717:256::o;46424:148::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;46527:37:::1;::::0;46495:21:::1;::::0;46535:10:::1;::::0;46527:37;::::1;;;::::0;46495:21;;46480:12:::1;46527:37:::0;46480:12;46527:37;46495:21;46535:10;46527:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;14272:185:::0;14410:39;14427:4;14433:2;14437:7;14410:39;;;;;;;;;;;;:16;:39::i;46064:348::-;46124:16;46158:18;46179:17;46189:6;46179:9;:17::i;:::-;46158:38;;46207:25;46249:10;46235:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46235:25:0;;46207:53;;46276:9;46271:108;46291:10;46287:1;:14;46271:108;;;46337:30;46357:6;46365:1;46337:19;:30::i;:::-;46323:8;46332:1;46323:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;46303:3;;;;:::i;:::-;;;;46271:108;;;-1:-1:-1;46396:8:0;46064:348;-1:-1:-1;;;46064:348:0:o;24239:233::-;24314:7;24350:30;24137:10;:17;;24049:113;24350:30;24342:5;:38;24334:95;;;;-1:-1:-1;;;24334:95:0;;17615:2:1;24334:95:0;;;17597:21:1;17654:2;17634:18;;;17627:30;17693:34;17673:18;;;17666:62;17764:14;17744:18;;;17737:42;17796:19;;24334:95:0;17413:408:1;24334:95:0;24447:10;24458:5;24447:17;;;;;;;;:::i;:::-;;;;;;;;;24440:24;;24239:233;;;:::o;46901:104::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;46973:24;;::::1;::::0;:13:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;11107:239::-:0;11179:7;11215:16;;;:7;:16;;;;;;;;11250:19;11242:73;;;;-1:-1:-1;;;11242:73:0;;13653:2:1;11242:73:0;;;13635:21:1;13692:2;13672:18;;;13665:30;13731:34;13711:18;;;13704:62;13802:11;13782:18;;;13775:39;13831:19;;11242:73:0;13451:405:1;10837:208:0;10909:7;10937:19;;;10929:74;;;;-1:-1:-1;;;10929:74:0;;13242:2:1;10929:74:0;;;13224:21:1;13281:2;13261:18;;;13254:30;13320:34;13300:18;;;13293:62;13391:12;13371:18;;;13364:40;13421:19;;10929:74:0;13040:406:1;10929:74:0;-1:-1:-1;11021:16:0;;;;;;:9;:16;;;;;;;10837:208::o;42045:94::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;42110:21:::1;42128:1;42110:9;:21::i;:::-;42045:94::o:0;43496:88::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;43566:10:::1;::::0;;43552:24;;::::1;43566:10:::0;;;;::::1;;;43565:11;43552:24:::0;;::::1;;::::0;;43496:88::o;43596:91::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;43668:11:::1;::::0;;43653:26;;::::1;43668:11:::0;;;;::::1;;;43667:12;43653:26:::0;;::::1;;::::0;;43596:91::o;43399:85::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;43467:9:::1;::::0;;43454:22;;::::1;43467:9:::0;;;;::::1;;;43466:10;43454:22:::0;;::::1;;::::0;;43399:85::o;11582:104::-;11638:13;11671:7;11664:14;;;;;:::i;13265:295::-;13368:24;;;790:10;13368:24;;13360:62;;;;-1:-1:-1;;;13360:62:0;;11358:2:1;13360:62:0;;;11340:21:1;11397:2;11377:18;;;11370:30;11436:27;11416:18;;;11409:55;11481:18;;13360:62:0;11156:349:1;13360:62:0;790:10;13435:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;13504:48;;7707:41:1;;;13435:42:0;;790:10;13504:48;;7680:18:1;13504:48:0;;;;;;;13265:295;;:::o;14528:328::-;14703:41;790:10;14736:7;14703:18;:41::i;:::-;14695:103;;;;-1:-1:-1;;;14695:103:0;;17197:2:1;14695:103:0;;;17179:21:1;17236:2;17216:18;;;17209:30;17275:34;17255:18;;;17248:62;17346:19;17326:18;;;17319:47;17383:19;;14695:103:0;16995:413:1;14695:103:0;14809:39;14823:4;14829:2;14833:7;14842:5;14809:13;:39::i;:::-;14528:328;;;;:::o;44753:425::-;44828:10;;;;;;;44820:50;;;;-1:-1:-1;;;44820:50:0;;18432:2:1;44820:50:0;;;18414:21:1;18471:2;18451:18;;;18444:30;18510:29;18490:18;;;18483:57;18557:18;;44820:50:0;18230:351:1;44820:50:0;43066:4;44889:7;:25;44881:51;;;;-1:-1:-1;;;44881:51:0;;12475:2:1;44881:51:0;;;12457:21:1;12514:2;12494:18;;;12487:30;12553:15;12533:18;;;12526:43;12586:18;;44881:51:0;12273:337:1;44881:51:0;44971:10;44951:16;44959:7;44951;:16::i;:::-;:30;;;44943:78;;;;-1:-1:-1;;;44943:78:0;;18028:2:1;44943:78:0;;;18010:21:1;18067:2;18047:18;;;18040:30;18106:34;18086:18;;;18079:62;18177:5;18157:18;;;18150:33;18200:19;;44943:78:0;17826:399:1;44943:78:0;45041:34;45049:25;43066:4;45049:7;:25;:::i;45041:34::-;45040:35;45032:69;;;;-1:-1:-1;;;45032:69:0;;11712:2:1;45032:69:0;;;11694:21:1;11751:2;11731:18;;;11724:30;11790:23;11770:18;;;11763:51;11831:18;;45032:69:0;11510:345:1;45032:69:0;45122:48;45132:10;45144:25;43066:4;45144:7;:25;:::i;45122:48::-;44753:425;:::o;47013:225::-;47086:13;47195;47210:18;:7;:16;:18::i;:::-;47178:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47164:66;;47013:225;;;:::o;43695:354::-;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;43770:19:::1;43792:13;24137:10:::0;:17;;24049:113;43792:13:::1;43770:35:::0;-1:-1:-1;43015:2:0::1;43825:28;43839:14:::0;43770:35;43825:28:::1;:::i;:::-;43824:49;;43816:105;;;::::0;-1:-1:-1;;;43816:105:0;;16383:2:1;43816:105:0::1;::::0;::::1;16365:21:1::0;16422:2;16402:18;;;16395:30;16461:34;16441:18;;;16434:62;16532:13;16512:18;;;16505:41;16563:19;;43816:105:0::1;16181:407:1::0;43816:105:0::1;43937:9;43932:110;43956:14;43952:1;:18;43932:110;;;43992:38;44002:10;44014:15;44028:1:::0;44014:11;:15:::1;:::i;43992:38::-;43972:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43932:110;;42294:192:::0;41467:6;;41614:23;41467:6;790:10;41614:23;41606:68;;;;-1:-1:-1;;;41606:68:0;;15612:2:1;41606:68:0;;;15594:21:1;;;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;15742:18;;41606:68:0;15410:356:1;41606:68:0;42383:22:::1;::::0;::::1;42375:73;;;::::0;-1:-1:-1;;;42375:73:0;;9785:2:1;42375:73:0::1;::::0;::::1;9767:21:1::0;9824:2;9804:18;;;9797:30;9863:34;9843:18;;;9836:62;9934:8;9914:18;;;9907:36;9960:19;;42375:73:0::1;9583:402:1::0;42375:73:0::1;42459:19;42469:8;42459:9;:19::i;10468:305::-:0;10570:4;10607:40;;;10622:25;10607:40;;:105;;-1:-1:-1;10664:48:0;;;10679:33;10664:48;10607:105;:158;;;-1:-1:-1;9114:25:0;9099:40;;;;10729:36;8990:157;20348:174;20423:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;20477:23;20423:24;20477:14;:23::i;:::-;20468:46;;;;;;;;;;;;20348:174;;:::o;17350:110::-;17426:26;17436:2;17440:7;17426:26;;;;;;;;;;;;:9;:26::i;16660:348::-;16753:4;16455:16;;;:7;:16;;;;;;:30;:16;16770:73;;;;-1:-1:-1;;;16770:73:0;;12062:2:1;16770:73:0;;;12044:21:1;12101:2;12081:18;;;12074:30;12140:34;12120:18;;;12113:62;12211:14;12191:18;;;12184:42;12243:19;;16770:73:0;11860:408:1;16770:73:0;16854:13;16870:23;16885:7;16870:14;:23::i;:::-;16854:39;;16923:5;16912:16;;:7;:16;;;:51;;;;16956:7;16932:31;;:20;16944:7;16932:11;:20::i;:::-;:31;;;16912:51;:87;;;-1:-1:-1;13752:25:0;;;;13728:4;13752:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;16967:32;16904:96;16660:348;-1:-1:-1;;;;16660:348:0:o;19652:578::-;19811:4;19784:31;;:23;19799:7;19784:14;:23::i;:::-;:31;;;19776:85;;;;-1:-1:-1;;;19776:85:0;;15973:2:1;19776:85:0;;;15955:21:1;16012:2;15992:18;;;15985:30;16051:34;16031:18;;;16024:62;16122:11;16102:18;;;16095:39;16151:19;;19776:85:0;15771:405:1;19776:85:0;19880:16;;;19872:65;;;;-1:-1:-1;;;19872:65:0;;10953:2:1;19872:65:0;;;10935:21:1;10992:2;10972:18;;;10965:30;11031:34;11011:18;;;11004:62;11102:6;11082:18;;;11075:34;11126:19;;19872:65:0;10751:400:1;19872:65:0;19950:39;19971:4;19977:2;19981:7;19950:20;:39::i;:::-;20054:29;20071:1;20075:7;20054:8;:29::i;:::-;20096:15;;;;;;;:9;:15;;;;;:20;;20115:1;;20096:15;:20;;20115:1;;20096:20;:::i;:::-;;;;-1:-1:-1;;20127:13:0;;;;;;;:9;:13;;;;;:18;;20144:1;;20127:13;:18;;20144:1;;20127:18;:::i;:::-;;;;-1:-1:-1;;20156:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;20195:27;;20156:16;;20195:27;;;;;;;19652:578;;;:::o;42494:173::-;42569:6;;;;42586:17;;;;;;;;;;;42619:40;;42569:6;;;42586:17;42569:6;;42619:40;;42550:16;;42619:40;42539:128;42494:173;:::o;15738:315::-;15895:28;15905:4;15911:2;15915:7;15895:9;:28::i;:::-;15942:48;15965:4;15971:2;15975:7;15984:5;15942:22;:48::i;:::-;15934:111;;;;-1:-1:-1;;;15934:111:0;;9366:2:1;15934:111:0;;;9348:21:1;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:20;9495:18;;;9488:48;9553:19;;15934:111:0;9164:414:1;29864:723:0;29920:13;30141:10;30137:53;;-1:-1:-1;;30168:10:0;;;;;;;;;;;;;;;;;;29864:723::o;30137:53::-;30215:5;30200:12;30256:78;30263:9;;30256:78;;30289:8;;;;:::i;:::-;;-1:-1:-1;30312:10:0;;-1:-1:-1;30320:2:0;30312:10;;:::i;:::-;;;30256:78;;;30344:19;30376:6;30366:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30366:17:0;;30344:39;;30394:154;30401:10;;30394:154;;30428:11;30438:1;30428:11;;:::i;:::-;;-1:-1:-1;30497:10:0;30505:2;30497:5;:10;:::i;:::-;30484:24;;:2;:24;:::i;:::-;30471:39;;30454:6;30461;30454:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;30525:11:0;30534:2;30525:11;;:::i;:::-;;;30394:154;;17687:321;17817:18;17823:2;17827:7;17817:5;:18::i;:::-;17868:54;17899:1;17903:2;17907:7;17916:5;17868:22;:54::i;:::-;17846:154;;;;-1:-1:-1;;;17846:154:0;;9366:2:1;17846:154:0;;;9348:21:1;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:20;9495:18;;;9488:48;9553:19;;17846:154:0;9164:414:1;25085:589:0;25291:18;;;25287:187;;25326:40;25358:7;26501:10;:17;;26474:24;;;;:15;:24;;;;;:44;;;26529:24;;;;;;;;;;;;26397:164;25326:40;25287:187;;;25396:2;25388:10;;:4;:10;;;25384:90;;25415:47;25448:4;25454:7;25415:32;:47::i;:::-;25488:16;;;25484:183;;25521:45;25558:7;25521:36;:45::i;25484:183::-;25594:4;25588:10;;:2;:10;;;25584:83;;25615:40;25643:2;25647:7;25615:27;:40::i;21087:803::-;21242:4;21263:13;;;32708:20;32756:8;21259:624;;21299:72;;;;;:36;;;;;;:72;;790:10;;21350:4;;21356:7;;21365:5;;21299:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21299:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21295:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21545:13:0;;21541:272;;21588:60;;-1:-1:-1;;;21588:60:0;;9366:2:1;21588:60:0;;;9348:21:1;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:20;9495:18;;;9488:48;9553:19;;21588:60:0;9164:414:1;21541:272:0;21763:6;21757:13;21748:6;21744:2;21740:15;21733:38;21295:533;21422:55;;21432:45;21422:55;;-1:-1:-1;21415:62:0;;21259:624;-1:-1:-1;21867:4:0;21087:803;;;;;;:::o;18344:382::-;18424:16;;;18416:61;;;;-1:-1:-1;;;18416:61:0;;14838:2:1;18416:61:0;;;14820:21:1;;;14857:18;;;14850:30;14916:34;14896:18;;;14889:62;14968:18;;18416:61:0;14636:356:1;18416:61:0;16431:4;16455:16;;;:7;:16;;;;;;:30;:16;:30;18488:58;;;;-1:-1:-1;;;18488:58:0;;10192:2:1;18488:58:0;;;10174:21:1;10231:2;10211:18;;;10204:30;10270;10250:18;;;10243:58;10318:18;;18488:58:0;9990:352:1;18488:58:0;18559:45;18588:1;18592:2;18596:7;18559:20;:45::i;:::-;18617:13;;;;;;;:9;:13;;;;;:18;;18634:1;;18617:13;:18;;18634:1;;18617:18;:::i;:::-;;;;-1:-1:-1;;18646:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;18685:33;;18646:16;;;18685:33;;18646:16;;18685:33;18344:382;;:::o;27188:988::-;27454:22;27504:1;27479:22;27496:4;27479:16;:22::i;:::-;:26;;;;:::i;:::-;27516:18;27537:26;;;:17;:26;;;;;;27454:51;;-1:-1:-1;27670:28:0;;;27666:328;;27737:18;;;27715:19;27737:18;;;:12;:18;;;;;;;;:34;;;;;;;;;27788:30;;;;;;:44;;;27905:30;;:17;:30;;;;;:43;;;27666:328;-1:-1:-1;28090:26:0;;;;:17;:26;;;;;;;;28083:33;;;28134:18;;;;;;:12;:18;;;;;:34;;;;;;;28127:41;27188:988::o;28471:1079::-;28749:10;:17;28724:22;;28749:21;;28769:1;;28749:21;:::i;:::-;28781:18;28802:24;;;:15;:24;;;;;;29175:10;:26;;28724:46;;-1:-1:-1;28802:24:0;;28724:46;;29175:26;;;;;;:::i;:::-;;;;;;;;;29153:48;;29239:11;29214:10;29225;29214:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;29319:28;;;:15;:28;;;;;;;:41;;;29491:24;;;;;29484:31;29526:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28542:1008;;;28471:1079;:::o;25975:221::-;26060:14;26077:20;26094:2;26077:16;:20::i;:::-;26108:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;26153:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;25975:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:72;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:45;;;591:1;588;581:12;550:45;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;14:690;;;;;:::o;709:196::-;777:20;;837:42;826:54;;816:65;;806:93;;895:1;892;885:12;806:93;709:196;;;:::o;910:186::-;969:6;1022:2;1010:9;1001:7;997:23;993:32;990:52;;;1038:1;1035;1028:12;990:52;1061:29;1080:9;1061:29;:::i;:::-;1051:39;910:186;-1:-1:-1;;;910:186:1:o;1101:260::-;1169:6;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:52;;;1246:1;1243;1236:12;1198:52;1269:29;1288:9;1269:29;:::i;:::-;1259:39;;1317:38;1351:2;1340:9;1336:18;1317:38;:::i;:::-;1307:48;;1101:260;;;;;:::o;1366:328::-;1443:6;1451;1459;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1551:29;1570:9;1551:29;:::i;:::-;1541:39;;1599:38;1633:2;1622:9;1618:18;1599:38;:::i;:::-;1589:48;;1684:2;1673:9;1669:18;1656:32;1646:42;;1366:328;;;;;:::o;1699:666::-;1794:6;1802;1810;1818;1871:3;1859:9;1850:7;1846:23;1842:33;1839:53;;;1888:1;1885;1878:12;1839:53;1911:29;1930:9;1911:29;:::i;:::-;1901:39;;1959:38;1993:2;1982:9;1978:18;1959:38;:::i;:::-;1949:48;;2044:2;2033:9;2029:18;2016:32;2006:42;;2099:2;2088:9;2084:18;2071:32;2126:18;2118:6;2115:30;2112:50;;;2158:1;2155;2148:12;2112:50;2181:22;;2234:4;2226:13;;2222:27;-1:-1:-1;2212:55:1;;2263:1;2260;2253:12;2212:55;2286:73;2351:7;2346:2;2333:16;2328:2;2324;2320:11;2286:73;:::i;:::-;2276:83;;;1699:666;;;;;;;:::o;2370:347::-;2435:6;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;2535:29;2554:9;2535:29;:::i;:::-;2525:39;;2614:2;2603:9;2599:18;2586:32;2661:5;2654:13;2647:21;2640:5;2637:32;2627:60;;2683:1;2680;2673:12;2627:60;2706:5;2696:15;;;2370:347;;;;;:::o;2722:254::-;2790:6;2798;2851:2;2839:9;2830:7;2826:23;2822:32;2819:52;;;2867:1;2864;2857:12;2819:52;2890:29;2909:9;2890:29;:::i;:::-;2880:39;2966:2;2951:18;;;;2938:32;;-1:-1:-1;;;2722:254:1:o;2981:245::-;3039:6;3092:2;3080:9;3071:7;3067:23;3063:32;3060:52;;;3108:1;3105;3098:12;3060:52;3147:9;3134:23;3166:30;3190:5;3166:30;:::i;3231:249::-;3300:6;3353:2;3341:9;3332:7;3328:23;3324:32;3321:52;;;3369:1;3366;3359:12;3321:52;3401:9;3395:16;3420:30;3444:5;3420:30;:::i;3485:450::-;3554:6;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3663:9;3650:23;3696:18;3688:6;3685:30;3682:50;;;3728:1;3725;3718:12;3682:50;3751:22;;3804:4;3796:13;;3792:27;-1:-1:-1;3782:55:1;;3833:1;3830;3823:12;3782:55;3856:73;3921:7;3916:2;3903:16;3898:2;3894;3890:11;3856:73;:::i;3940:180::-;3999:6;4052:2;4040:9;4031:7;4027:23;4023:32;4020:52;;;4068:1;4065;4058:12;4020:52;-1:-1:-1;4091:23:1;;3940:180;-1:-1:-1;3940:180:1:o;4125:248::-;4193:6;4201;4254:2;4242:9;4233:7;4229:23;4225:32;4222:52;;;4270:1;4267;4260:12;4222:52;-1:-1:-1;;4293:23:1;;;4363:2;4348:18;;;4335:32;;-1:-1:-1;4125:248:1:o;4378:316::-;4419:3;4457:5;4451:12;4484:6;4479:3;4472:19;4500:63;4556:6;4549:4;4544:3;4540:14;4533:4;4526:5;4522:16;4500:63;:::i;:::-;4608:2;4596:15;4613:66;4592:88;4583:98;;;;4683:4;4579:109;;4378:316;-1:-1:-1;;4378:316:1:o;4699:185::-;4741:3;4779:5;4773:12;4794:52;4839:6;4834:3;4827:4;4820:5;4816:16;4794:52;:::i;:::-;4862:16;;;;;4699:185;-1:-1:-1;;4699:185:1:o;4889:1289::-;5065:3;5094:1;5127:6;5121:13;5157:3;5179:1;5207:9;5203:2;5199:18;5189:28;;5267:2;5256:9;5252:18;5289;5279:61;;5333:4;5325:6;5321:17;5311:27;;5279:61;5359:2;5407;5399:6;5396:14;5376:18;5373:38;5370:222;;;5446:77;5441:3;5434:90;5547:4;5544:1;5537:15;5577:4;5572:3;5565:17;5370:222;5608:18;5635:162;;;;5811:1;5806:320;;;;5601:525;;5635:162;5683:66;5672:9;5668:82;5663:3;5656:95;5780:6;5775:3;5771:16;5764:23;;5635:162;;5806:320;18841:1;18834:14;;;18878:4;18865:18;;5901:1;5915:165;5929:6;5926:1;5923:13;5915:165;;;6007:14;;5994:11;;;5987:35;6050:16;;;;5944:10;;5915:165;;;5919:3;;6109:6;6104:3;6100:16;6093:23;;5601:525;;;;;;;6142:30;6168:3;6160:6;6142:30;:::i;:::-;6135:37;4889:1289;-1:-1:-1;;;;;4889:1289:1:o;6414:511::-;6608:4;6637:42;6718:2;6710:6;6706:15;6695:9;6688:34;6770:2;6762:6;6758:15;6753:2;6742:9;6738:18;6731:43;;6810:6;6805:2;6794:9;6790:18;6783:34;6853:3;6848:2;6837:9;6833:18;6826:31;6874:45;6914:3;6903:9;6899:19;6891:6;6874:45;:::i;:::-;6866:53;6414:511;-1:-1:-1;;;;;;6414:511:1:o;6930:632::-;7101:2;7153:21;;;7223:13;;7126:18;;;7245:22;;;7072:4;;7101:2;7324:15;;;;7298:2;7283:18;;;7072:4;7367:169;7381:6;7378:1;7375:13;7367:169;;;7442:13;;7430:26;;7511:15;;;;7476:12;;;;7403:1;7396:9;7367:169;;;-1:-1:-1;7553:3:1;;6930:632;-1:-1:-1;;;;;;6930:632:1:o;7759:219::-;7908:2;7897:9;7890:21;7871:4;7928:44;7968:2;7957:9;7953:18;7945:6;7928:44;:::i;18894:128::-;18934:3;18965:1;18961:6;18958:1;18955:13;18952:39;;;18971:18;;:::i;:::-;-1:-1:-1;19007:9:1;;18894:128::o;19027:120::-;19067:1;19093;19083:35;;19098:18;;:::i;:::-;-1:-1:-1;19132:9:1;;19027:120::o;19152:228::-;19192:7;19318:1;19250:66;19246:74;19243:1;19240:81;19235:1;19228:9;19221:17;19217:105;19214:131;;;19325:18;;:::i;:::-;-1:-1:-1;19365:9:1;;19152:228::o;19385:125::-;19425:4;19453:1;19450;19447:8;19444:34;;;19458:18;;:::i;:::-;-1:-1:-1;19495:9:1;;19385:125::o;19515:258::-;19587:1;19597:113;19611:6;19608:1;19605:13;19597:113;;;19687:11;;;19681:18;19668:11;;;19661:39;19633:2;19626:10;19597:113;;;19728:6;19725:1;19722:13;19719:48;;;-1:-1:-1;;19763:1:1;19745:16;;19738:27;19515:258::o;19778:437::-;19857:1;19853:12;;;;19900;;;19921:61;;19975:4;19967:6;19963:17;19953:27;;19921:61;20028:2;20020:6;20017:14;19997:18;19994:38;19991:218;;;20065:77;20062:1;20055:88;20166:4;20163:1;20156:15;20194:4;20191:1;20184:15;19991:218;;19778:437;;;:::o;20220:195::-;20259:3;20290:66;20283:5;20280:77;20277:103;;;20360:18;;:::i;:::-;-1:-1:-1;20407:1:1;20396:13;;20220:195::o;20420:112::-;20452:1;20478;20468:35;;20483:18;;:::i;:::-;-1:-1:-1;20517:9:1;;20420:112::o;20537:184::-;20589:77;20586:1;20579:88;20686:4;20683:1;20676:15;20710:4;20707:1;20700:15;20726:184;20778:77;20775:1;20768:88;20875:4;20872:1;20865:15;20899:4;20896:1;20889:15;20915:184;20967:77;20964:1;20957:88;21064:4;21061:1;21054:15;21088:4;21085:1;21078:15;21104:184;21156:77;21153:1;21146:88;21253:4;21250:1;21243:15;21277:4;21274:1;21267:15;21293:184;21345:77;21342:1;21335:88;21442:4;21439:1;21432:15;21466:4;21463:1;21456:15;21482:177;21567:66;21560:5;21556:78;21549:5;21546:89;21536:117;;21649:1;21646;21639:12
Swarm Source
ipfs://151cb5c86fa8a9a4f492885eafcd1a2d3e92909f06144731e5abcbcfeb2ef3c7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.