Overview
TokenID
70
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KrewMembership
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "ERC721Enumerable.sol"; import "ReentrancyGuard.sol"; import "Ownable.sol"; import "Counters.sol"; contract KrewMembership is ERC721Enumerable, Ownable, ReentrancyGuard { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIdCounter; mapping (address => bool) whitelist; bool public whitelistEnabled; uint256 public price; uint256 public limit; string private constant IPFS_PNG = "QmXtH8RY8JxhFqHVzF1sz7xAVYZWRweEvtkWmunUz3mR5i"; string private constant IPFS_ANIMATION = "QmVW2ZhK7fivBUJoGK5CZLTYGLVbeotHM1hVKdsoL4NCR1"; string private constant DESCRIPTION = "This pass entitles the holder to ongoing benefits provided by Krew Studios and grants exclusive access to Krew Studios projects."; constructor() ERC721("Krew Studios Members Only Pass", "KREW") {} function mint() public payable nonReentrant { require(msg.value >= price, "KREW: ETH Amount"); require(!whitelistEnabled || whitelist[msg.sender], "KREW: Whitelist"); if (whitelistEnabled && whitelist[msg.sender]) { whitelist[msg.sender] = false; } uint256 tokenId = _tokenIdCounter.current(); require(tokenId < limit, "KREW: Max Tickets"); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); } // Owner functions function setWhitelist(address[] calldata addresses, bool whitelistStatus) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = whitelistStatus; } } function toggleWhitelist() public onlyOwner { whitelistEnabled = whitelistEnabled ? false : true; } function setLimit(uint256 _newLimit) public onlyOwner { require(_newLimit >= totalSupply(), "KREW: Cannot be lower than totalSupply"); limit = _newLimit; } function setPrice(uint256 _price) public onlyOwner { price = _price; } function withdrawEther() public onlyOwner { (bool _sent,) = owner().call{value: address(this).balance}(""); require(_sent, "KREW: Failed to withdraw Ether"); } // View functions function isWhitelisted(address _address) public view returns (bool) { return whitelist[_address]; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return string(abi.encodePacked( 'data:application/json;utf8,{"name":"', name(), " #", tokenId.toString(), '", "description": "', DESCRIPTION, '", "image": "ipfs://', IPFS_PNG, '","animation_url": "ipfs://', IPFS_ANIMATION, '"}' )); } function amountMintable() public view returns (uint256) { return limit - _tokenIdCounter.current(); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "IERC721.sol"; import "IERC721Receiver.sol"; import "IERC721Metadata.sol"; import "Address.sol"; import "Context.sol"; import "Strings.sol"; import "ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "ERC721.sol"; import "IERC721Enumerable.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); } }
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":"amountMintable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"whitelistStatus","type":"bool"}],"name":"setWhitelist","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":"toggleWhitelist","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":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252601e81527f4b7265772053747564696f73204d656d62657273204f6e6c79205061737300006020808301918252835180850190945260048452634b52455760e01b908401528151919291620000739160009162000107565b5080516200008990600190602084019062000107565b505050620000a6620000a0620000b160201b60201c565b620000b5565b6001600b55620001ea565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011590620001ad565b90600052602060002090601f01602090048101928262000139576000855562000184565b82601f106200015457805160ff191683800117855562000184565b8280016001018555821562000184579182015b828111156200018457825182559160200191906001019062000167565b506200019292915062000196565b5090565b5b8082111562000192576000815560010162000197565b600181811c90821680620001c257607f821691505b60208210811415620001e457634e487b7160e01b600052602260045260246000fd5b50919050565b61235f80620001fa6000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063a035b1fe11610095578063b88d4fde11610064578063b88d4fde146104f0578063c87b56dd14610510578063e985e9c514610530578063f2fde38b1461057957600080fd5b8063a035b1fe1461048f578063a22cb465146104a5578063a49feed6146104c5578063a4d66daf146104da57600080fd5b80637e15144b116100d15780637e15144b146104275780638da5cb5b1461043c57806391b7f5ed1461045a57806395d89b411461047a57600080fd5b806370a08231146103dd578063715018a6146103fd5780637362377b1461041257600080fd5b806327ea6f2b1161016f57806342842e0e1161013e57806342842e0e146103635780634f6ccce71461038357806351fb012d146103a35780636352211e146103bd57600080fd5b806327ea6f2b146102ca5780632f745c59146102ea5780633af32abf1461030a5780633c271a051461034357600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780631249c58b1461028357806318160ddd1461028b57806323b872dd146102aa57600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004611e08565b610599565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105aa565b6040516101fe9190612005565b34801561023557600080fd5b50610249610244366004611e42565b61063c565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004611d5a565b6106d6565b005b6102816107ec565b34801561029757600080fd5b506008545b6040519081526020016101fe565b3480156102b657600080fd5b506102816102c5366004611c18565b610998565b3480156102d657600080fd5b506102816102e5366004611e42565b6109c9565b3480156102f657600080fd5b5061029c610305366004611d5a565b610a59565b34801561031657600080fd5b506101f2610325366004611bc3565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561034f57600080fd5b5061028161035e366004611d84565b610aef565b34801561036f57600080fd5b5061028161037e366004611c18565b610b90565b34801561038f57600080fd5b5061029c61039e366004611e42565b610bab565b3480156103af57600080fd5b50600e546101f29060ff1681565b3480156103c957600080fd5b506102496103d8366004611e42565b610c3e565b3480156103e957600080fd5b5061029c6103f8366004611bc3565b610cb5565b34801561040957600080fd5b50610281610d3c565b34801561041e57600080fd5b50610281610d72565b34801561043357600080fd5b50610281610e53565b34801561044857600080fd5b50600a546001600160a01b0316610249565b34801561046657600080fd5b50610281610475366004611e42565b610ea4565b34801561048657600080fd5b5061021c610ed3565b34801561049b57600080fd5b5061029c600f5481565b3480156104b157600080fd5b506102816104c0366004611d30565b610ee2565b3480156104d157600080fd5b5061029c610ef1565b3480156104e657600080fd5b5061029c60105481565b3480156104fc57600080fd5b5061028161050b366004611c54565b610f0e565b34801561051c57600080fd5b5061021c61052b366004611e42565b610f40565b34801561053c57600080fd5b506101f261054b366004611be5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561058557600080fd5b50610281610594366004611bc3565b61102d565b60006105a4826110c5565b92915050565b6060600080546105b99061215f565b80601f01602080910402602001604051908101604052809291908181526020018280546105e59061215f565b80156106325780601f1061060757610100808354040283529160200191610632565b820191906000526020600020905b81548152906001019060200180831161061557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106ba5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106e182610c3e565b9050806001600160a01b0316836001600160a01b0316141561074f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106b1565b336001600160a01b038216148061076b575061076b813361054b565b6107dd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106b1565b6107e783836110ea565b505050565b6002600b54141561083f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b6002600b55600f543410156108895760405162461bcd60e51b815260206004820152601060248201526f12d49155ce8811551208105b5bdd5b9d60821b60448201526064016106b1565b600e5460ff1615806108aa5750336000908152600d602052604090205460ff165b6108e85760405162461bcd60e51b815260206004820152600f60248201526e12d49155ce8815da1a5d195b1a5cdd608a1b60448201526064016106b1565b600e5460ff1680156109095750336000908152600d602052604090205460ff165b1561092657336000908152600d60205260409020805460ff191690555b6000610931600c5490565b905060105481106109785760405162461bcd60e51b81526020600482015260116024820152704b5245573a204d6178205469636b65747360781b60448201526064016106b1565b610986600c80546001019055565b6109903382611158565b506001600b55565b6109a23382611172565b6109be5760405162461bcd60e51b81526004016106b19061209f565b6107e7838383611269565b600a546001600160a01b031633146109f35760405162461bcd60e51b81526004016106b19061206a565b600854811015610a545760405162461bcd60e51b815260206004820152602660248201527f4b5245573a2043616e6e6f74206265206c6f776572207468616e20746f74616c604482015265537570706c7960d01b60648201526084016106b1565b601055565b6000610a6483610cb5565b8210610ac65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106b1565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610b195760405162461bcd60e51b81526004016106b19061206a565b60005b82811015610b8a5781600d6000868685818110610b3b57610b3b61220b565b9050602002016020810190610b509190611bc3565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610b828161219a565b915050610b1c565b50505050565b6107e783838360405180602001604052806000815250610f0e565b6000610bb660085490565b8210610c195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106b1565b60088281548110610c2c57610c2c61220b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106b1565b60006001600160a01b038216610d205760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106b1565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610d665760405162461bcd60e51b81526004016106b19061206a565b610d706000611414565b565b600a546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106b19061206a565b6000610db0600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b5050905080610e505760405162461bcd60e51b815260206004820152601e60248201527f4b5245573a204661696c656420746f207769746864726177204574686572000060448201526064016106b1565b50565b600a546001600160a01b03163314610e7d5760405162461bcd60e51b81526004016106b19061206a565b600e5460ff16610e8e576001610e91565b60005b600e805460ff1916911515919091179055565b600a546001600160a01b03163314610ece5760405162461bcd60e51b81526004016106b19061206a565b600f55565b6060600180546105b99061215f565b610eed338383611466565b5050565b6000610efc600c5490565b601054610f09919061211c565b905090565b610f183383611172565b610f345760405162461bcd60e51b81526004016106b19061209f565b610b8a84848484611535565b6000818152600260205260409020546060906001600160a01b0316610fa75760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016106b1565b610faf6105aa565b610fb883611568565b6040518060a001604052806080815260200161227c608091396040518060600160405280602e815260200161224e602e91396040518060600160405280602e81526020016122fc602e9139604051602001611017959493929190611ea3565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146110575760405162461bcd60e51b81526004016106b19061206a565b6001600160a01b0381166110bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b610e5081611414565b60006001600160e01b0319821663780e9d6360e01b14806105a457506105a482611666565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061111f82610c3e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610eed8282604051806020016040528060008152506116b6565b6000818152600260205260408120546001600160a01b03166111eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106b1565b60006111f683610c3e565b9050806001600160a01b0316846001600160a01b031614806112315750836001600160a01b03166112268461063c565b6001600160a01b0316145b8061126157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127c82610c3e565b6001600160a01b0316146112e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106b1565b6001600160a01b0382166113465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106b1565b6113518383836116e9565b61135c6000826110ea565b6001600160a01b038316600090815260036020526040812080546001929061138590849061211c565b90915550506001600160a01b03821660009081526003602052604081208054600192906113b39084906120f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156114c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106b1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611540848484611269565b61154c848484846116f4565b610b8a5760405162461bcd60e51b81526004016106b190612018565b60608161158c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115b657806115a08161219a565b91506115af9050600a83612108565b9150611590565b60008167ffffffffffffffff8111156115d1576115d1612221565b6040519080825280601f01601f1916602001820160405280156115fb576020820181803683370190505b5090505b84156112615761161060018361211c565b915061161d600a866121b5565b6116289060306120f0565b60f81b81838151811061163d5761163d61220b565b60200101906001600160f81b031916908160001a90535061165f600a86612108565b94506115ff565b60006001600160e01b031982166380ac58cd60e01b148061169757506001600160e01b03198216635b5e139f60e01b145b806105a457506301ffc9a760e01b6001600160e01b03198316146105a4565b6116c08383611801565b6116cd60008484846116f4565b6107e75760405162461bcd60e51b81526004016106b190612018565b6107e783838361194f565b60006001600160a01b0384163b156117f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611738903390899088908890600401611fc8565b602060405180830381600087803b15801561175257600080fd5b505af1925050508015611782575060408051601f3d908101601f1916820190925261177f91810190611e25565b60015b6117dc573d8080156117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b5080516117d45760405162461bcd60e51b81526004016106b190612018565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611261565b506001949350505050565b6001600160a01b0382166118575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106b1565b6000818152600260205260409020546001600160a01b0316156118bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106b1565b6118c8600083836116e9565b6001600160a01b03821660009081526003602052604081208054600192906118f19084906120f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166119aa576119a581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6119cd565b816001600160a01b0316836001600160a01b0316146119cd576119cd8382611a07565b6001600160a01b0382166119e4576107e781611aa4565b826001600160a01b0316826001600160a01b0316146107e7576107e78282611b53565b60006001611a1484610cb5565b611a1e919061211c565b600083815260076020526040902054909150808214611a71576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ab69060019061211c565b60008381526009602052604081205460088054939450909284908110611ade57611ade61220b565b906000526020600020015490508060088381548110611aff57611aff61220b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b3757611b376121f5565b6001900381819060005260206000200160009055905550505050565b6000611b5e83610cb5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b0381168114611bae57600080fd5b919050565b80358015158114611bae57600080fd5b600060208284031215611bd557600080fd5b611bde82611b97565b9392505050565b60008060408385031215611bf857600080fd5b611c0183611b97565b9150611c0f60208401611b97565b90509250929050565b600080600060608486031215611c2d57600080fd5b611c3684611b97565b9250611c4460208501611b97565b9150604084013590509250925092565b60008060008060808587031215611c6a57600080fd5b611c7385611b97565b9350611c8160208601611b97565b925060408501359150606085013567ffffffffffffffff80821115611ca557600080fd5b818701915087601f830112611cb957600080fd5b813581811115611ccb57611ccb612221565b604051601f8201601f19908116603f01168101908382118183101715611cf357611cf3612221565b816040528281528a6020848701011115611d0c57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d4357600080fd5b611d4c83611b97565b9150611c0f60208401611bb3565b60008060408385031215611d6d57600080fd5b611d7683611b97565b946020939093013593505050565b600080600060408486031215611d9957600080fd5b833567ffffffffffffffff80821115611db157600080fd5b818601915086601f830112611dc557600080fd5b813581811115611dd457600080fd5b8760208260051b8501011115611de957600080fd5b602092830195509350611dff9186019050611bb3565b90509250925092565b600060208284031215611e1a57600080fd5b8135611bde81612237565b600060208284031215611e3757600080fd5b8151611bde81612237565b600060208284031215611e5457600080fd5b5035919050565b60008151808452611e73816020860160208601612133565b601f01601f19169290920160200192915050565b60008151611e99818560208601612133565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651611ee8816024850160208b01612133565b61202360f01b6024918401918201528651611f0a816026840160208b01612133565b72111610113232b9b1b934b83a34b7b7111d101160691b602692909101918201528551611f3e816039840160208a01612133565b73222c2022696d616765223a2022697066733a2f2f60601b603992909101918201528451611f7381604d840160208901612133565b7f222c22616e696d6174696f6e5f75726c223a2022697066733a2f2f0000000000604d9290910191820152611fbc611fae6068830186611e87565b61227d60f01b815260020190565b98975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ffb90830184611e5b565b9695505050505050565b602081526000611bde6020830184611e5b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612103576121036121c9565b500190565b600082612117576121176121df565b500490565b60008282101561212e5761212e6121c9565b500390565b60005b8381101561214e578181015183820152602001612136565b83811115610b8a5750506000910152565b600181811c9082168061217357607f821691505b6020821081141561219457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121ae576121ae6121c9565b5060010190565b6000826121c4576121c46121df565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e5057600080fdfe516d587448385259384a7868467148567a4631737a37784156595a575277654576746b576d756e557a336d52356954686973207061737320656e7469746c65732074686520686f6c64657220746f206f6e676f696e672062656e65666974732070726f7669646564206279204b7265772053747564696f7320616e64206772616e7473206578636c75736976652061636365737320746f204b7265772053747564696f732070726f6a656374732e516d5657325a684b3766697642554a6f474b35435a4c5459474c5662656f74484d3168564b64736f4c344e435231a2646970667358221220dd6443ec3690d63658b8b51d0acd653abc23c7451c70b43c8afc34c528139bb064736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063a035b1fe11610095578063b88d4fde11610064578063b88d4fde146104f0578063c87b56dd14610510578063e985e9c514610530578063f2fde38b1461057957600080fd5b8063a035b1fe1461048f578063a22cb465146104a5578063a49feed6146104c5578063a4d66daf146104da57600080fd5b80637e15144b116100d15780637e15144b146104275780638da5cb5b1461043c57806391b7f5ed1461045a57806395d89b411461047a57600080fd5b806370a08231146103dd578063715018a6146103fd5780637362377b1461041257600080fd5b806327ea6f2b1161016f57806342842e0e1161013e57806342842e0e146103635780634f6ccce71461038357806351fb012d146103a35780636352211e146103bd57600080fd5b806327ea6f2b146102ca5780632f745c59146102ea5780633af32abf1461030a5780633c271a051461034357600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780631249c58b1461028357806318160ddd1461028b57806323b872dd146102aa57600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004611e08565b610599565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105aa565b6040516101fe9190612005565b34801561023557600080fd5b50610249610244366004611e42565b61063c565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004611d5a565b6106d6565b005b6102816107ec565b34801561029757600080fd5b506008545b6040519081526020016101fe565b3480156102b657600080fd5b506102816102c5366004611c18565b610998565b3480156102d657600080fd5b506102816102e5366004611e42565b6109c9565b3480156102f657600080fd5b5061029c610305366004611d5a565b610a59565b34801561031657600080fd5b506101f2610325366004611bc3565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561034f57600080fd5b5061028161035e366004611d84565b610aef565b34801561036f57600080fd5b5061028161037e366004611c18565b610b90565b34801561038f57600080fd5b5061029c61039e366004611e42565b610bab565b3480156103af57600080fd5b50600e546101f29060ff1681565b3480156103c957600080fd5b506102496103d8366004611e42565b610c3e565b3480156103e957600080fd5b5061029c6103f8366004611bc3565b610cb5565b34801561040957600080fd5b50610281610d3c565b34801561041e57600080fd5b50610281610d72565b34801561043357600080fd5b50610281610e53565b34801561044857600080fd5b50600a546001600160a01b0316610249565b34801561046657600080fd5b50610281610475366004611e42565b610ea4565b34801561048657600080fd5b5061021c610ed3565b34801561049b57600080fd5b5061029c600f5481565b3480156104b157600080fd5b506102816104c0366004611d30565b610ee2565b3480156104d157600080fd5b5061029c610ef1565b3480156104e657600080fd5b5061029c60105481565b3480156104fc57600080fd5b5061028161050b366004611c54565b610f0e565b34801561051c57600080fd5b5061021c61052b366004611e42565b610f40565b34801561053c57600080fd5b506101f261054b366004611be5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561058557600080fd5b50610281610594366004611bc3565b61102d565b60006105a4826110c5565b92915050565b6060600080546105b99061215f565b80601f01602080910402602001604051908101604052809291908181526020018280546105e59061215f565b80156106325780601f1061060757610100808354040283529160200191610632565b820191906000526020600020905b81548152906001019060200180831161061557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106ba5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106e182610c3e565b9050806001600160a01b0316836001600160a01b0316141561074f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106b1565b336001600160a01b038216148061076b575061076b813361054b565b6107dd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106b1565b6107e783836110ea565b505050565b6002600b54141561083f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b6002600b55600f543410156108895760405162461bcd60e51b815260206004820152601060248201526f12d49155ce8811551208105b5bdd5b9d60821b60448201526064016106b1565b600e5460ff1615806108aa5750336000908152600d602052604090205460ff165b6108e85760405162461bcd60e51b815260206004820152600f60248201526e12d49155ce8815da1a5d195b1a5cdd608a1b60448201526064016106b1565b600e5460ff1680156109095750336000908152600d602052604090205460ff165b1561092657336000908152600d60205260409020805460ff191690555b6000610931600c5490565b905060105481106109785760405162461bcd60e51b81526020600482015260116024820152704b5245573a204d6178205469636b65747360781b60448201526064016106b1565b610986600c80546001019055565b6109903382611158565b506001600b55565b6109a23382611172565b6109be5760405162461bcd60e51b81526004016106b19061209f565b6107e7838383611269565b600a546001600160a01b031633146109f35760405162461bcd60e51b81526004016106b19061206a565b600854811015610a545760405162461bcd60e51b815260206004820152602660248201527f4b5245573a2043616e6e6f74206265206c6f776572207468616e20746f74616c604482015265537570706c7960d01b60648201526084016106b1565b601055565b6000610a6483610cb5565b8210610ac65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106b1565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610b195760405162461bcd60e51b81526004016106b19061206a565b60005b82811015610b8a5781600d6000868685818110610b3b57610b3b61220b565b9050602002016020810190610b509190611bc3565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610b828161219a565b915050610b1c565b50505050565b6107e783838360405180602001604052806000815250610f0e565b6000610bb660085490565b8210610c195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106b1565b60088281548110610c2c57610c2c61220b565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106b1565b60006001600160a01b038216610d205760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106b1565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610d665760405162461bcd60e51b81526004016106b19061206a565b610d706000611414565b565b600a546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106b19061206a565b6000610db0600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b5050905080610e505760405162461bcd60e51b815260206004820152601e60248201527f4b5245573a204661696c656420746f207769746864726177204574686572000060448201526064016106b1565b50565b600a546001600160a01b03163314610e7d5760405162461bcd60e51b81526004016106b19061206a565b600e5460ff16610e8e576001610e91565b60005b600e805460ff1916911515919091179055565b600a546001600160a01b03163314610ece5760405162461bcd60e51b81526004016106b19061206a565b600f55565b6060600180546105b99061215f565b610eed338383611466565b5050565b6000610efc600c5490565b601054610f09919061211c565b905090565b610f183383611172565b610f345760405162461bcd60e51b81526004016106b19061209f565b610b8a84848484611535565b6000818152600260205260409020546060906001600160a01b0316610fa75760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016106b1565b610faf6105aa565b610fb883611568565b6040518060a001604052806080815260200161227c608091396040518060600160405280602e815260200161224e602e91396040518060600160405280602e81526020016122fc602e9139604051602001611017959493929190611ea3565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146110575760405162461bcd60e51b81526004016106b19061206a565b6001600160a01b0381166110bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b610e5081611414565b60006001600160e01b0319821663780e9d6360e01b14806105a457506105a482611666565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061111f82610c3e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610eed8282604051806020016040528060008152506116b6565b6000818152600260205260408120546001600160a01b03166111eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106b1565b60006111f683610c3e565b9050806001600160a01b0316846001600160a01b031614806112315750836001600160a01b03166112268461063c565b6001600160a01b0316145b8061126157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127c82610c3e565b6001600160a01b0316146112e45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106b1565b6001600160a01b0382166113465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106b1565b6113518383836116e9565b61135c6000826110ea565b6001600160a01b038316600090815260036020526040812080546001929061138590849061211c565b90915550506001600160a01b03821660009081526003602052604081208054600192906113b39084906120f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156114c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106b1565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611540848484611269565b61154c848484846116f4565b610b8a5760405162461bcd60e51b81526004016106b190612018565b60608161158c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115b657806115a08161219a565b91506115af9050600a83612108565b9150611590565b60008167ffffffffffffffff8111156115d1576115d1612221565b6040519080825280601f01601f1916602001820160405280156115fb576020820181803683370190505b5090505b84156112615761161060018361211c565b915061161d600a866121b5565b6116289060306120f0565b60f81b81838151811061163d5761163d61220b565b60200101906001600160f81b031916908160001a90535061165f600a86612108565b94506115ff565b60006001600160e01b031982166380ac58cd60e01b148061169757506001600160e01b03198216635b5e139f60e01b145b806105a457506301ffc9a760e01b6001600160e01b03198316146105a4565b6116c08383611801565b6116cd60008484846116f4565b6107e75760405162461bcd60e51b81526004016106b190612018565b6107e783838361194f565b60006001600160a01b0384163b156117f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611738903390899088908890600401611fc8565b602060405180830381600087803b15801561175257600080fd5b505af1925050508015611782575060408051601f3d908101601f1916820190925261177f91810190611e25565b60015b6117dc573d8080156117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b5080516117d45760405162461bcd60e51b81526004016106b190612018565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611261565b506001949350505050565b6001600160a01b0382166118575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106b1565b6000818152600260205260409020546001600160a01b0316156118bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106b1565b6118c8600083836116e9565b6001600160a01b03821660009081526003602052604081208054600192906118f19084906120f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166119aa576119a581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6119cd565b816001600160a01b0316836001600160a01b0316146119cd576119cd8382611a07565b6001600160a01b0382166119e4576107e781611aa4565b826001600160a01b0316826001600160a01b0316146107e7576107e78282611b53565b60006001611a1484610cb5565b611a1e919061211c565b600083815260076020526040902054909150808214611a71576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ab69060019061211c565b60008381526009602052604081205460088054939450909284908110611ade57611ade61220b565b906000526020600020015490508060088381548110611aff57611aff61220b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b3757611b376121f5565b6001900381819060005260206000200160009055905550505050565b6000611b5e83610cb5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b0381168114611bae57600080fd5b919050565b80358015158114611bae57600080fd5b600060208284031215611bd557600080fd5b611bde82611b97565b9392505050565b60008060408385031215611bf857600080fd5b611c0183611b97565b9150611c0f60208401611b97565b90509250929050565b600080600060608486031215611c2d57600080fd5b611c3684611b97565b9250611c4460208501611b97565b9150604084013590509250925092565b60008060008060808587031215611c6a57600080fd5b611c7385611b97565b9350611c8160208601611b97565b925060408501359150606085013567ffffffffffffffff80821115611ca557600080fd5b818701915087601f830112611cb957600080fd5b813581811115611ccb57611ccb612221565b604051601f8201601f19908116603f01168101908382118183101715611cf357611cf3612221565b816040528281528a6020848701011115611d0c57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d4357600080fd5b611d4c83611b97565b9150611c0f60208401611bb3565b60008060408385031215611d6d57600080fd5b611d7683611b97565b946020939093013593505050565b600080600060408486031215611d9957600080fd5b833567ffffffffffffffff80821115611db157600080fd5b818601915086601f830112611dc557600080fd5b813581811115611dd457600080fd5b8760208260051b8501011115611de957600080fd5b602092830195509350611dff9186019050611bb3565b90509250925092565b600060208284031215611e1a57600080fd5b8135611bde81612237565b600060208284031215611e3757600080fd5b8151611bde81612237565b600060208284031215611e5457600080fd5b5035919050565b60008151808452611e73816020860160208601612133565b601f01601f19169290920160200192915050565b60008151611e99818560208601612133565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651611ee8816024850160208b01612133565b61202360f01b6024918401918201528651611f0a816026840160208b01612133565b72111610113232b9b1b934b83a34b7b7111d101160691b602692909101918201528551611f3e816039840160208a01612133565b73222c2022696d616765223a2022697066733a2f2f60601b603992909101918201528451611f7381604d840160208901612133565b7f222c22616e696d6174696f6e5f75726c223a2022697066733a2f2f0000000000604d9290910191820152611fbc611fae6068830186611e87565b61227d60f01b815260020190565b98975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ffb90830184611e5b565b9695505050505050565b602081526000611bde6020830184611e5b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612103576121036121c9565b500190565b600082612117576121176121df565b500490565b60008282101561212e5761212e6121c9565b500390565b60005b8381101561214e578181015183820152602001612136565b83811115610b8a5750506000910152565b600181811c9082168061217357607f821691505b6020821081141561219457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121ae576121ae6121c9565b5060010190565b6000826121c4576121c46121df565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e5057600080fdfe516d587448385259384a7868467148567a4631737a37784156595a575277654576746b576d756e557a336d52356954686973207061737320656e7469746c65732074686520686f6c64657220746f206f6e676f696e672062656e65666974732070726f7669646564206279204b7265772053747564696f7320616e64206772616e7473206578636c75736976652061636365737320746f204b7265772053747564696f732070726f6a656374732e516d5657325a684b3766697642554a6f474b35435a4c5459474c5662656f74484d3168564b64736f4c344e435231a2646970667358221220dd6443ec3690d63658b8b51d0acd653abc23c7451c70b43c8afc34c528139bb064736f6c63430008070033
Deployed Bytecode Sourcemap
172:3355:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3361:163;;;;;;;;;;-1:-1:-1;3361:163:11;;;;;:::i;:::-;;:::i;:::-;;;7885:14:15;;7878:22;7860:41;;7848:2;7833:18;3361:163:11;;;;;;;;2472:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4031:221::-;;;;;;;;;;-1:-1:-1;4031:221:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7183:32:15;;;7165:51;;7153:2;7138:18;4031:221:4;7019:203:15;3554:411:4;;;;;;;;;;-1:-1:-1;3554:411:4;;;;;:::i;:::-;;:::i;:::-;;939:493:11;;;:::i;1654:113:5:-;;;;;;;;;;-1:-1:-1;1742:10:5;:17;1654:113;;;17594:25:15;;;17582:2;17567:18;1654:113:5;17448:177:15;4781:339:4;;;;;;;;;;-1:-1:-1;4781:339:4;;;;;:::i;:::-;;:::i;1817:178:11:-;;;;;;;;;;-1:-1:-1;1817:178:11;;;;;:::i;:::-;;:::i;1322:256:5:-;;;;;;;;;;-1:-1:-1;1322:256:5;;;;;:::i;:::-;;:::i;2308:113:11:-;;;;;;;;;;-1:-1:-1;2308:113:11;;;;;:::i;:::-;-1:-1:-1;;;;;2394:19:11;2370:4;2394:19;;;:9;:19;;;;;;;;;2308:113;1464:224;;;;;;;;;;-1:-1:-1;1464:224:11;;;;;:::i;:::-;;:::i;5191:185:4:-;;;;;;;;;;-1:-1:-1;5191:185:4;;;;;:::i;:::-;;:::i;1844:233:5:-;;;;;;;;;;-1:-1:-1;1844:233:5;;;;;:::i;:::-;;:::i;414:28:11:-;;;;;;;;;;-1:-1:-1;414:28:11;;;;;;;;2166:239:4;;;;;;;;;;-1:-1:-1;2166:239:4;;;;;:::i;:::-;;:::i;1896:208::-;;;;;;;;;;-1:-1:-1;1896:208:4;;;;;:::i;:::-;;:::i;1712:103:12:-;;;;;;;;;;;;;:::i;2095:182:11:-;;;;;;;;;;;;;:::i;1696:113::-;;;;;;;;;;;;;:::i;1061:87:12:-;;;;;;;;;;-1:-1:-1;1134:6:12;;-1:-1:-1;;;;;1134:6:12;1061:87;;2003:84:11;;;;;;;;;;-1:-1:-1;2003:84:11;;;;;:::i;:::-;;:::i;2641:104:4:-;;;;;;;;;;;;;:::i;449:20:11:-;;;;;;;;;;;;;;;;4324:155:4;;;;;;;;;;-1:-1:-1;4324:155:4;;;;;:::i;:::-;;:::i;2989:115:11:-;;;;;;;;;;;;;:::i;476:20::-;;;;;;;;;;;;;;;;5447:328:4;;;;;;;;;;-1:-1:-1;5447:328:4;;;;;:::i;:::-;;:::i;2429:552:11:-;;;;;;;;;;-1:-1:-1;2429:552:11;;;;;:::i;:::-;;:::i;4550:164:4:-;;;;;;;;;;-1:-1:-1;4550:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;4671:25:4;;;4647:4;4671:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4550:164;1970:201:12;;;;;;;;;;-1:-1:-1;1970:201:12;;;;;:::i;:::-;;:::i;3361:163:11:-;3456:4;3480:36;3504:11;3480:23;:36::i;:::-;3473:43;3361:163;-1:-1:-1;;3361:163:11:o;2472:100:4:-;2526:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2472:100;:::o;4031:221::-;4107:7;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;4127:73;;;;-1:-1:-1;;;4127:73:4;;13824:2:15;4127:73:4;;;13806:21:15;13863:2;13843:18;;;13836:30;13902:34;13882:18;;;13875:62;-1:-1:-1;;;13953:18:15;;;13946:42;14005:19;;4127:73:4;;;;;;;;;-1:-1:-1;4220:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4220:24:4;;4031:221::o;3554:411::-;3635:13;3651:23;3666:7;3651:14;:23::i;:::-;3635:39;;3699:5;-1:-1:-1;;;;;3693:11:4;:2;-1:-1:-1;;;;;3693:11:4;;;3685:57;;;;-1:-1:-1;;;3685:57:4;;15368:2:15;3685:57:4;;;15350:21:15;15407:2;15387:18;;;15380:30;15446:34;15426:18;;;15419:62;-1:-1:-1;;;15497:18:15;;;15490:31;15538:19;;3685:57:4;15166:397:15;3685:57:4;736:10:1;-1:-1:-1;;;;;3777:21:4;;;;:62;;-1:-1:-1;3802:37:4;3819:5;736:10:1;4550:164:4;:::i;3802:37::-;3755:168;;;;-1:-1:-1;;;3755:168:4;;12217:2:15;3755:168:4;;;12199:21:15;12256:2;12236:18;;;12229:30;12295:34;12275:18;;;12268:62;12366:26;12346:18;;;12339:54;12410:19;;3755:168:4;12015:420:15;3755:168:4;3936:21;3945:2;3949:7;3936:8;:21::i;:::-;3624:341;3554:411;;:::o;939:493:11:-;1778:1:13;2376:7;;:19;;2368:63;;;;-1:-1:-1;;;2368:63:13;;16945:2:15;2368:63:13;;;16927:21:15;16984:2;16964:18;;;16957:30;17023:33;17003:18;;;16996:61;17074:18;;2368:63:13;16743:355:15;2368:63:13;1778:1;2509:7;:18;1015:5:11::1;::::0;1002:9:::1;:18;;994:47;;;::::0;-1:-1:-1;;;994:47:11;;17305:2:15;994:47:11::1;::::0;::::1;17287:21:15::0;17344:2;17324:18;;;17317:30;-1:-1:-1;;;17363:18:15;;;17356:46;17419:18;;994:47:11::1;17103:340:15::0;994:47:11::1;1061:16;::::0;::::1;;1060:17;::::0;:42:::1;;-1:-1:-1::0;1091:10:11::1;1081:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;1060:42;1052:70;;;::::0;-1:-1:-1;;;1052:70:11;;16601:2:15;1052:70:11::1;::::0;::::1;16583:21:15::0;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:15;;;16652:45;16714:18;;1052:70:11::1;16399:339:15::0;1052:70:11::1;1137:16;::::0;::::1;;:41:::0;::::1;;;-1:-1:-1::0;1167:10:11::1;1157:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;1137:41;1133:103;;;1205:10;1219:5;1195:21:::0;;;:9:::1;:21;::::0;;;;:29;;-1:-1:-1;;1195:29:11::1;::::0;;1133:103:::1;1246:15;1264:25;:15;940:14:2::0;;848:114;1264:25:11::1;1246:43;;1318:5;;1308:7;:15;1300:45;;;::::0;-1:-1:-1;;;1300:45:11;;8338:2:15;1300:45:11::1;::::0;::::1;8320:21:15::0;8377:2;8357:18;;;8350:30;-1:-1:-1;;;8396:18:15;;;8389:47;8453:18;;1300:45:11::1;8136:341:15::0;1300:45:11::1;1356:27;:15;1059:19:2::0;;1077:1;1059:19;;;970:127;1356:27:11::1;1394:30;1404:10;1416:7;1394:9;:30::i;:::-;-1:-1:-1::0;1734:1:13;2688:7;:22;939:493:11:o;4781:339:4:-;4976:41;736:10:1;5009:7:4;4976:18;:41::i;:::-;4968:103;;;;-1:-1:-1;;;4968:103:4;;;;;;;:::i;:::-;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;1817:178:11:-;1134:6:12;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;1742:10:5;:17;1890:9:11::1;:26;;1882:77;;;::::0;-1:-1:-1;;;1882:77:11;;10279:2:15;1882:77:11::1;::::0;::::1;10261:21:15::0;10318:2;10298:18;;;10291:30;10357:34;10337:18;;;10330:62;-1:-1:-1;;;10408:18:15;;;10401:36;10454:19;;1882:77:11::1;10077:402:15::0;1882:77:11::1;1970:5;:17:::0;1817:178::o;1322:256:5:-;1419:7;1455:23;1472:5;1455:16;:23::i;:::-;1447:5;:31;1439:87;;;;-1:-1:-1;;;1439:87:5;;8684:2:15;1439:87:5;;;8666:21:15;8723:2;8703:18;;;8696:30;8762:34;8742:18;;;8735:62;-1:-1:-1;;;8813:18:15;;;8806:41;8864:19;;1439:87:5;8482:407:15;1439:87:5;-1:-1:-1;;;;;;1544:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1322:256::o;1464:224:11:-;1134:6:12;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;1571:9:11::1;1566:115;1586:20:::0;;::::1;1566:115;;;1654:15;1628:9;:23;1638:9;;1648:1;1638:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;1628:23:11::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;1628:23:11;:41;;-1:-1:-1;;1628:41:11::1;::::0;::::1;;::::0;;;::::1;::::0;;1608:3;::::1;::::0;::::1;:::i;:::-;;;;1566:115;;;;1464:224:::0;;;:::o;5191:185:4:-;5329:39;5346:4;5352:2;5356:7;5329:39;;;;;;;;;;;;:16;:39::i;1844:233:5:-;1919:7;1955:30;1742:10;:17;;1654:113;1955:30;1947:5;:38;1939:95;;;;-1:-1:-1;;;1939:95:5;;16188:2:15;1939:95:5;;;16170:21:15;16227:2;16207:18;;;16200:30;16266:34;16246:18;;;16239:62;-1:-1:-1;;;16317:18:15;;;16310:42;16369:19;;1939:95:5;15986:408:15;1939:95:5;2052:10;2063:5;2052:17;;;;;;;;:::i;:::-;;;;;;;;;2045:24;;1844:233;;;:::o;2166:239:4:-;2238:7;2274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2274:16:4;2309:19;2301:73;;;;-1:-1:-1;;;2301:73:4;;13053:2:15;2301:73:4;;;13035:21:15;13092:2;13072:18;;;13065:30;13131:34;13111:18;;;13104:62;-1:-1:-1;;;13182:18:15;;;13175:39;13231:19;;2301:73:4;12851:405:15;1896:208:4;1968:7;-1:-1:-1;;;;;1996:19:4;;1988:74;;;;-1:-1:-1;;;1988:74:4;;12642:2:15;1988:74:4;;;12624:21:15;12681:2;12661:18;;;12654:30;12720:34;12700:18;;;12693:62;-1:-1:-1;;;12771:18:15;;;12764:40;12821:19;;1988:74:4;12440:406:15;1988:74:4;-1:-1:-1;;;;;;2080:16:4;;;;;:9;:16;;;;;;;1896:208::o;1712:103:12:-;1134:6;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;1777:30:::1;1804:1;1777:18;:30::i;:::-;1712:103::o:0;2095:182:11:-;1134:6:12;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;2149:10:11::1;2164:7;1134:6:12::0;;-1:-1:-1;;;;;1134:6:12;;1061:87;2164:7:11::1;-1:-1:-1::0;;;;;2164:12:11::1;2184:21;2164:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2148:62;;;2229:5;2221:48;;;::::0;-1:-1:-1;;;2221:48:11;;11858:2:15;2221:48:11::1;::::0;::::1;11840:21:15::0;11897:2;11877:18;;;11870:30;11936:32;11916:18;;;11909:60;11986:18;;2221:48:11::1;11656:354:15::0;2221:48:11::1;2137:140;2095:182::o:0;1696:113::-;1134:6:12;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;1770:16:11::1;::::0;::::1;;:31;;1797:4;1770:31;;;1789:5;1770:31;1751:16;:50:::0;;-1:-1:-1;;1751:50:11::1;::::0;::::1;;::::0;;;::::1;::::0;;1696:113::o;2003:84::-;1134:6:12;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;2065:5:11::1;:14:::0;2003:84::o;2641:104:4:-;2697:13;2730:7;2723:14;;;;;:::i;4324:155::-;4419:52;736:10:1;4452:8:4;4462;4419:18;:52::i;:::-;4324:155;;:::o;2989:115:11:-;3036:7;3071:25;:15;940:14:2;;848:114;3071:25:11;3063:5;;:33;;;;:::i;:::-;3056:40;;2989:115;:::o;5447:328:4:-;5622:41;736:10:1;5655:7:4;5622:18;:41::i;:::-;5614:103;;;;-1:-1:-1;;;5614:103:4;;;;;;;:::i;:::-;5728:39;5742:4;5748:2;5752:7;5761:5;5728:13;:39::i;2429:552:11:-;7350:4:4;7374:16;;;:7;:16;;;;;;2494:13:11;;-1:-1:-1;;;;;7374:16:4;2520:60:11;;;;-1:-1:-1;;;2520:60:11;;15008:2:15;2520:60:11;;;14990:21:15;15047:2;15027:18;;;15020:30;15086:33;15066:18;;;15059:61;15137:18;;2520:60:11;14806:355:15;2520:60:11;2689:6;:4;:6::i;:::-;2729:18;:7;:16;:18::i;:::-;2798:11;;;;;;;;;;;;;;;;;2861:8;;;;;;;;;;;;;;;;;2928:14;;;;;;;;;;;;;;;;;2605:367;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2591:382;;2429:552;;;:::o;1970:201:12:-;1134:6;;-1:-1:-1;;;;;1134:6:12;736:10:1;1281:23:12;1273:68;;;;-1:-1:-1;;;1273:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2059:22:12;::::1;2051:73;;;::::0;-1:-1:-1;;;2051:73:12;;9515:2:15;2051:73:12::1;::::0;::::1;9497:21:15::0;9554:2;9534:18;;;9527:30;9593:34;9573:18;;;9566:62;-1:-1:-1;;;9644:18:15;;;9637:36;9690:19;;2051:73:12::1;9313:402:15::0;2051:73:12::1;2135:28;2154:8;2135:18;:28::i;1014:224:5:-:0;1116:4;-1:-1:-1;;;;;;1140:50:5;;-1:-1:-1;;;1140:50:5;;:90;;;1194:36;1218:11;1194:23;:36::i;11267:174:4:-;11342:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11342:29:4;-1:-1:-1;;;;;11342:29:4;;;;;;;;:24;;11396:23;11342:24;11396:14;:23::i;:::-;-1:-1:-1;;;;;11387:46:4;;;;;;;;;;;11267:174;;:::o;8269:110::-;8345:26;8355:2;8359:7;8345:26;;;;;;;;;;;;:9;:26::i;7579:348::-;7672:4;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;7689:73;;;;-1:-1:-1;;;7689:73:4;;11445:2:15;7689:73:4;;;11427:21:15;11484:2;11464:18;;;11457:30;11523:34;11503:18;;;11496:62;-1:-1:-1;;;11574:18:15;;;11567:42;11626:19;;7689:73:4;11243:408:15;7689:73:4;7773:13;7789:23;7804:7;7789:14;:23::i;:::-;7773:39;;7842:5;-1:-1:-1;;;;;7831:16:4;:7;-1:-1:-1;;;;;7831:16:4;;:51;;;;7875:7;-1:-1:-1;;;;;7851:31:4;:20;7863:7;7851:11;:20::i;:::-;-1:-1:-1;;;;;7851:31:4;;7831:51;:87;;;-1:-1:-1;;;;;;4671:25:4;;;4647:4;4671:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7886:32;7823:96;7579:348;-1:-1:-1;;;;7579:348:4:o;10571:578::-;10730:4;-1:-1:-1;;;;;10703:31:4;:23;10718:7;10703:14;:23::i;:::-;-1:-1:-1;;;;;10703:31:4;;10695:85;;;;-1:-1:-1;;;10695:85:4;;14598:2:15;10695:85:4;;;14580:21:15;14637:2;14617:18;;;14610:30;14676:34;14656:18;;;14649:62;-1:-1:-1;;;14727:18:15;;;14720:39;14776:19;;10695:85:4;14396:405:15;10695:85:4;-1:-1:-1;;;;;10799:16:4;;10791:65;;;;-1:-1:-1;;;10791:65:4;;10686:2:15;10791:65:4;;;10668:21:15;10725:2;10705:18;;;10698:30;10764:34;10744:18;;;10737:62;-1:-1:-1;;;10815:18:15;;;10808:34;10859:19;;10791:65:4;10484:400:15;10791:65:4;10869:39;10890:4;10896:2;10900:7;10869:20;:39::i;:::-;10973:29;10990:1;10994:7;10973:8;:29::i;:::-;-1:-1:-1;;;;;11015:15:4;;;;;;:9;:15;;;;;:20;;11034:1;;11015:15;:20;;11034:1;;11015:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11046:13:4;;;;;;:9;:13;;;;;:18;;11063:1;;11046:13;:18;;11063:1;;11046:18;:::i;:::-;;;;-1:-1:-1;;11075:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11075:21:4;-1:-1:-1;;;;;11075:21:4;;;;;;;;;11114:27;;11075:16;;11114:27;;;;;;;10571:578;;;:::o;2331:191:12:-;2424:6;;;-1:-1:-1;;;;;2441:17:12;;;-1:-1:-1;;;;;;2441:17:12;;;;;;;2474:40;;2424:6;;;2441:17;2424:6;;2474:40;;2405:16;;2474:40;2394:128;2331:191;:::o;11583:315:4:-;11738:8;-1:-1:-1;;;;;11729:17:4;:5;-1:-1:-1;;;;;11729:17:4;;;11721:55;;;;-1:-1:-1;;;11721:55:4;;11091:2:15;11721:55:4;;;11073:21:15;11130:2;11110:18;;;11103:30;11169:27;11149:18;;;11142:55;11214:18;;11721:55:4;10889:349:15;11721:55:4;-1:-1:-1;;;;;11787:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11787:46:4;;;;;;;;;;11849:41;;7860::15;;;11849::4;;7833:18:15;11849:41:4;;;;;;;11583:315;;;:::o;6657:::-;6814:28;6824:4;6830:2;6834:7;6814:9;:28::i;:::-;6861:48;6884:4;6890:2;6894:7;6903:5;6861:22;:48::i;:::-;6853:111;;;;-1:-1:-1;;;6853:111:4;;;;;;;:::i;342:723:14:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:14;;;;;;;;;;;;-1:-1:-1;;;646:10:14;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:14;;-1:-1:-1;798:2:14;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:14;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:14;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:14;;;;;;;;-1:-1:-1;1003:11:14;1012:2;1003:11;;:::i;:::-;;;872:154;;1527:305:4;1629:4;-1:-1:-1;;;;;;1666:40:4;;-1:-1:-1;;;1666:40:4;;:105;;-1:-1:-1;;;;;;;1723:48:4;;-1:-1:-1;;;1723:48:4;1666:105;:158;;;-1:-1:-1;;;;;;;;;;961:40:3;;;1788:36:4;852:157:3;8606:321:4;8736:18;8742:2;8746:7;8736:5;:18::i;:::-;8787:54;8818:1;8822:2;8826:7;8835:5;8787:22;:54::i;:::-;8765:154;;;;-1:-1:-1;;;8765:154:4;;;;;;;:::i;3180:173:11:-;3300:45;3327:4;3333:2;3337:7;3300:26;:45::i;12463:799:4:-;12618:4;-1:-1:-1;;;;;12639:13:4;;1120:20:0;1168:8;12635:620:4;;12675:72;;-1:-1:-1;;;12675:72:4;;-1:-1:-1;;;;;12675:36:4;;;;;:72;;736:10:1;;12726:4:4;;12732:7;;12741:5;;12675:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12675:72:4;;;;;;;;-1:-1:-1;;12675:72:4;;;;;;;;;;;;:::i;:::-;;;12671:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12917:13:4;;12913:272;;12960:60;;-1:-1:-1;;;12960:60:4;;;;;;;:::i;12913:272::-;13135:6;13129:13;13120:6;13116:2;13112:15;13105:38;12671:529;-1:-1:-1;;;;;;12798:51:4;-1:-1:-1;;;12798:51:4;;-1:-1:-1;12791:58:4;;12635:620;-1:-1:-1;13239:4:4;12463:799;;;;;;:::o;9263:382::-;-1:-1:-1;;;;;9343:16:4;;9335:61;;;;-1:-1:-1;;;9335:61:4;;13463:2:15;9335:61:4;;;13445:21:15;;;13482:18;;;13475:30;13541:34;13521:18;;;13514:62;13593:18;;9335:61:4;13261:356:15;9335:61:4;7350:4;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;:30;9407:58;;;;-1:-1:-1;;;9407:58:4;;9922:2:15;9407:58:4;;;9904:21:15;9961:2;9941:18;;;9934:30;10000;9980:18;;;9973:58;10048:18;;9407:58:4;9720:352:15;9407:58:4;9478:45;9507:1;9511:2;9515:7;9478:20;:45::i;:::-;-1:-1:-1;;;;;9536:13:4;;;;;;:9;:13;;;;;:18;;9553:1;;9536:13;:18;;9553:1;;9536:18;:::i;:::-;;;;-1:-1:-1;;9565:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9565:21:4;-1:-1:-1;;;;;9565:21:4;;;;;;;;9604:33;;9565:16;;;9604:33;;9565:16;;9604:33;9263:382;;:::o;2690:589:5:-;-1:-1:-1;;;;;2896:18:5;;2892:187;;2931:40;2963:7;4106:10;:17;;4079:24;;;;:15;:24;;;;;:44;;;4134:24;;;;;;;;;;;;4002:164;2931:40;2892:187;;;3001:2;-1:-1:-1;;;;;2993:10:5;:4;-1:-1:-1;;;;;2993:10:5;;2989:90;;3020:47;3053:4;3059:7;3020:32;:47::i;:::-;-1:-1:-1;;;;;3093:16:5;;3089:183;;3126:45;3163:7;3126:36;:45::i;3089:183::-;3199:4;-1:-1:-1;;;;;3193:10:5;:2;-1:-1:-1;;;;;3193:10:5;;3189:83;;3220:40;3248:2;3252:7;3220:27;:40::i;4793:988::-;5059:22;5109:1;5084:22;5101:4;5084:16;:22::i;:::-;:26;;;;:::i;:::-;5121:18;5142:26;;;:17;:26;;;;;;5059:51;;-1:-1:-1;5275:28:5;;;5271:328;;-1:-1:-1;;;;;5342:18:5;;5320:19;5342:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5393:30;;;;;;:44;;;5510:30;;:17;:30;;;;;:43;;;5271:328;-1:-1:-1;5695:26:5;;;;:17;:26;;;;;;;;5688:33;;;-1:-1:-1;;;;;5739:18:5;;;;;:12;:18;;;;;:34;;;;;;;5732:41;4793:988::o;6076:1079::-;6354:10;:17;6329:22;;6354:21;;6374:1;;6354:21;:::i;:::-;6386:18;6407:24;;;:15;:24;;;;;;6780:10;:26;;6329:46;;-1:-1:-1;6407:24:5;;6329:46;;6780:26;;;;;;:::i;:::-;;;;;;;;;6758:48;;6844:11;6819:10;6830;6819:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6924:28;;;:15;:28;;;;;;;:41;;;7096:24;;;;;7089:31;7131:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6147:1008;;;6076:1079;:::o;3580:221::-;3665:14;3682:20;3699:2;3682:16;:20::i;:::-;-1:-1:-1;;;;;3713:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3758:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3580:221:5:o;14:173:15:-;82:20;;-1:-1:-1;;;;;131:31:15;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;:::-;498:39;357:186;-1:-1:-1;;;357:186:15:o;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:15;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:15:o;2807:689::-;2899:6;2907;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;3024:9;3011:23;3053:18;3094:2;3086:6;3083:14;3080:34;;;3110:1;3107;3100:12;3080:34;3148:6;3137:9;3133:22;3123:32;;3193:7;3186:4;3182:2;3178:13;3174:27;3164:55;;3215:1;3212;3205:12;3164:55;3255:2;3242:16;3281:2;3273:6;3270:14;3267:34;;;3297:1;3294;3287:12;3267:34;3352:7;3345:4;3335:6;3332:1;3328:14;3324:2;3320:23;3316:34;3313:47;3310:67;;;3373:1;3370;3363:12;3310:67;3404:4;3396:13;;;;-1:-1:-1;3428:6:15;-1:-1:-1;3453:37:15;;3469:20;;;-1:-1:-1;3453:37:15;:::i;:::-;3443:47;;2807:689;;;;;:::o;3501:245::-;3559:6;3612:2;3600:9;3591:7;3587:23;3583:32;3580:52;;;3628:1;3625;3618:12;3580:52;3667:9;3654:23;3686:30;3710:5;3686:30;:::i;3751:249::-;3820:6;3873:2;3861:9;3852:7;3848:23;3844:32;3841:52;;;3889:1;3886;3879:12;3841:52;3921:9;3915:16;3940:30;3964:5;3940:30;:::i;4005:180::-;4064:6;4117:2;4105:9;4096:7;4092:23;4088:32;4085:52;;;4133:1;4130;4123:12;4085:52;-1:-1:-1;4156:23:15;;4005:180;-1:-1:-1;4005:180:15:o;4190:257::-;4231:3;4269:5;4263:12;4296:6;4291:3;4284:19;4312:63;4368:6;4361:4;4356:3;4352:14;4345:4;4338:5;4334:16;4312:63;:::i;:::-;4429:2;4408:15;-1:-1:-1;;4404:29:15;4395:39;;;;4436:4;4391:50;;4190:257;-1:-1:-1;;4190:257:15:o;4452:185::-;4494:3;4532:5;4526:12;4547:52;4592:6;4587:3;4580:4;4573:5;4569:16;4547:52;:::i;:::-;4615:16;;;;;4452:185;-1:-1:-1;;4452:185:15:o;4772:2032::-;5731:66;5726:3;5719:79;5837:10;5832:3;5828:20;5823:2;5818:3;5814:12;5807:42;5701:3;5878:6;5872:13;5894:60;5947:6;5942:2;5937:3;5933:12;5928:2;5920:6;5916:15;5894:60;:::i;:::-;-1:-1:-1;;;6013:2:15;5973:16;;;6005:11;;;5998:25;6048:13;;6070:61;6048:13;6117:2;6109:11;;6104:2;6092:15;;6070:61;:::i;:::-;-1:-1:-1;;;6191:2:15;6150:17;;;;6183:11;;;6176:71;6272:13;;6294:61;6272:13;6341:2;6333:11;;6328:2;6316:15;;6294:61;:::i;:::-;-1:-1:-1;;;6415:2:15;6374:17;;;;6407:11;;;6400:72;6497:13;;6519:61;6497:13;6566:2;6558:11;;6553:2;6541:15;;6519:61;:::i;:::-;6645:66;6640:2;6599:17;;;;6632:11;;;6625:87;6728:70;6758:39;6792:3;6784:12;;6776:6;6758:39;:::i;:::-;-1:-1:-1;;;4707:27:15;;4759:1;4750:11;;4642:125;6728:70;6721:77;4772:2032;-1:-1:-1;;;;;;;;4772:2032:15:o;7227:488::-;-1:-1:-1;;;;;7496:15:15;;;7478:34;;7548:15;;7543:2;7528:18;;7521:43;7595:2;7580:18;;7573:34;;;7643:3;7638:2;7623:18;;7616:31;;;7421:4;;7664:45;;7689:19;;7681:6;7664:45;:::i;:::-;7656:53;7227:488;-1:-1:-1;;;;;;7227:488:15:o;7912:219::-;8061:2;8050:9;8043:21;8024:4;8081:44;8121:2;8110:9;8106:18;8098:6;8081:44;:::i;8894:414::-;9096:2;9078:21;;;9135:2;9115:18;;;9108:30;9174:34;9169:2;9154:18;;9147:62;-1:-1:-1;;;9240:2:15;9225:18;;9218:48;9298:3;9283:19;;8894:414::o;14035:356::-;14237:2;14219:21;;;14256:18;;;14249:30;14315:34;14310:2;14295:18;;14288:62;14382:2;14367:18;;14035:356::o;15568:413::-;15770:2;15752:21;;;15809:2;15789:18;;;15782:30;15848:34;15843:2;15828:18;;15821:62;-1:-1:-1;;;15914:2:15;15899:18;;15892:47;15971:3;15956:19;;15568:413::o;17630:128::-;17670:3;17701:1;17697:6;17694:1;17691:13;17688:39;;;17707:18;;:::i;:::-;-1:-1:-1;17743:9:15;;17630:128::o;17763:120::-;17803:1;17829;17819:35;;17834:18;;:::i;:::-;-1:-1:-1;17868:9:15;;17763:120::o;17888:125::-;17928:4;17956:1;17953;17950:8;17947:34;;;17961:18;;:::i;:::-;-1:-1:-1;17998:9:15;;17888:125::o;18018:258::-;18090:1;18100:113;18114:6;18111:1;18108:13;18100:113;;;18190:11;;;18184:18;18171:11;;;18164:39;18136:2;18129:10;18100:113;;;18231:6;18228:1;18225:13;18222:48;;;-1:-1:-1;;18266:1:15;18248:16;;18241:27;18018:258::o;18281:380::-;18360:1;18356:12;;;;18403;;;18424:61;;18478:4;18470:6;18466:17;18456:27;;18424:61;18531:2;18523:6;18520:14;18500:18;18497:38;18494:161;;;18577:10;18572:3;18568:20;18565:1;18558:31;18612:4;18609:1;18602:15;18640:4;18637:1;18630:15;18494:161;;18281:380;;;:::o;18666:135::-;18705:3;-1:-1:-1;;18726:17:15;;18723:43;;;18746:18;;:::i;:::-;-1:-1:-1;18793:1:15;18782:13;;18666:135::o;18806:112::-;18838:1;18864;18854:35;;18869:18;;:::i;:::-;-1:-1:-1;18903:9:15;;18806:112::o;18923:127::-;18984:10;18979:3;18975:20;18972:1;18965:31;19015:4;19012:1;19005:15;19039:4;19036:1;19029:15;19055:127;19116:10;19111:3;19107:20;19104:1;19097:31;19147:4;19144:1;19137:15;19171:4;19168:1;19161:15;19187:127;19248:10;19243:3;19239:20;19236:1;19229:31;19279:4;19276:1;19269:15;19303:4;19300:1;19293:15;19319:127;19380:10;19375:3;19371:20;19368:1;19361:31;19411:4;19408:1;19401:15;19435:4;19432:1;19425:15;19451:127;19512:10;19507:3;19503:20;19500:1;19493:31;19543:4;19540:1;19533:15;19567:4;19564:1;19557:15;19583:131;-1:-1:-1;;;;;;19657:32:15;;19647:43;;19637:71;;19704:1;19701;19694:12
Swarm Source
ipfs://dd6443ec3690d63658b8b51d0acd653abc23c7451c70b43c8afc34c528139bb0
Loading...
Loading
Loading...
Loading
[ 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.