Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 51 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 22050050 | 327 days ago | IN | 0 ETH | 0.00004327 | ||||
| Safe Transfer Fr... | 21794886 | 363 days ago | IN | 0 ETH | 0.00022793 | ||||
| Safe Transfer Fr... | 19065249 | 745 days ago | IN | 0 ETH | 0.0017562 | ||||
| Safe Transfer Fr... | 19065169 | 745 days ago | IN | 0 ETH | 0.00177781 | ||||
| Set Approval For... | 18635432 | 805 days ago | IN | 0 ETH | 0.00191585 | ||||
| Safe Transfer Fr... | 18613091 | 808 days ago | IN | 0 ETH | 0.00170622 | ||||
| Set Approval For... | 18369820 | 842 days ago | IN | 0 ETH | 0.00044759 | ||||
| Set Approval For... | 17541602 | 958 days ago | IN | 0 ETH | 0.00064661 | ||||
| Set Approval For... | 17259661 | 998 days ago | IN | 0 ETH | 0.00221469 | ||||
| Safe Transfer Fr... | 17071134 | 1024 days ago | IN | 0 ETH | 0.00267578 | ||||
| Set Approval For... | 16984199 | 1037 days ago | IN | 0 ETH | 0.00092827 | ||||
| Set Approval For... | 16984199 | 1037 days ago | IN | 0 ETH | 0.00162138 | ||||
| Safe Transfer Fr... | 16452044 | 1111 days ago | IN | 0 ETH | 0.00161641 | ||||
| Set Approval For... | 16449138 | 1112 days ago | IN | 0 ETH | 0.00167108 | ||||
| Safe Transfer Fr... | 16431430 | 1114 days ago | IN | 0 ETH | 0.00206928 | ||||
| Safe Transfer Fr... | 16431415 | 1114 days ago | IN | 0 ETH | 0.00157078 | ||||
| Safe Transfer Fr... | 16431406 | 1114 days ago | IN | 0 ETH | 0.00170555 | ||||
| Safe Transfer Fr... | 16431395 | 1114 days ago | IN | 0 ETH | 0.00160898 | ||||
| Set Approval For... | 16323561 | 1129 days ago | IN | 0 ETH | 0.00089313 | ||||
| Safe Transfer Fr... | 16239565 | 1141 days ago | IN | 0 ETH | 0.00094134 | ||||
| Safe Transfer Fr... | 16205134 | 1146 days ago | IN | 0 ETH | 0.0013094 | ||||
| Safe Transfer Fr... | 16189559 | 1148 days ago | IN | 0 ETH | 0.0016541 | ||||
| Set Approval For... | 16166626 | 1151 days ago | IN | 0 ETH | 0.00067495 | ||||
| Safe Transfer Fr... | 16069055 | 1165 days ago | IN | 0 ETH | 0.00193116 | ||||
| Set Approval For... | 16047559 | 1168 days ago | IN | 0 ETH | 0.00116045 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GCCxWHOSCALL
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-11-15
*/
// File: contracts/OperatorFilter/IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilter/OperatorFilterer.sol
pragma solidity ^0.8.13;
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry constant operatorFilterRegistry =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(operatorFilterRegistry).code.length > 0) {
if (subscribe) {
operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
operatorFilterRegistry.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(operatorFilterRegistry).code.length > 0) {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from == msg.sender) {
_;
return;
}
if (
!(
operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
&& operatorFilterRegistry.isOperatorAllowed(address(this), from)
)
) {
revert OperatorNotAllowed(msg.sender);
}
}
_;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.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 `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC2981.sol
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* 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;
/**
* @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* 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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/common/ERC2981.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*
* _Available since v4.5._
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: invalid receiver");
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(
uint256 tokenId,
address receiver,
uint96 feeNumerator
) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: Invalid parameters");
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @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] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
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) {
_requireMinted(tokenId);
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 overridden 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 token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @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 _ownerOf(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) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @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 {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256, /* firstTokenId */
uint256 batchSize
) internal virtual {
if (batchSize > 1) {
if (from != address(0)) {
_balances[from] -= batchSize;
}
if (to != address(0)) {
_balances[to] += batchSize;
}
}
}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
}
// File: contracts/ERC721A.sol
// Creator: Chiru Labs
pragma solidity ^0.8.4;
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to _startTokenId()
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @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 override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
_addressData[owner].aux = aux;
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex &&
!_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) private {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is equivalent to _burn(tokenId, false)
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}
// File: contracts/GCCxWHOSCALL.sol
pragma solidity ^0.8.7;
contract GCCxWHOSCALL is ERC721A, Ownable, ERC2981, OperatorFilterer {
using Strings for uint256;
string private _baseUri;
string private _baseExtension = ".json";
uint256 public MaxSupply = 333;
uint256 public Reserved = 333;
bool public Revealed = true;
constructor(
string memory _name,
string memory _symbol,
string memory _initBaseURI,
uint96 _royaltyAmount
) ERC721A(_name, _symbol) OperatorFilterer(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6, true) {
setBaseURI(_initBaseURI);
_setDefaultRoyalty(0x9E51954aaf1d8A73Fa1E78DC55fe8637fcf805Cf, _royaltyAmount);
}
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
// Token URIs
function _baseURI() internal view virtual override returns (string memory) {
return _baseUri;
}
function tokenURI(uint256 tokenId) public view override returns (string memory)
{
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
if (Revealed == false) {
return _baseURI();
}
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, tokenId.toString(), _baseExtension))
: "";
}
// Minting
function _mint(address recipient, uint256 quantity) internal {
_safeMint(recipient, quantity);
}
function Airdrop(uint256 _num, address _recipient) public onlyOwner {
require(_num <= Reserved, "Exceeds reserved supply");
_mint(_recipient, _num);
Reserved -= _num;
}
function BatchAirdrop(address[] memory _addresses) external onlyOwner {
require(_addresses.length <= Reserved, "Exceeds reserved supply");
for (uint256 i = 0; i < _addresses.length; ) {
Airdrop(1, _addresses[i]);
unchecked {
i++;
}
}
}
function OwnerMint(uint256 _num) public onlyOwner {
require(_num <= Reserved, "Exceeds reserved supply");
_mint(msg.sender, _num);
Reserved -= _num;
}
// Admin
function setBaseURI(string memory _newBaseURI) public onlyOwner {
_baseUri = _newBaseURI;
}
function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
_baseExtension = _newBaseExtension;
}
function withdraw() public onlyOwner {
require(
payable(owner()).send(address(this).balance),
"Withdraw failed"
);
}
function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
external
onlyOwner
{
_setDefaultRoyalty(receiver, feeBasisPoints);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721A, ERC2981)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public override onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId, data);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint96","name":"_royaltyAmount","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"BatchAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"OwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a919062000930565b5061014d600d5561014d600e556001600f60006101000a81548160ff0219169083151502179055503480156200007f57600080fd5b5060405162004e5638038062004e568339818101604052810190620000a5919062000bc4565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600185858160029081620000cf919062000930565b508060039081620000e1919062000930565b50620000f26200035260201b60201c565b60008190555050506200011a6200010e6200035b60201b60201c565b6200036360201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030f578015620001d5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019b92919062000cd8565b600060405180830381600087803b158015620001b657600080fd5b505af1158015620001cb573d6000803e3d6000fd5b505050506200030e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025592919062000cd8565b600060405180830381600087803b1580156200027057600080fd5b505af115801562000285573d6000803e3d6000fd5b505050506200030d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d8919062000d05565b600060405180830381600087803b158015620002f357600080fd5b505af115801562000308573d6000803e3d6000fd5b505050505b5b5b505062000322826200042960201b60201c565b62000348739e51954aaf1d8a73fa1e78dc55fe8637fcf805cf826200044e60201b60201c565b5050505062000eaf565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000439620005f160201b60201c565b80600b90816200044a919062000930565b5050565b6200045e6200068260201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620004bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b69062000da9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005289062000e1b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620006016200035b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006276200068c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006779062000e8d565b60405180910390fd5b565b6000612710905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073857607f821691505b6020821081036200074e576200074d620006f0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000779565b620007c4868362000779565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008116200080b6200080584620007dc565b620007e6565b620007dc565b9050919050565b6000819050919050565b6200082d83620007f0565b620008456200083c8262000818565b84845462000786565b825550505050565b600090565b6200085c6200084d565b6200086981848462000822565b505050565b5b8181101562000891576200088560008262000852565b6001810190506200086f565b5050565b601f821115620008e057620008aa8162000754565b620008b58462000769565b81016020851015620008c5578190505b620008dd620008d48562000769565b8301826200086e565b50505b505050565b600082821c905092915050565b60006200090560001984600802620008e5565b1980831691505092915050565b6000620009208383620008f2565b9150826002028217905092915050565b6200093b82620006b6565b67ffffffffffffffff811115620009575762000956620006c1565b5b6200096382546200071f565b6200097082828562000895565b600060209050601f831160018114620009a8576000841562000993578287015190505b6200099f858262000912565b86555062000a0f565b601f198416620009b88662000754565b60005b82811015620009e257848901518255600182019150602085019450602081019050620009bb565b8683101562000a025784890151620009fe601f891682620008f2565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000a518262000a35565b810181811067ffffffffffffffff8211171562000a735762000a72620006c1565b5b80604052505050565b600062000a8862000a17565b905062000a96828262000a46565b919050565b600067ffffffffffffffff82111562000ab95762000ab8620006c1565b5b62000ac48262000a35565b9050602081019050919050565b60005b8381101562000af157808201518184015260208101905062000ad4565b60008484015250505050565b600062000b1462000b0e8462000a9b565b62000a7c565b90508281526020810184848401111562000b335762000b3262000a30565b5b62000b4084828562000ad1565b509392505050565b600082601f83011262000b605762000b5f62000a2b565b5b815162000b7284826020860162000afd565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b62000b9e8162000b7b565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000806000806080858703121562000be15762000be062000a21565b5b600085015167ffffffffffffffff81111562000c025762000c0162000a26565b5b62000c108782880162000b48565b945050602085015167ffffffffffffffff81111562000c345762000c3362000a26565b5b62000c428782880162000b48565b935050604085015167ffffffffffffffff81111562000c665762000c6562000a26565b5b62000c748782880162000b48565b925050606062000c878782880162000bad565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000cc08262000c93565b9050919050565b62000cd28162000cb3565b82525050565b600060408201905062000cef600083018562000cc7565b62000cfe602083018462000cc7565b9392505050565b600060208201905062000d1c600083018462000cc7565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000d91602a8362000d22565b915062000d9e8262000d33565b604082019050919050565b6000602082019050818103600083015262000dc48162000d82565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000e0360198362000d22565b915062000e108262000dcb565b602082019050919050565b6000602082019050818103600083015262000e368162000df4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e7560208362000d22565b915062000e828262000e3d565b602082019050919050565b6000602082019050818103600083015262000ea88162000e66565b9050919050565b613f978062000ebf6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063e2a7169c11610071578063e2a7169c146104c8578063e985e9c5146104e6578063f2fde38b14610516578063faf3f41e14610532576101c4565b8063b88d4fde14610460578063c87b56dd1461047c578063da3ef23f146104ac576101c4565b80638da5cb5b116100d35780638da5cb5b146103ea57806395d89b4114610408578063a22cb46514610426578063b36c128414610442576101c4565b8063715018a6146103a85780637871e154146103b25780637a69cbc5146103ce576101c4565b806323b872dd1161016657806342842e0e1161014057806342842e0e1461031057806355f804b31461032c5780636352211e1461034857806370a0823114610378576101c4565b806323b872dd146102b95780632a55205a146102d55780633ccfd60b14610306576101c4565b8063081812fc116101a2578063081812fc14610233578063095ea7b3146102635780631618c8df1461027f57806318160ddd1461029b576101c4565b806301ffc9a7146101c957806302fa7c47146101f957806306fdde0314610215575b600080fd5b6101e360048036038101906101de9190612d35565b610550565b6040516101f09190612d7d565b60405180910390f35b610213600480360381019061020e9190612e3a565b610562565b005b61021d610578565b60405161022a9190612f0a565b60405180910390f35b61024d60048036038101906102489190612f62565b61060a565b60405161025a9190612f9e565b60405180910390f35b61027d60048036038101906102789190612fb9565b610686565b005b61029960048036038101906102949190612f62565b610790565b005b6102a3610803565b6040516102b09190613008565b60405180910390f35b6102d360048036038101906102ce9190613023565b61081a565b005b6102ef60048036038101906102ea9190613076565b6109fc565b6040516102fd9291906130b6565b60405180910390f35b61030e610be6565b005b61032a60048036038101906103259190613023565b610c6b565b005b61034660048036038101906103419190613214565b610e4d565b005b610362600480360381019061035d9190612f62565b610e68565b60405161036f9190612f9e565b60405180910390f35b610392600480360381019061038d919061325d565b610e7e565b60405161039f9190613008565b60405180910390f35b6103b0610f4d565b005b6103cc60048036038101906103c7919061328a565b610f61565b005b6103e860048036038101906103e39190613392565b610fd5565b005b6103f2611065565b6040516103ff9190612f9e565b60405180910390f35b61041061108f565b60405161041d9190612f0a565b60405180910390f35b610440600480360381019061043b9190613407565b611121565b005b61044a611298565b6040516104579190613008565b60405180910390f35b61047a600480360381019061047591906134e8565b61129e565b005b61049660048036038101906104919190612f62565b611483565b6040516104a39190612f0a565b60405180910390f35b6104c660048036038101906104c19190613214565b611558565b005b6104d0611573565b6040516104dd9190612d7d565b60405180910390f35b61050060048036038101906104fb919061356b565b611586565b60405161050d9190612d7d565b60405180910390f35b610530600480360381019061052b919061325d565b61161a565b005b61053a61169d565b6040516105479190613008565b60405180910390f35b600061055b826116a3565b9050919050565b61056a61171d565b610574828261179b565b5050565b606060028054610587906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546105b3906135da565b80156106005780601f106105d557610100808354040283529160200191610600565b820191906000526020600020905b8154815290600101906020018083116105e357829003601f168201915b5050505050905090565b600061061582611930565b61064b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069182610e68565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106f8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071761197e565b73ffffffffffffffffffffffffffffffffffffffff161415801561074957506107478161074261197e565b611586565b155b15610780576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078b838383611986565b505050565b61079861171d565b600e548111156107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d490613657565b60405180910390fd5b6107e73382611a38565b80600e60008282546107f991906136a6565b9250508190555050565b600061080d611a46565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156109ea573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361088c57610887848484611a4f565b6109f6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108d59291906136da565b602060405180830381865afa1580156108f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109169190613718565b80156109a857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016109669291906136da565b602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613718565b5b6109e957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016109e09190612f9e565b60405180910390fd5b5b6109f5848484611a4f565b5b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b915760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b9b611a5f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bc79190613745565b610bd191906137b6565b90508160000151819350935050509250929050565b610bee61171d565b610bf6611065565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090613833565b60405180910390fd5b565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e3b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cdd57610cd8848484611a69565b610e47565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d269291906136da565b602060405180830381865afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190613718565b8015610df957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610db79291906136da565b602060405180830381865afa158015610dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df89190613718565b5b610e3a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e319190612f9e565b60405180910390fd5b5b610e46848484611a69565b5b50505050565b610e5561171d565b80600b9081610e6491906139ff565b5050565b6000610e7382611a89565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f5561171d565b610f5f6000611d18565b565b610f6961171d565b600e54821115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613657565b60405180910390fd5b610fb88183611a38565b81600e6000828254610fca91906136a6565b925050819055505050565b610fdd61171d565b600e5481511115611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613657565b60405180910390fd5b60005b815181101561106157611054600183838151811061104757611046613ad1565b5b6020026020010151610f61565b8080600101915050611026565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461109e906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca906135da565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b61112961197e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061119a61197e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661124761197e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161128c9190612d7d565b60405180910390a35050565b600d5481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561146f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113115761130c85858585611dde565b61147c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161135a9291906136da565b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190613718565b801561142d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113eb9291906136da565b602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190613718565b5b61146e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114659190612f9e565b60405180910390fd5b5b61147b85858585611dde565b5b5050505050565b606061148e82611930565b6114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613b72565b60405180910390fd5b60001515600f60009054906101000a900460ff161515036114f7576114f0611e5a565b9050611553565b6000611501611e5a565b90506000815111611521576040518060200160405280600081525061154f565b8061152b84611eec565b600c60405160200161153f93929190613c51565b6040516020818303038152906040525b9150505b919050565b61156061171d565b80600c908161156f91906139ff565b5050565b600f60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61162261171d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613cf4565b60405180910390fd5b61169a81611d18565b50565b600e5481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611716575061171582611fba565b5b9050919050565b61172561197e565b73ffffffffffffffffffffffffffffffffffffffff16611743611065565b73ffffffffffffffffffffffffffffffffffffffff1614611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090613d60565b60405180910390fd5b565b6117a3611a5f565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f890613df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613e5e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161193b611a46565b1115801561194a575060005482105b8015611977575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611a42828261209c565b5050565b60006001905090565b611a5a8383836120ba565b505050565b6000612710905090565b611a848383836040518060200160405280600081525061129e565b505050565b611a91612c86565b600082905080611a9f611a46565b11158015611aae575060005481105b15611ce1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611cdf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bc3578092505050611d13565b5b600115611cde57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cd9578092505050611d13565b611bc4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611de98484846120ba565b611e088373ffffffffffffffffffffffffffffffffffffffff1661256e565b8015611e1d5750611e1b84848484612591565b155b15611e54576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600b8054611e69906135da565b80601f0160208091040260200160405190810160405280929190818152602001828054611e95906135da565b8015611ee25780601f10611eb757610100808354040283529160200191611ee2565b820191906000526020600020905b815481529060010190602001808311611ec557829003601f168201915b5050505050905090565b606060006001611efb846126e1565b01905060008167ffffffffffffffff811115611f1a57611f196130e9565b5b6040519080825280601f01601f191660200182016040528015611f4c5781602001600182028036833780820191505090505b509050600082602001820190505b600115611faf578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fa357611fa2613787565b5b04945060008503611f5a575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612095575061209482612834565b5b9050919050565b6120b682826040518060200160405280600081525061289e565b5050565b60006120c582611a89565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612130576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661215161197e565b73ffffffffffffffffffffffffffffffffffffffff161480612180575061217f8561217a61197e565b611586565b5b806121c5575061218e61197e565b73ffffffffffffffffffffffffffffffffffffffff166121ad8461060a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612264576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61227185858560016128b0565b61227d60008487611986565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124fc5760005482146124fb57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256785858560016128b6565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125b761197e565b8786866040518563ffffffff1660e01b81526004016125d99493929190613ed3565b6020604051808303816000875af192505050801561261557506040513d601f19601f820116820180604052508101906126129190613f34565b60015b61268e573d8060008114612645576040519150601f19603f3d011682016040523d82523d6000602084013e61264a565b606091505b506000815103612686576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061273f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161273557612734613787565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061277c576d04ee2d6d415b85acef8100000000838161277257612771613787565b5b0492506020810190505b662386f26fc1000083106127ab57662386f26fc1000083816127a1576127a0613787565b5b0492506010810190505b6305f5e10083106127d4576305f5e10083816127ca576127c9613787565b5b0492506008810190505b61271083106127f95761271083816127ef576127ee613787565b5b0492506004810190505b6064831061281c576064838161281257612811613787565b5b0492506002810190505b600a831061282b576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128ab83838360016128bc565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612928576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612962576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61296f60008683876128b0565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b395750612b388773ffffffffffffffffffffffffffffffffffffffff1661256e565b5b15612bfe575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bae6000888480600101955088612591565b612be4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612b3f578260005414612bf957600080fd5b612c69565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612bff575b816000819055505050612c7f60008683876128b6565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d1281612cdd565b8114612d1d57600080fd5b50565b600081359050612d2f81612d09565b92915050565b600060208284031215612d4b57612d4a612cd3565b5b6000612d5984828501612d20565b91505092915050565b60008115159050919050565b612d7781612d62565b82525050565b6000602082019050612d926000830184612d6e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc382612d98565b9050919050565b612dd381612db8565b8114612dde57600080fd5b50565b600081359050612df081612dca565b92915050565b60006bffffffffffffffffffffffff82169050919050565b612e1781612df6565b8114612e2257600080fd5b50565b600081359050612e3481612e0e565b92915050565b60008060408385031215612e5157612e50612cd3565b5b6000612e5f85828601612de1565b9250506020612e7085828601612e25565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612eb4578082015181840152602081019050612e99565b60008484015250505050565b6000601f19601f8301169050919050565b6000612edc82612e7a565b612ee68185612e85565b9350612ef6818560208601612e96565b612eff81612ec0565b840191505092915050565b60006020820190508181036000830152612f248184612ed1565b905092915050565b6000819050919050565b612f3f81612f2c565b8114612f4a57600080fd5b50565b600081359050612f5c81612f36565b92915050565b600060208284031215612f7857612f77612cd3565b5b6000612f8684828501612f4d565b91505092915050565b612f9881612db8565b82525050565b6000602082019050612fb36000830184612f8f565b92915050565b60008060408385031215612fd057612fcf612cd3565b5b6000612fde85828601612de1565b9250506020612fef85828601612f4d565b9150509250929050565b61300281612f2c565b82525050565b600060208201905061301d6000830184612ff9565b92915050565b60008060006060848603121561303c5761303b612cd3565b5b600061304a86828701612de1565b935050602061305b86828701612de1565b925050604061306c86828701612f4d565b9150509250925092565b6000806040838503121561308d5761308c612cd3565b5b600061309b85828601612f4d565b92505060206130ac85828601612f4d565b9150509250929050565b60006040820190506130cb6000830185612f8f565b6130d86020830184612ff9565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312182612ec0565b810181811067ffffffffffffffff821117156131405761313f6130e9565b5b80604052505050565b6000613153612cc9565b905061315f8282613118565b919050565b600067ffffffffffffffff82111561317f5761317e6130e9565b5b61318882612ec0565b9050602081019050919050565b82818337600083830152505050565b60006131b76131b284613164565b613149565b9050828152602081018484840111156131d3576131d26130e4565b5b6131de848285613195565b509392505050565b600082601f8301126131fb576131fa6130df565b5b813561320b8482602086016131a4565b91505092915050565b60006020828403121561322a57613229612cd3565b5b600082013567ffffffffffffffff81111561324857613247612cd8565b5b613254848285016131e6565b91505092915050565b60006020828403121561327357613272612cd3565b5b600061328184828501612de1565b91505092915050565b600080604083850312156132a1576132a0612cd3565b5b60006132af85828601612f4d565b92505060206132c085828601612de1565b9150509250929050565b600067ffffffffffffffff8211156132e5576132e46130e9565b5b602082029050602081019050919050565b600080fd5b600061330e613309846132ca565b613149565b90508083825260208201905060208402830185811115613331576133306132f6565b5b835b8181101561335a57806133468882612de1565b845260208401935050602081019050613333565b5050509392505050565b600082601f830112613379576133786130df565b5b81356133898482602086016132fb565b91505092915050565b6000602082840312156133a8576133a7612cd3565b5b600082013567ffffffffffffffff8111156133c6576133c5612cd8565b5b6133d284828501613364565b91505092915050565b6133e481612d62565b81146133ef57600080fd5b50565b600081359050613401816133db565b92915050565b6000806040838503121561341e5761341d612cd3565b5b600061342c85828601612de1565b925050602061343d858286016133f2565b9150509250929050565b600067ffffffffffffffff821115613462576134616130e9565b5b61346b82612ec0565b9050602081019050919050565b600061348b61348684613447565b613149565b9050828152602081018484840111156134a7576134a66130e4565b5b6134b2848285613195565b509392505050565b600082601f8301126134cf576134ce6130df565b5b81356134df848260208601613478565b91505092915050565b6000806000806080858703121561350257613501612cd3565b5b600061351087828801612de1565b945050602061352187828801612de1565b935050604061353287828801612f4d565b925050606085013567ffffffffffffffff81111561355357613552612cd8565b5b61355f878288016134ba565b91505092959194509250565b6000806040838503121561358257613581612cd3565b5b600061359085828601612de1565b92505060206135a185828601612de1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135f257607f821691505b602082108103613605576136046135ab565b5b50919050565b7f4578636565647320726573657276656420737570706c79000000000000000000600082015250565b6000613641601783612e85565b915061364c8261360b565b602082019050919050565b6000602082019050818103600083015261367081613634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136b182612f2c565b91506136bc83612f2c565b92508282039050818111156136d4576136d3613677565b5b92915050565b60006040820190506136ef6000830185612f8f565b6136fc6020830184612f8f565b9392505050565b600081519050613712816133db565b92915050565b60006020828403121561372e5761372d612cd3565b5b600061373c84828501613703565b91505092915050565b600061375082612f2c565b915061375b83612f2c565b925082820261376981612f2c565b915082820484148315176137805761377f613677565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137c182612f2c565b91506137cc83612f2c565b9250826137dc576137db613787565b5b828204905092915050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b600061381d600f83612e85565b9150613828826137e7565b602082019050919050565b6000602082019050818103600083015261384c81613810565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613878565b6138bf8683613878565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138fc6138f76138f284612f2c565b6138d7565b612f2c565b9050919050565b6000819050919050565b613916836138e1565b61392a61392282613903565b848454613885565b825550505050565b600090565b61393f613932565b61394a81848461390d565b505050565b5b8181101561396e57613963600082613937565b600181019050613950565b5050565b601f8211156139b35761398481613853565b61398d84613868565b8101602085101561399c578190505b6139b06139a885613868565b83018261394f565b50505b505050565b600082821c905092915050565b60006139d6600019846008026139b8565b1980831691505092915050565b60006139ef83836139c5565b9150826002028217905092915050565b613a0882612e7a565b67ffffffffffffffff811115613a2157613a206130e9565b5b613a2b82546135da565b613a36828285613972565b600060209050601f831160018114613a695760008415613a57578287015190505b613a6185826139e3565b865550613ac9565b601f198416613a7786613853565b60005b82811015613a9f57848901518255600182019150602085019450602081019050613a7a565b86831015613abc5784890151613ab8601f8916826139c5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b5c602f83612e85565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b600081905092915050565b6000613ba882612e7a565b613bb28185613b92565b9350613bc2818560208601612e96565b80840191505092915050565b60008154613bdb816135da565b613be58186613b92565b94506001821660008114613c005760018114613c1557613c48565b60ff1983168652811515820286019350613c48565b613c1e85613853565b60005b83811015613c4057815481890152600182019150602081019050613c21565b838801955050505b50505092915050565b6000613c5d8286613b9d565b9150613c698285613b9d565b9150613c758284613bce565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cde602683612e85565b9150613ce982613c82565b604082019050919050565b60006020820190508181036000830152613d0d81613cd1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d4a602083612e85565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613ddc602a83612e85565b9150613de782613d80565b604082019050919050565b60006020820190508181036000830152613e0b81613dcf565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613e48601983612e85565b9150613e5382613e12565b602082019050919050565b60006020820190508181036000830152613e7781613e3b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ea582613e7e565b613eaf8185613e89565b9350613ebf818560208601612e96565b613ec881612ec0565b840191505092915050565b6000608082019050613ee86000830187612f8f565b613ef56020830186612f8f565b613f026040830185612ff9565b8181036060830152613f148184613e9a565b905095945050505050565b600081519050613f2e81612d09565b92915050565b600060208284031215613f4a57613f49612cd3565b5b6000613f5884828501613f1f565b9150509291505056fea2646970667358221220d4dcdb71a3a3f148bbc77675a23b14a3b736cd1b8b14b0b440dde72d4e71b7f364736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000e47434320782057484f5343414c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b47434357484f5343414c4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d517a6f66483472694c386d7658543173373163526f61584b45504339583563567245735a4c434a7861396e762f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063e2a7169c11610071578063e2a7169c146104c8578063e985e9c5146104e6578063f2fde38b14610516578063faf3f41e14610532576101c4565b8063b88d4fde14610460578063c87b56dd1461047c578063da3ef23f146104ac576101c4565b80638da5cb5b116100d35780638da5cb5b146103ea57806395d89b4114610408578063a22cb46514610426578063b36c128414610442576101c4565b8063715018a6146103a85780637871e154146103b25780637a69cbc5146103ce576101c4565b806323b872dd1161016657806342842e0e1161014057806342842e0e1461031057806355f804b31461032c5780636352211e1461034857806370a0823114610378576101c4565b806323b872dd146102b95780632a55205a146102d55780633ccfd60b14610306576101c4565b8063081812fc116101a2578063081812fc14610233578063095ea7b3146102635780631618c8df1461027f57806318160ddd1461029b576101c4565b806301ffc9a7146101c957806302fa7c47146101f957806306fdde0314610215575b600080fd5b6101e360048036038101906101de9190612d35565b610550565b6040516101f09190612d7d565b60405180910390f35b610213600480360381019061020e9190612e3a565b610562565b005b61021d610578565b60405161022a9190612f0a565b60405180910390f35b61024d60048036038101906102489190612f62565b61060a565b60405161025a9190612f9e565b60405180910390f35b61027d60048036038101906102789190612fb9565b610686565b005b61029960048036038101906102949190612f62565b610790565b005b6102a3610803565b6040516102b09190613008565b60405180910390f35b6102d360048036038101906102ce9190613023565b61081a565b005b6102ef60048036038101906102ea9190613076565b6109fc565b6040516102fd9291906130b6565b60405180910390f35b61030e610be6565b005b61032a60048036038101906103259190613023565b610c6b565b005b61034660048036038101906103419190613214565b610e4d565b005b610362600480360381019061035d9190612f62565b610e68565b60405161036f9190612f9e565b60405180910390f35b610392600480360381019061038d919061325d565b610e7e565b60405161039f9190613008565b60405180910390f35b6103b0610f4d565b005b6103cc60048036038101906103c7919061328a565b610f61565b005b6103e860048036038101906103e39190613392565b610fd5565b005b6103f2611065565b6040516103ff9190612f9e565b60405180910390f35b61041061108f565b60405161041d9190612f0a565b60405180910390f35b610440600480360381019061043b9190613407565b611121565b005b61044a611298565b6040516104579190613008565b60405180910390f35b61047a600480360381019061047591906134e8565b61129e565b005b61049660048036038101906104919190612f62565b611483565b6040516104a39190612f0a565b60405180910390f35b6104c660048036038101906104c19190613214565b611558565b005b6104d0611573565b6040516104dd9190612d7d565b60405180910390f35b61050060048036038101906104fb919061356b565b611586565b60405161050d9190612d7d565b60405180910390f35b610530600480360381019061052b919061325d565b61161a565b005b61053a61169d565b6040516105479190613008565b60405180910390f35b600061055b826116a3565b9050919050565b61056a61171d565b610574828261179b565b5050565b606060028054610587906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546105b3906135da565b80156106005780601f106105d557610100808354040283529160200191610600565b820191906000526020600020905b8154815290600101906020018083116105e357829003601f168201915b5050505050905090565b600061061582611930565b61064b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061069182610e68565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106f8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661071761197e565b73ffffffffffffffffffffffffffffffffffffffff161415801561074957506107478161074261197e565b611586565b155b15610780576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078b838383611986565b505050565b61079861171d565b600e548111156107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d490613657565b60405180910390fd5b6107e73382611a38565b80600e60008282546107f991906136a6565b9250508190555050565b600061080d611a46565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156109ea573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361088c57610887848484611a4f565b6109f6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108d59291906136da565b602060405180830381865afa1580156108f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109169190613718565b80156109a857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016109669291906136da565b602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613718565b5b6109e957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016109e09190612f9e565b60405180910390fd5b5b6109f5848484611a4f565b5b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b915760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b9b611a5f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bc79190613745565b610bd191906137b6565b90508160000151819350935050509250929050565b610bee61171d565b610bf6611065565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090613833565b60405180910390fd5b565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e3b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cdd57610cd8848484611a69565b610e47565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d269291906136da565b602060405180830381865afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190613718565b8015610df957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610db79291906136da565b602060405180830381865afa158015610dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df89190613718565b5b610e3a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e319190612f9e565b60405180910390fd5b5b610e46848484611a69565b5b50505050565b610e5561171d565b80600b9081610e6491906139ff565b5050565b6000610e7382611a89565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f5561171d565b610f5f6000611d18565b565b610f6961171d565b600e54821115610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613657565b60405180910390fd5b610fb88183611a38565b81600e6000828254610fca91906136a6565b925050819055505050565b610fdd61171d565b600e5481511115611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613657565b60405180910390fd5b60005b815181101561106157611054600183838151811061104757611046613ad1565b5b6020026020010151610f61565b8080600101915050611026565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461109e906135da565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca906135da565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b61112961197e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061119a61197e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661124761197e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161128c9190612d7d565b60405180910390a35050565b600d5481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561146f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113115761130c85858585611dde565b61147c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161135a9291906136da565b602060405180830381865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b9190613718565b801561142d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113eb9291906136da565b602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190613718565b5b61146e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114659190612f9e565b60405180910390fd5b5b61147b85858585611dde565b5b5050505050565b606061148e82611930565b6114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613b72565b60405180910390fd5b60001515600f60009054906101000a900460ff161515036114f7576114f0611e5a565b9050611553565b6000611501611e5a565b90506000815111611521576040518060200160405280600081525061154f565b8061152b84611eec565b600c60405160200161153f93929190613c51565b6040516020818303038152906040525b9150505b919050565b61156061171d565b80600c908161156f91906139ff565b5050565b600f60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61162261171d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613cf4565b60405180910390fd5b61169a81611d18565b50565b600e5481565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611716575061171582611fba565b5b9050919050565b61172561197e565b73ffffffffffffffffffffffffffffffffffffffff16611743611065565b73ffffffffffffffffffffffffffffffffffffffff1614611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090613d60565b60405180910390fd5b565b6117a3611a5f565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f890613df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186790613e5e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161193b611a46565b1115801561194a575060005482105b8015611977575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611a42828261209c565b5050565b60006001905090565b611a5a8383836120ba565b505050565b6000612710905090565b611a848383836040518060200160405280600081525061129e565b505050565b611a91612c86565b600082905080611a9f611a46565b11158015611aae575060005481105b15611ce1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611cdf57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bc3578092505050611d13565b5b600115611cde57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cd9578092505050611d13565b611bc4565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611de98484846120ba565b611e088373ffffffffffffffffffffffffffffffffffffffff1661256e565b8015611e1d5750611e1b84848484612591565b155b15611e54576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600b8054611e69906135da565b80601f0160208091040260200160405190810160405280929190818152602001828054611e95906135da565b8015611ee25780601f10611eb757610100808354040283529160200191611ee2565b820191906000526020600020905b815481529060010190602001808311611ec557829003601f168201915b5050505050905090565b606060006001611efb846126e1565b01905060008167ffffffffffffffff811115611f1a57611f196130e9565b5b6040519080825280601f01601f191660200182016040528015611f4c5781602001600182028036833780820191505090505b509050600082602001820190505b600115611faf578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fa357611fa2613787565b5b04945060008503611f5a575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612095575061209482612834565b5b9050919050565b6120b682826040518060200160405280600081525061289e565b5050565b60006120c582611a89565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612130576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661215161197e565b73ffffffffffffffffffffffffffffffffffffffff161480612180575061217f8561217a61197e565b611586565b5b806121c5575061218e61197e565b73ffffffffffffffffffffffffffffffffffffffff166121ad8461060a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612264576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61227185858560016128b0565b61227d60008487611986565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124fc5760005482146124fb57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461256785858560016128b6565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125b761197e565b8786866040518563ffffffff1660e01b81526004016125d99493929190613ed3565b6020604051808303816000875af192505050801561261557506040513d601f19601f820116820180604052508101906126129190613f34565b60015b61268e573d8060008114612645576040519150601f19603f3d011682016040523d82523d6000602084013e61264a565b606091505b506000815103612686576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061273f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161273557612734613787565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061277c576d04ee2d6d415b85acef8100000000838161277257612771613787565b5b0492506020810190505b662386f26fc1000083106127ab57662386f26fc1000083816127a1576127a0613787565b5b0492506010810190505b6305f5e10083106127d4576305f5e10083816127ca576127c9613787565b5b0492506008810190505b61271083106127f95761271083816127ef576127ee613787565b5b0492506004810190505b6064831061281c576064838161281257612811613787565b5b0492506002810190505b600a831061282b576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128ab83838360016128bc565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612928576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612962576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61296f60008683876128b0565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b395750612b388773ffffffffffffffffffffffffffffffffffffffff1661256e565b5b15612bfe575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bae6000888480600101955088612591565b612be4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612b3f578260005414612bf957600080fd5b612c69565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612bff575b816000819055505050612c7f60008683876128b6565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d1281612cdd565b8114612d1d57600080fd5b50565b600081359050612d2f81612d09565b92915050565b600060208284031215612d4b57612d4a612cd3565b5b6000612d5984828501612d20565b91505092915050565b60008115159050919050565b612d7781612d62565b82525050565b6000602082019050612d926000830184612d6e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc382612d98565b9050919050565b612dd381612db8565b8114612dde57600080fd5b50565b600081359050612df081612dca565b92915050565b60006bffffffffffffffffffffffff82169050919050565b612e1781612df6565b8114612e2257600080fd5b50565b600081359050612e3481612e0e565b92915050565b60008060408385031215612e5157612e50612cd3565b5b6000612e5f85828601612de1565b9250506020612e7085828601612e25565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612eb4578082015181840152602081019050612e99565b60008484015250505050565b6000601f19601f8301169050919050565b6000612edc82612e7a565b612ee68185612e85565b9350612ef6818560208601612e96565b612eff81612ec0565b840191505092915050565b60006020820190508181036000830152612f248184612ed1565b905092915050565b6000819050919050565b612f3f81612f2c565b8114612f4a57600080fd5b50565b600081359050612f5c81612f36565b92915050565b600060208284031215612f7857612f77612cd3565b5b6000612f8684828501612f4d565b91505092915050565b612f9881612db8565b82525050565b6000602082019050612fb36000830184612f8f565b92915050565b60008060408385031215612fd057612fcf612cd3565b5b6000612fde85828601612de1565b9250506020612fef85828601612f4d565b9150509250929050565b61300281612f2c565b82525050565b600060208201905061301d6000830184612ff9565b92915050565b60008060006060848603121561303c5761303b612cd3565b5b600061304a86828701612de1565b935050602061305b86828701612de1565b925050604061306c86828701612f4d565b9150509250925092565b6000806040838503121561308d5761308c612cd3565b5b600061309b85828601612f4d565b92505060206130ac85828601612f4d565b9150509250929050565b60006040820190506130cb6000830185612f8f565b6130d86020830184612ff9565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312182612ec0565b810181811067ffffffffffffffff821117156131405761313f6130e9565b5b80604052505050565b6000613153612cc9565b905061315f8282613118565b919050565b600067ffffffffffffffff82111561317f5761317e6130e9565b5b61318882612ec0565b9050602081019050919050565b82818337600083830152505050565b60006131b76131b284613164565b613149565b9050828152602081018484840111156131d3576131d26130e4565b5b6131de848285613195565b509392505050565b600082601f8301126131fb576131fa6130df565b5b813561320b8482602086016131a4565b91505092915050565b60006020828403121561322a57613229612cd3565b5b600082013567ffffffffffffffff81111561324857613247612cd8565b5b613254848285016131e6565b91505092915050565b60006020828403121561327357613272612cd3565b5b600061328184828501612de1565b91505092915050565b600080604083850312156132a1576132a0612cd3565b5b60006132af85828601612f4d565b92505060206132c085828601612de1565b9150509250929050565b600067ffffffffffffffff8211156132e5576132e46130e9565b5b602082029050602081019050919050565b600080fd5b600061330e613309846132ca565b613149565b90508083825260208201905060208402830185811115613331576133306132f6565b5b835b8181101561335a57806133468882612de1565b845260208401935050602081019050613333565b5050509392505050565b600082601f830112613379576133786130df565b5b81356133898482602086016132fb565b91505092915050565b6000602082840312156133a8576133a7612cd3565b5b600082013567ffffffffffffffff8111156133c6576133c5612cd8565b5b6133d284828501613364565b91505092915050565b6133e481612d62565b81146133ef57600080fd5b50565b600081359050613401816133db565b92915050565b6000806040838503121561341e5761341d612cd3565b5b600061342c85828601612de1565b925050602061343d858286016133f2565b9150509250929050565b600067ffffffffffffffff821115613462576134616130e9565b5b61346b82612ec0565b9050602081019050919050565b600061348b61348684613447565b613149565b9050828152602081018484840111156134a7576134a66130e4565b5b6134b2848285613195565b509392505050565b600082601f8301126134cf576134ce6130df565b5b81356134df848260208601613478565b91505092915050565b6000806000806080858703121561350257613501612cd3565b5b600061351087828801612de1565b945050602061352187828801612de1565b935050604061353287828801612f4d565b925050606085013567ffffffffffffffff81111561355357613552612cd8565b5b61355f878288016134ba565b91505092959194509250565b6000806040838503121561358257613581612cd3565b5b600061359085828601612de1565b92505060206135a185828601612de1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135f257607f821691505b602082108103613605576136046135ab565b5b50919050565b7f4578636565647320726573657276656420737570706c79000000000000000000600082015250565b6000613641601783612e85565b915061364c8261360b565b602082019050919050565b6000602082019050818103600083015261367081613634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136b182612f2c565b91506136bc83612f2c565b92508282039050818111156136d4576136d3613677565b5b92915050565b60006040820190506136ef6000830185612f8f565b6136fc6020830184612f8f565b9392505050565b600081519050613712816133db565b92915050565b60006020828403121561372e5761372d612cd3565b5b600061373c84828501613703565b91505092915050565b600061375082612f2c565b915061375b83612f2c565b925082820261376981612f2c565b915082820484148315176137805761377f613677565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137c182612f2c565b91506137cc83612f2c565b9250826137dc576137db613787565b5b828204905092915050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b600061381d600f83612e85565b9150613828826137e7565b602082019050919050565b6000602082019050818103600083015261384c81613810565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613878565b6138bf8683613878565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138fc6138f76138f284612f2c565b6138d7565b612f2c565b9050919050565b6000819050919050565b613916836138e1565b61392a61392282613903565b848454613885565b825550505050565b600090565b61393f613932565b61394a81848461390d565b505050565b5b8181101561396e57613963600082613937565b600181019050613950565b5050565b601f8211156139b35761398481613853565b61398d84613868565b8101602085101561399c578190505b6139b06139a885613868565b83018261394f565b50505b505050565b600082821c905092915050565b60006139d6600019846008026139b8565b1980831691505092915050565b60006139ef83836139c5565b9150826002028217905092915050565b613a0882612e7a565b67ffffffffffffffff811115613a2157613a206130e9565b5b613a2b82546135da565b613a36828285613972565b600060209050601f831160018114613a695760008415613a57578287015190505b613a6185826139e3565b865550613ac9565b601f198416613a7786613853565b60005b82811015613a9f57848901518255600182019150602085019450602081019050613a7a565b86831015613abc5784890151613ab8601f8916826139c5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b5c602f83612e85565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b600081905092915050565b6000613ba882612e7a565b613bb28185613b92565b9350613bc2818560208601612e96565b80840191505092915050565b60008154613bdb816135da565b613be58186613b92565b94506001821660008114613c005760018114613c1557613c48565b60ff1983168652811515820286019350613c48565b613c1e85613853565b60005b83811015613c4057815481890152600182019150602081019050613c21565b838801955050505b50505092915050565b6000613c5d8286613b9d565b9150613c698285613b9d565b9150613c758284613bce565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cde602683612e85565b9150613ce982613c82565b604082019050919050565b60006020820190508181036000830152613d0d81613cd1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d4a602083612e85565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613ddc602a83612e85565b9150613de782613d80565b604082019050919050565b60006020820190508181036000830152613e0b81613dcf565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613e48601983612e85565b9150613e5382613e12565b602082019050919050565b60006020820190508181036000830152613e7781613e3b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ea582613e7e565b613eaf8185613e89565b9350613ebf818560208601612e96565b613ec881612ec0565b840191505092915050565b6000608082019050613ee86000830187612f8f565b613ef56020830186612f8f565b613f026040830185612ff9565b8181036060830152613f148184613e9a565b905095945050505050565b600081519050613f2e81612d09565b92915050565b600060208284031215613f4a57613f49612cd3565b5b6000613f5884828501613f1f565b9150509291505056fea2646970667358221220d4dcdb71a3a3f148bbc77675a23b14a3b736cd1b8b14b0b440dde72d4e71b7f364736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000e47434320782057484f5343414c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b47434357484f5343414c4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d517a6f66483472694c386d7658543173373163526f61584b45504339583563567245735a4c434a7861396e762f00000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): GCC x WHOSCALL
Arg [1] : _symbol (string): GCCWHOSCALL
Arg [2] : _initBaseURI (string): ipfs://QmQzofH4riL8mvXT1s71cRoaXKEPC9X5cVrEsZLCJxa9nv/
Arg [3] : _royaltyAmount (uint96): 800
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [5] : 47434320782057484f5343414c4c000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 47434357484f5343414c4c000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d517a6f66483472694c386d7658543173373163526f6158
Arg [10] : 4b45504339583563567245735a4c434a7861396e762f00000000000000000000
Deployed Bytecode Sourcemap
85828:3565:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88521:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88343:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71107:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72610:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72173:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87766:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67243:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88733:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15768:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;88192:143;;;:::i;:::-;;88938:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87958:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70915:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68363:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45668:103;;;:::i;:::-;;87272:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87471:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45020:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71276:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72886:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86008:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89151:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86699:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88063:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86079:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73244:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45926:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86043:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88521:204;88652:4;88681:36;88705:11;88681:23;:36::i;:::-;88674:43;;88521:204;;;:::o;88343:170::-;44906:13;:11;:13::i;:::-;88461:44:::1;88480:8;88490:14;88461:18;:44::i;:::-;88343:170:::0;;:::o;71107:100::-;71161:13;71194:5;71187:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71107:100;:::o;72610:204::-;72678:7;72703:16;72711:7;72703;:16::i;:::-;72698:64;;72728:34;;;;;;;;;;;;;;72698:64;72782:15;:24;72798:7;72782:24;;;;;;;;;;;;;;;;;;;;;72775:31;;72610:204;;;:::o;72173:371::-;72246:13;72262:24;72278:7;72262:15;:24::i;:::-;72246:40;;72307:5;72301:11;;:2;:11;;;72297:48;;72321:24;;;;;;;;;;;;;;72297:48;72378:5;72362:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;72388:37;72405:5;72412:12;:10;:12::i;:::-;72388:16;:37::i;:::-;72387:38;72362:63;72358:138;;;72449:35;;;;;;;;;;;;;;72358:138;72508:28;72517:2;72521:7;72530:5;72508:8;:28::i;:::-;72235:309;72173:371;;:::o;87766:172::-;44906:13;:11;:13::i;:::-;87839:8:::1;;87831:4;:16;;87823:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;87884:23;87890:10;87902:4;87884:5;:23::i;:::-;87928:4;87916:8;;:16;;;;;;;:::i;:::-;;;;;;;;87766:172:::0;:::o;67243:303::-;67287:7;67512:15;:13;:15::i;:::-;67497:12;;67481:13;;:28;:46;67474:53;;67243:303;:::o;88733:197::-;88868:4;3624:1;2438:42;3578:43;;;:47;3574:699;;;3865:10;3857:18;;:4;:18;;;3853:85;;88885:37:::1;88904:4;88910:2;88914:7;88885:18;:37::i;:::-;3916:7:::0;;3853:85;2438:42;3998:40;;;4047:4;4054:10;3998:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2438:42;4094:40;;;4143:4;4150;4094:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3998:157;3952:310;;4235:10;4216:30;;;;;;;;;;;:::i;:::-;;;;;;;;3952:310;3574:699;88885:37:::1;88904:4;88910:2;88914:7;88885:18;:37::i;:::-;88733:197:::0;;;;;:::o;15768:442::-;15865:7;15874;15894:26;15923:17;:27;15941:8;15923:27;;;;;;;;;;;15894:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15995:1;15967:30;;:7;:16;;;:30;;;15963:92;;16024:19;16014:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15963:92;16067:21;16132:17;:15;:17::i;:::-;16091:58;;16105:7;:23;;;16092:36;;:10;:36;;;;:::i;:::-;16091:58;;;;:::i;:::-;16067:82;;16170:7;:16;;;16188:13;16162:40;;;;;;15768:442;;;;;:::o;88192:143::-;44906:13;:11;:13::i;:::-;88260:7:::1;:5;:7::i;:::-;88252:21;;:44;88274:21;88252:44;;;;;;;;;;;;;;;;;;;;;;;88236:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;88192:143::o:0;88938:205::-;89077:4;3624:1;2438:42;3578:43;;;:47;3574:699;;;3865:10;3857:18;;:4;:18;;;3853:85;;89094:41:::1;89117:4;89123:2;89127:7;89094:22;:41::i;:::-;3916:7:::0;;3853:85;2438:42;3998:40;;;4047:4;4054:10;3998:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2438:42;4094:40;;;4143:4;4150;4094:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3998:157;3952:310;;4235:10;4216:30;;;;;;;;;;;:::i;:::-;;;;;;;;3952:310;3574:699;89094:41:::1;89117:4;89123:2;89127:7;89094:22;:41::i;:::-;88938:205:::0;;;;;:::o;87958:99::-;44906:13;:11;:13::i;:::-;88040:11:::1;88029:8;:22;;;;;;:::i;:::-;;87958:99:::0;:::o;70915:125::-;70979:7;71006:21;71019:7;71006:12;:21::i;:::-;:26;;;70999:33;;70915:125;;;:::o;68363:206::-;68427:7;68468:1;68451:19;;:5;:19;;;68447:60;;68479:28;;;;;;;;;;;;;;68447:60;68533:12;:19;68546:5;68533:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;68525:36;;68518:43;;68363:206;;;:::o;45668:103::-;44906:13;:11;:13::i;:::-;45733:30:::1;45760:1;45733:18;:30::i;:::-;45668:103::o:0;87272:193::-;44906:13;:11;:13::i;:::-;87363:8:::1;;87355:4;:16;;87347:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;87411:23;87417:10;87429:4;87411:5;:23::i;:::-;87455:4;87443:8;;:16;;;;;;;:::i;:::-;;;;;;;;87272:193:::0;;:::o;87471:289::-;44906:13;:11;:13::i;:::-;87577:8:::1;;87556:10;:17;:29;;87548:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;87627:9;87622:133;87646:10;:17;87642:1;:21;87622:133;;;87676:25;87684:1;87687:10;87698:1;87687:13;;;;;;;;:::i;:::-;;;;;;;;87676:7;:25::i;:::-;87735:3;;;;;;;87622:133;;;;87471:289:::0;:::o;45020:87::-;45066:7;45093:6;;;;;;;;;;;45086:13;;45020:87;:::o;71276:104::-;71332:13;71365:7;71358:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71276:104;:::o;72886:287::-;72997:12;:10;:12::i;:::-;72985:24;;:8;:24;;;72981:54;;73018:17;;;;;;;;;;;;;;72981:54;73093:8;73048:18;:32;73067:12;:10;:12::i;:::-;73048:32;;;;;;;;;;;;;;;:42;73081:8;73048:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;73146:8;73117:48;;73132:12;:10;:12::i;:::-;73117:48;;;73156:8;73117:48;;;;;;:::i;:::-;;;;;;;;72886:287;;:::o;86008:30::-;;;;:::o;89151:239::-;89318:4;3624:1;2438:42;3578:43;;;:47;3574:699;;;3865:10;3857:18;;:4;:18;;;3853:85;;89335:47:::1;89358:4;89364:2;89368:7;89377:4;89335:22;:47::i;:::-;3916:7:::0;;3853:85;2438:42;3998:40;;;4047:4;4054:10;3998:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2438:42;4094:40;;;4143:4;4150;4094:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3998:157;3952:310;;4235:10;4216:30;;;;;;;;;;;:::i;:::-;;;;;;;;3952:310;3574:699;89335:47:::1;89358:4;89364:2;89368:7;89377:4;89335:22;:47::i;:::-;89151:239:::0;;;;;;:::o;86699:441::-;86764:13;86797:16;86805:7;86797;:16::i;:::-;86789:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;86890:5;86878:17;;:8;;;;;;;;;;;:17;;;86874:59;;86915:10;:8;:10::i;:::-;86908:17;;;;86874:59;86945:28;86976:10;:8;:10::i;:::-;86945:41;;87031:1;87006:14;87000:28;:32;:134;;;;;;;;;;;;;;;;;87068:14;87084:18;:7;:16;:18::i;:::-;87104:14;87051:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87000:134;86993:141;;;86699:441;;;;:::o;88063:123::-;44906:13;:11;:13::i;:::-;88163:17:::1;88146:14;:34;;;;;;:::i;:::-;;88063:123:::0;:::o;86079:27::-;;;;;;;;;;;;;:::o;73244:164::-;73341:4;73365:18;:25;73384:5;73365:25;;;;;;;;;;;;;;;:35;73391:8;73365:35;;;;;;;;;;;;;;;;;;;;;;;;;73358:42;;73244:164;;;;:::o;45926:201::-;44906:13;:11;:13::i;:::-;46035:1:::1;46015:22;;:8;:22;;::::0;46007:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46091:28;46110:8;46091:18;:28::i;:::-;45926:201:::0;:::o;86043:29::-;;;;:::o;15498:215::-;15600:4;15639:26;15624:41;;;:11;:41;;;;:81;;;;15669:36;15693:11;15669:23;:36::i;:::-;15624:81;15617:88;;15498:215;;;:::o;45185:132::-;45260:12;:10;:12::i;:::-;45249:23;;:7;:5;:7::i;:::-;:23;;;45241:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45185:132::o;16860:332::-;16979:17;:15;:17::i;:::-;16963:33;;:12;:33;;;;16955:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;17082:1;17062:22;;:8;:22;;;17054:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17149:35;;;;;;;;17161:8;17149:35;;;;;;17171:12;17149:35;;;;;17127:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16860:332;;:::o;74596:187::-;74653:4;74696:7;74677:15;:13;:15::i;:::-;:26;;:53;;;;;74717:13;;74707:7;:23;74677:53;:98;;;;;74748:11;:20;74760:7;74748:20;;;;;;;;;;;:27;;;;;;;;;;;;74747:28;74677:98;74670:105;;74596:187;;;:::o;43571:98::-;43624:7;43651:10;43644:17;;43571:98;:::o;82766:196::-;82908:2;82881:15;:24;82897:7;82881:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;82946:7;82942:2;82926:28;;82935:5;82926:28;;;;;;;;;;;;82766:196;;;:::o;87162:104::-;87230:30;87240:9;87251:8;87230:9;:30::i;:::-;87162:104;;:::o;86472:95::-;86537:7;86560:1;86553:8;;86472:95;:::o;73475:170::-;73609:28;73619:4;73625:2;73629:7;73609:9;:28::i;:::-;73475:170;;;:::o;16492:97::-;16550:6;16576:5;16569:12;;16492:97;:::o;73716:185::-;73854:39;73871:4;73877:2;73881:7;73854:39;;;;;;;;;;;;:16;:39::i;:::-;73716:185;;;:::o;69744:1109::-;69806:21;;:::i;:::-;69840:12;69855:7;69840:22;;69923:4;69904:15;:13;:15::i;:::-;:23;;:47;;;;;69938:13;;69931:4;:20;69904:47;69900:886;;;69972:31;70006:11;:17;70018:4;70006:17;;;;;;;;;;;69972:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70047:9;:16;;;70042:729;;70118:1;70092:28;;:9;:14;;;:28;;;70088:101;;70156:9;70149:16;;;;;;70088:101;70491:261;70498:4;70491:261;;;70531:6;;;;;;;;70576:11;:17;70588:4;70576:17;;;;;;;;;;;70564:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70650:1;70624:28;;:9;:14;;;:28;;;70620:109;;70692:9;70685:16;;;;;;70620:109;70491:261;;;70042:729;69953:833;69900:886;70814:31;;;;;;;;;;;;;;69744:1109;;;;:::o;46287:191::-;46361:16;46380:6;;;;;;;;;;;46361:25;;46406:8;46397:6;;:17;;;;;;;;;;;;;;;;;;46461:8;46430:40;;46451:8;46430:40;;;;;;;;;;;;46350:128;46287:191;:::o;73972:369::-;74139:28;74149:4;74155:2;74159:7;74139:9;:28::i;:::-;74182:15;:2;:13;;;:15::i;:::-;:76;;;;;74202:56;74233:4;74239:2;74243:7;74252:5;74202:30;:56::i;:::-;74201:57;74182:76;74178:156;;;74282:40;;;;;;;;;;;;;;74178:156;73972:369;;;;:::o;86590:103::-;86650:13;86679:8;86672:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86590:103;:::o;31570:716::-;31626:13;31677:14;31714:1;31694:17;31705:5;31694:10;:17::i;:::-;:21;31677:38;;31730:20;31764:6;31753:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31730:41;;31786:11;31915:6;31911:2;31907:15;31899:6;31895:28;31888:35;;31952:288;31959:4;31952:288;;;31984:5;;;;;;;;32126:8;32121:2;32114:5;32110:14;32105:30;32100:3;32092:44;32182:2;32173:11;;;;;;:::i;:::-;;;;;32216:1;32207:5;:10;31952:288;32203:21;31952:288;32261:6;32254:13;;;;;31570:716;;;:::o;67994:305::-;68096:4;68148:25;68133:40;;;:11;:40;;;;:105;;;;68205:33;68190:48;;;:11;:48;;;;68133:105;:158;;;;68255:36;68279:11;68255:23;:36::i;:::-;68133:158;68113:178;;67994:305;;;:::o;74791:104::-;74860:27;74870:2;74874:8;74860:27;;;;;;;;;;;;:9;:27::i;:::-;74791:104;;:::o;77709:2130::-;77824:35;77862:21;77875:7;77862:12;:21::i;:::-;77824:59;;77922:4;77900:26;;:13;:18;;;:26;;;77896:67;;77935:28;;;;;;;;;;;;;;77896:67;77976:22;78018:4;78002:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;78039:36;78056:4;78062:12;:10;:12::i;:::-;78039:16;:36::i;:::-;78002:73;:126;;;;78116:12;:10;:12::i;:::-;78092:36;;:20;78104:7;78092:11;:20::i;:::-;:36;;;78002:126;77976:153;;78147:17;78142:66;;78173:35;;;;;;;;;;;;;;78142:66;78237:1;78223:16;;:2;:16;;;78219:52;;78248:23;;;;;;;;;;;;;;78219:52;78284:43;78306:4;78312:2;78316:7;78325:1;78284:21;:43::i;:::-;78392:35;78409:1;78413:7;78422:4;78392:8;:35::i;:::-;78753:1;78723:12;:18;78736:4;78723:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78797:1;78769:12;:16;78782:2;78769:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78815:31;78849:11;:20;78861:7;78849:20;;;;;;;;;;;78815:54;;78900:2;78884:8;:13;;;:18;;;;;;;;;;;;;;;;;;78950:15;78917:8;:23;;;:49;;;;;;;;;;;;;;;;;;79218:19;79250:1;79240:7;:11;79218:33;;79266:31;79300:11;:24;79312:11;79300:24;;;;;;;;;;;79266:58;;79368:1;79343:27;;:8;:13;;;;;;;;;;;;:27;;;79339:384;;79553:13;;79538:11;:28;79534:174;;79607:4;79591:8;:13;;;:20;;;;;;;;;;;;;;;;;;79660:13;:28;;;79634:8;:23;;;:54;;;;;;;;;;;;;;;;;;79534:174;79339:384;78698:1036;;;79770:7;79766:2;79751:27;;79760:4;79751:27;;;;;;;;;;;;79789:42;79810:4;79816:2;79820:7;79829:1;79789:20;:42::i;:::-;77813:2026;;77709:2130;;;:::o;34697:326::-;34757:4;35014:1;34992:7;:19;;;:23;34985:30;;34697:326;;;:::o;83454:667::-;83617:4;83654:2;83638:36;;;83675:12;:10;:12::i;:::-;83689:4;83695:7;83704:5;83638:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;83634:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83889:1;83872:6;:13;:18;83868:235;;83918:40;;;;;;;;;;;;;;83868:235;84061:6;84055:13;84046:6;84042:2;84038:15;84031:38;83634:480;83767:45;;;83757:55;;;:6;:55;;;;83750:62;;;83454:667;;;;;;:::o;28436:922::-;28489:7;28509:14;28526:1;28509:18;;28576:6;28567:5;:15;28563:102;;28612:6;28603:15;;;;;;:::i;:::-;;;;;28647:2;28637:12;;;;28563:102;28692:6;28683:5;:15;28679:102;;28728:6;28719:15;;;;;;:::i;:::-;;;;;28763:2;28753:12;;;;28679:102;28808:6;28799:5;:15;28795:102;;28844:6;28835:15;;;;;;:::i;:::-;;;;;28879:2;28869:12;;;;28795:102;28924:5;28915;:14;28911:99;;28959:5;28950:14;;;;;;:::i;:::-;;;;;28993:1;28983:11;;;;28911:99;29037:5;29028;:14;29024:99;;29072:5;29063:14;;;;;;:::i;:::-;;;;;29106:1;29096:11;;;;29024:99;29150:5;29141;:14;29137:99;;29185:5;29176:14;;;;;;:::i;:::-;;;;;29219:1;29209:11;;;;29137:99;29263:5;29254;:14;29250:66;;29299:1;29289:11;;;;29250:66;29344:6;29337:13;;;28436:922;;;:::o;13948:157::-;14033:4;14072:25;14057:40;;;:11;:40;;;;14050:47;;13948:157;;;:::o;75258:163::-;75381:32;75387:2;75391:8;75401:5;75408:4;75381:5;:32::i;:::-;75258:163;;;:::o;84769:159::-;;;;;:::o;85587:158::-;;;;;:::o;75680:1775::-;75819:20;75842:13;;75819:36;;75884:1;75870:16;;:2;:16;;;75866:48;;75895:19;;;;;;;;;;;;;;75866:48;75941:1;75929:8;:13;75925:44;;75951:18;;;;;;;;;;;;;;75925:44;75982:61;76012:1;76016:2;76020:12;76034:8;75982:21;:61::i;:::-;76355:8;76320:12;:16;76333:2;76320:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76419:8;76379:12;:16;76392:2;76379:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76478:2;76445:11;:25;76457:12;76445:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;76545:15;76495:11;:25;76507:12;76495:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;76578:20;76601:12;76578:35;;76628:11;76657:8;76642:12;:23;76628:37;;76686:4;:23;;;;;76694:15;:2;:13;;;:15::i;:::-;76686:23;76682:641;;;76730:314;76786:12;76782:2;76761:38;;76778:1;76761:38;;;;;;;;;;;;76827:69;76866:1;76870:2;76874:14;;;;;;76890:5;76827:30;:69::i;:::-;76822:174;;76932:40;;;;;;;;;;;;;;76822:174;77039:3;77023:12;:19;76730:314;;77125:12;77108:13;;:29;77104:43;;77139:8;;;77104:43;76682:641;;;77188:120;77244:14;;;;;;77240:2;77219:40;;77236:1;77219:40;;;;;;;;;;;;77303:3;77287:12;:19;77188:120;;76682:641;77353:12;77337:13;:28;;;;76295:1082;;77387:60;77416:1;77420:2;77424:12;77438:8;77387:20;:60::i;:::-;75808:1647;75680:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:619::-;6181:6;6189;6197;6246:2;6234:9;6225:7;6221:23;6217:32;6214:119;;;6252:79;;:::i;:::-;6214:119;6372:1;6397:53;6442:7;6433:6;6422:9;6418:22;6397:53;:::i;:::-;6387:63;;6343:117;6499:2;6525:53;6570:7;6561:6;6550:9;6546:22;6525:53;:::i;:::-;6515:63;;6470:118;6627:2;6653:53;6698:7;6689:6;6678:9;6674:22;6653:53;:::i;:::-;6643:63;;6598:118;6104:619;;;;;:::o;6729:474::-;6797:6;6805;6854:2;6842:9;6833:7;6829:23;6825:32;6822:119;;;6860:79;;:::i;:::-;6822:119;6980:1;7005:53;7050:7;7041:6;7030:9;7026:22;7005:53;:::i;:::-;6995:63;;6951:117;7107:2;7133:53;7178:7;7169:6;7158:9;7154:22;7133:53;:::i;:::-;7123:63;;7078:118;6729:474;;;;;:::o;7209:332::-;7330:4;7368:2;7357:9;7353:18;7345:26;;7381:71;7449:1;7438:9;7434:17;7425:6;7381:71;:::i;:::-;7462:72;7530:2;7519:9;7515:18;7506:6;7462:72;:::i;:::-;7209:332;;;;;:::o;7547:117::-;7656:1;7653;7646:12;7670:117;7779:1;7776;7769:12;7793:180;7841:77;7838:1;7831:88;7938:4;7935:1;7928:15;7962:4;7959:1;7952:15;7979:281;8062:27;8084:4;8062:27;:::i;:::-;8054:6;8050:40;8192:6;8180:10;8177:22;8156:18;8144:10;8141:34;8138:62;8135:88;;;8203:18;;:::i;:::-;8135:88;8243:10;8239:2;8232:22;8022:238;7979:281;;:::o;8266:129::-;8300:6;8327:20;;:::i;:::-;8317:30;;8356:33;8384:4;8376:6;8356:33;:::i;:::-;8266:129;;;:::o;8401:308::-;8463:4;8553:18;8545:6;8542:30;8539:56;;;8575:18;;:::i;:::-;8539:56;8613:29;8635:6;8613:29;:::i;:::-;8605:37;;8697:4;8691;8687:15;8679:23;;8401:308;;;:::o;8715:146::-;8812:6;8807:3;8802;8789:30;8853:1;8844:6;8839:3;8835:16;8828:27;8715:146;;;:::o;8867:425::-;8945:5;8970:66;8986:49;9028:6;8986:49;:::i;:::-;8970:66;:::i;:::-;8961:75;;9059:6;9052:5;9045:21;9097:4;9090:5;9086:16;9135:3;9126:6;9121:3;9117:16;9114:25;9111:112;;;9142:79;;:::i;:::-;9111:112;9232:54;9279:6;9274:3;9269;9232:54;:::i;:::-;8951:341;8867:425;;;;;:::o;9312:340::-;9368:5;9417:3;9410:4;9402:6;9398:17;9394:27;9384:122;;9425:79;;:::i;:::-;9384:122;9542:6;9529:20;9567:79;9642:3;9634:6;9627:4;9619:6;9615:17;9567:79;:::i;:::-;9558:88;;9374:278;9312:340;;;;:::o;9658:509::-;9727:6;9776:2;9764:9;9755:7;9751:23;9747:32;9744:119;;;9782:79;;:::i;:::-;9744:119;9930:1;9919:9;9915:17;9902:31;9960:18;9952:6;9949:30;9946:117;;;9982:79;;:::i;:::-;9946:117;10087:63;10142:7;10133:6;10122:9;10118:22;10087:63;:::i;:::-;10077:73;;9873:287;9658:509;;;;:::o;10173:329::-;10232:6;10281:2;10269:9;10260:7;10256:23;10252:32;10249:119;;;10287:79;;:::i;:::-;10249:119;10407:1;10432:53;10477:7;10468:6;10457:9;10453:22;10432:53;:::i;:::-;10422:63;;10378:117;10173:329;;;;:::o;10508:474::-;10576:6;10584;10633:2;10621:9;10612:7;10608:23;10604:32;10601:119;;;10639:79;;:::i;:::-;10601:119;10759:1;10784:53;10829:7;10820:6;10809:9;10805:22;10784:53;:::i;:::-;10774:63;;10730:117;10886:2;10912:53;10957:7;10948:6;10937:9;10933:22;10912:53;:::i;:::-;10902:63;;10857:118;10508:474;;;;;:::o;10988:311::-;11065:4;11155:18;11147:6;11144:30;11141:56;;;11177:18;;:::i;:::-;11141:56;11227:4;11219:6;11215:17;11207:25;;11287:4;11281;11277:15;11269:23;;10988:311;;;:::o;11305:117::-;11414:1;11411;11404:12;11445:710;11541:5;11566:81;11582:64;11639:6;11582:64;:::i;:::-;11566:81;:::i;:::-;11557:90;;11667:5;11696:6;11689:5;11682:21;11730:4;11723:5;11719:16;11712:23;;11783:4;11775:6;11771:17;11763:6;11759:30;11812:3;11804:6;11801:15;11798:122;;;11831:79;;:::i;:::-;11798:122;11946:6;11929:220;11963:6;11958:3;11955:15;11929:220;;;12038:3;12067:37;12100:3;12088:10;12067:37;:::i;:::-;12062:3;12055:50;12134:4;12129:3;12125:14;12118:21;;12005:144;11989:4;11984:3;11980:14;11973:21;;11929:220;;;11933:21;11547:608;;11445:710;;;;;:::o;12178:370::-;12249:5;12298:3;12291:4;12283:6;12279:17;12275:27;12265:122;;12306:79;;:::i;:::-;12265:122;12423:6;12410:20;12448:94;12538:3;12530:6;12523:4;12515:6;12511:17;12448:94;:::i;:::-;12439:103;;12255:293;12178:370;;;;:::o;12554:539::-;12638:6;12687:2;12675:9;12666:7;12662:23;12658:32;12655:119;;;12693:79;;:::i;:::-;12655:119;12841:1;12830:9;12826:17;12813:31;12871:18;12863:6;12860:30;12857:117;;;12893:79;;:::i;:::-;12857:117;12998:78;13068:7;13059:6;13048:9;13044:22;12998:78;:::i;:::-;12988:88;;12784:302;12554:539;;;;:::o;13099:116::-;13169:21;13184:5;13169:21;:::i;:::-;13162:5;13159:32;13149:60;;13205:1;13202;13195:12;13149:60;13099:116;:::o;13221:133::-;13264:5;13302:6;13289:20;13280:29;;13318:30;13342:5;13318:30;:::i;:::-;13221:133;;;;:::o;13360:468::-;13425:6;13433;13482:2;13470:9;13461:7;13457:23;13453:32;13450:119;;;13488:79;;:::i;:::-;13450:119;13608:1;13633:53;13678:7;13669:6;13658:9;13654:22;13633:53;:::i;:::-;13623:63;;13579:117;13735:2;13761:50;13803:7;13794:6;13783:9;13779:22;13761:50;:::i;:::-;13751:60;;13706:115;13360:468;;;;;:::o;13834:307::-;13895:4;13985:18;13977:6;13974:30;13971:56;;;14007:18;;:::i;:::-;13971:56;14045:29;14067:6;14045:29;:::i;:::-;14037:37;;14129:4;14123;14119:15;14111:23;;13834:307;;;:::o;14147:423::-;14224:5;14249:65;14265:48;14306:6;14265:48;:::i;:::-;14249:65;:::i;:::-;14240:74;;14337:6;14330:5;14323:21;14375:4;14368:5;14364:16;14413:3;14404:6;14399:3;14395:16;14392:25;14389:112;;;14420:79;;:::i;:::-;14389:112;14510:54;14557:6;14552:3;14547;14510:54;:::i;:::-;14230:340;14147:423;;;;;:::o;14589:338::-;14644:5;14693:3;14686:4;14678:6;14674:17;14670:27;14660:122;;14701:79;;:::i;:::-;14660:122;14818:6;14805:20;14843:78;14917:3;14909:6;14902:4;14894:6;14890:17;14843:78;:::i;:::-;14834:87;;14650:277;14589:338;;;;:::o;14933:943::-;15028:6;15036;15044;15052;15101:3;15089:9;15080:7;15076:23;15072:33;15069:120;;;15108:79;;:::i;:::-;15069:120;15228:1;15253:53;15298:7;15289:6;15278:9;15274:22;15253:53;:::i;:::-;15243:63;;15199:117;15355:2;15381:53;15426:7;15417:6;15406:9;15402:22;15381:53;:::i;:::-;15371:63;;15326:118;15483:2;15509:53;15554:7;15545:6;15534:9;15530:22;15509:53;:::i;:::-;15499:63;;15454:118;15639:2;15628:9;15624:18;15611:32;15670:18;15662:6;15659:30;15656:117;;;15692:79;;:::i;:::-;15656:117;15797:62;15851:7;15842:6;15831:9;15827:22;15797:62;:::i;:::-;15787:72;;15582:287;14933:943;;;;;;;:::o;15882:474::-;15950:6;15958;16007:2;15995:9;15986:7;15982:23;15978:32;15975:119;;;16013:79;;:::i;:::-;15975:119;16133:1;16158:53;16203:7;16194:6;16183:9;16179:22;16158:53;:::i;:::-;16148:63;;16104:117;16260:2;16286:53;16331:7;16322:6;16311:9;16307:22;16286:53;:::i;:::-;16276:63;;16231:118;15882:474;;;;;:::o;16362:180::-;16410:77;16407:1;16400:88;16507:4;16504:1;16497:15;16531:4;16528:1;16521:15;16548:320;16592:6;16629:1;16623:4;16619:12;16609:22;;16676:1;16670:4;16666:12;16697:18;16687:81;;16753:4;16745:6;16741:17;16731:27;;16687:81;16815:2;16807:6;16804:14;16784:18;16781:38;16778:84;;16834:18;;:::i;:::-;16778:84;16599:269;16548:320;;;:::o;16874:173::-;17014:25;17010:1;17002:6;16998:14;16991:49;16874:173;:::o;17053:366::-;17195:3;17216:67;17280:2;17275:3;17216:67;:::i;:::-;17209:74;;17292:93;17381:3;17292:93;:::i;:::-;17410:2;17405:3;17401:12;17394:19;;17053:366;;;:::o;17425:419::-;17591:4;17629:2;17618:9;17614:18;17606:26;;17678:9;17672:4;17668:20;17664:1;17653:9;17649:17;17642:47;17706:131;17832:4;17706:131;:::i;:::-;17698:139;;17425:419;;;:::o;17850:180::-;17898:77;17895:1;17888:88;17995:4;17992:1;17985:15;18019:4;18016:1;18009:15;18036:194;18076:4;18096:20;18114:1;18096:20;:::i;:::-;18091:25;;18130:20;18148:1;18130:20;:::i;:::-;18125:25;;18174:1;18171;18167:9;18159:17;;18198:1;18192:4;18189:11;18186:37;;;18203:18;;:::i;:::-;18186:37;18036:194;;;;:::o;18236:332::-;18357:4;18395:2;18384:9;18380:18;18372:26;;18408:71;18476:1;18465:9;18461:17;18452:6;18408:71;:::i;:::-;18489:72;18557:2;18546:9;18542:18;18533:6;18489:72;:::i;:::-;18236:332;;;;;:::o;18574:137::-;18628:5;18659:6;18653:13;18644:22;;18675:30;18699:5;18675:30;:::i;:::-;18574:137;;;;:::o;18717:345::-;18784:6;18833:2;18821:9;18812:7;18808:23;18804:32;18801:119;;;18839:79;;:::i;:::-;18801:119;18959:1;18984:61;19037:7;19028:6;19017:9;19013:22;18984:61;:::i;:::-;18974:71;;18930:125;18717:345;;;;:::o;19068:410::-;19108:7;19131:20;19149:1;19131:20;:::i;:::-;19126:25;;19165:20;19183:1;19165:20;:::i;:::-;19160:25;;19220:1;19217;19213:9;19242:30;19260:11;19242:30;:::i;:::-;19231:41;;19421:1;19412:7;19408:15;19405:1;19402:22;19382:1;19375:9;19355:83;19332:139;;19451:18;;:::i;:::-;19332:139;19116:362;19068:410;;;;:::o;19484:180::-;19532:77;19529:1;19522:88;19629:4;19626:1;19619:15;19653:4;19650:1;19643:15;19670:185;19710:1;19727:20;19745:1;19727:20;:::i;:::-;19722:25;;19761:20;19779:1;19761:20;:::i;:::-;19756:25;;19800:1;19790:35;;19805:18;;:::i;:::-;19790:35;19847:1;19844;19840:9;19835:14;;19670:185;;;;:::o;19861:165::-;20001:17;19997:1;19989:6;19985:14;19978:41;19861:165;:::o;20032:366::-;20174:3;20195:67;20259:2;20254:3;20195:67;:::i;:::-;20188:74;;20271:93;20360:3;20271:93;:::i;:::-;20389:2;20384:3;20380:12;20373:19;;20032:366;;;:::o;20404:419::-;20570:4;20608:2;20597:9;20593:18;20585:26;;20657:9;20651:4;20647:20;20643:1;20632:9;20628:17;20621:47;20685:131;20811:4;20685:131;:::i;:::-;20677:139;;20404:419;;;:::o;20829:141::-;20878:4;20901:3;20893:11;;20924:3;20921:1;20914:14;20958:4;20955:1;20945:18;20937:26;;20829:141;;;:::o;20976:93::-;21013:6;21060:2;21055;21048:5;21044:14;21040:23;21030:33;;20976:93;;;:::o;21075:107::-;21119:8;21169:5;21163:4;21159:16;21138:37;;21075:107;;;;:::o;21188:393::-;21257:6;21307:1;21295:10;21291:18;21330:97;21360:66;21349:9;21330:97;:::i;:::-;21448:39;21478:8;21467:9;21448:39;:::i;:::-;21436:51;;21520:4;21516:9;21509:5;21505:21;21496:30;;21569:4;21559:8;21555:19;21548:5;21545:30;21535:40;;21264:317;;21188:393;;;;;:::o;21587:60::-;21615:3;21636:5;21629:12;;21587:60;;;:::o;21653:142::-;21703:9;21736:53;21754:34;21763:24;21781:5;21763:24;:::i;:::-;21754:34;:::i;:::-;21736:53;:::i;:::-;21723:66;;21653:142;;;:::o;21801:75::-;21844:3;21865:5;21858:12;;21801:75;;;:::o;21882:269::-;21992:39;22023:7;21992:39;:::i;:::-;22053:91;22102:41;22126:16;22102:41;:::i;:::-;22094:6;22087:4;22081:11;22053:91;:::i;:::-;22047:4;22040:105;21958:193;21882:269;;;:::o;22157:73::-;22202:3;22157:73;:::o;22236:189::-;22313:32;;:::i;:::-;22354:65;22412:6;22404;22398:4;22354:65;:::i;:::-;22289:136;22236:189;;:::o;22431:186::-;22491:120;22508:3;22501:5;22498:14;22491:120;;;22562:39;22599:1;22592:5;22562:39;:::i;:::-;22535:1;22528:5;22524:13;22515:22;;22491:120;;;22431:186;;:::o;22623:543::-;22724:2;22719:3;22716:11;22713:446;;;22758:38;22790:5;22758:38;:::i;:::-;22842:29;22860:10;22842:29;:::i;:::-;22832:8;22828:44;23025:2;23013:10;23010:18;23007:49;;;23046:8;23031:23;;23007:49;23069:80;23125:22;23143:3;23125:22;:::i;:::-;23115:8;23111:37;23098:11;23069:80;:::i;:::-;22728:431;;22713:446;22623:543;;;:::o;23172:117::-;23226:8;23276:5;23270:4;23266:16;23245:37;;23172:117;;;;:::o;23295:169::-;23339:6;23372:51;23420:1;23416:6;23408:5;23405:1;23401:13;23372:51;:::i;:::-;23368:56;23453:4;23447;23443:15;23433:25;;23346:118;23295:169;;;;:::o;23469:295::-;23545:4;23691:29;23716:3;23710:4;23691:29;:::i;:::-;23683:37;;23753:3;23750:1;23746:11;23740:4;23737:21;23729:29;;23469:295;;;;:::o;23769:1395::-;23886:37;23919:3;23886:37;:::i;:::-;23988:18;23980:6;23977:30;23974:56;;;24010:18;;:::i;:::-;23974:56;24054:38;24086:4;24080:11;24054:38;:::i;:::-;24139:67;24199:6;24191;24185:4;24139:67;:::i;:::-;24233:1;24257:4;24244:17;;24289:2;24281:6;24278:14;24306:1;24301:618;;;;24963:1;24980:6;24977:77;;;25029:9;25024:3;25020:19;25014:26;25005:35;;24977:77;25080:67;25140:6;25133:5;25080:67;:::i;:::-;25074:4;25067:81;24936:222;24271:887;;24301:618;24353:4;24349:9;24341:6;24337:22;24387:37;24419:4;24387:37;:::i;:::-;24446:1;24460:208;24474:7;24471:1;24468:14;24460:208;;;24553:9;24548:3;24544:19;24538:26;24530:6;24523:42;24604:1;24596:6;24592:14;24582:24;;24651:2;24640:9;24636:18;24623:31;;24497:4;24494:1;24490:12;24485:17;;24460:208;;;24696:6;24687:7;24684:19;24681:179;;;24754:9;24749:3;24745:19;24739:26;24797:48;24839:4;24831:6;24827:17;24816:9;24797:48;:::i;:::-;24789:6;24782:64;24704:156;24681:179;24906:1;24902;24894:6;24890:14;24886:22;24880:4;24873:36;24308:611;;;24271:887;;23861:1303;;;23769:1395;;:::o;25170:180::-;25218:77;25215:1;25208:88;25315:4;25312:1;25305:15;25339:4;25336:1;25329:15;25356:234;25496:34;25492:1;25484:6;25480:14;25473:58;25565:17;25560:2;25552:6;25548:15;25541:42;25356:234;:::o;25596:366::-;25738:3;25759:67;25823:2;25818:3;25759:67;:::i;:::-;25752:74;;25835:93;25924:3;25835:93;:::i;:::-;25953:2;25948:3;25944:12;25937:19;;25596:366;;;:::o;25968:419::-;26134:4;26172:2;26161:9;26157:18;26149:26;;26221:9;26215:4;26211:20;26207:1;26196:9;26192:17;26185:47;26249:131;26375:4;26249:131;:::i;:::-;26241:139;;25968:419;;;:::o;26393:148::-;26495:11;26532:3;26517:18;;26393:148;;;;:::o;26547:390::-;26653:3;26681:39;26714:5;26681:39;:::i;:::-;26736:89;26818:6;26813:3;26736:89;:::i;:::-;26729:96;;26834:65;26892:6;26887:3;26880:4;26873:5;26869:16;26834:65;:::i;:::-;26924:6;26919:3;26915:16;26908:23;;26657:280;26547:390;;;;:::o;26967:874::-;27070:3;27107:5;27101:12;27136:36;27162:9;27136:36;:::i;:::-;27188:89;27270:6;27265:3;27188:89;:::i;:::-;27181:96;;27308:1;27297:9;27293:17;27324:1;27319:166;;;;27499:1;27494:341;;;;27286:549;;27319:166;27403:4;27399:9;27388;27384:25;27379:3;27372:38;27465:6;27458:14;27451:22;27443:6;27439:35;27434:3;27430:45;27423:52;;27319:166;;27494:341;27561:38;27593:5;27561:38;:::i;:::-;27621:1;27635:154;27649:6;27646:1;27643:13;27635:154;;;27723:7;27717:14;27713:1;27708:3;27704:11;27697:35;27773:1;27764:7;27760:15;27749:26;;27671:4;27668:1;27664:12;27659:17;;27635:154;;;27818:6;27813:3;27809:16;27802:23;;27501:334;;27286:549;;27074:767;;26967:874;;;;:::o;27847:589::-;28072:3;28094:95;28185:3;28176:6;28094:95;:::i;:::-;28087:102;;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28318:92;28406:3;28397:6;28318:92;:::i;:::-;28311:99;;28427:3;28420:10;;27847:589;;;;;;:::o;28442:225::-;28582:34;28578:1;28570:6;28566:14;28559:58;28651:8;28646:2;28638:6;28634:15;28627:33;28442:225;:::o;28673:366::-;28815:3;28836:67;28900:2;28895:3;28836:67;:::i;:::-;28829:74;;28912:93;29001:3;28912:93;:::i;:::-;29030:2;29025:3;29021:12;29014:19;;28673:366;;;:::o;29045:419::-;29211:4;29249:2;29238:9;29234:18;29226:26;;29298:9;29292:4;29288:20;29284:1;29273:9;29269:17;29262:47;29326:131;29452:4;29326:131;:::i;:::-;29318:139;;29045:419;;;:::o;29470:182::-;29610:34;29606:1;29598:6;29594:14;29587:58;29470:182;:::o;29658:366::-;29800:3;29821:67;29885:2;29880:3;29821:67;:::i;:::-;29814:74;;29897:93;29986:3;29897:93;:::i;:::-;30015:2;30010:3;30006:12;29999:19;;29658:366;;;:::o;30030:419::-;30196:4;30234:2;30223:9;30219:18;30211:26;;30283:9;30277:4;30273:20;30269:1;30258:9;30254:17;30247:47;30311:131;30437:4;30311:131;:::i;:::-;30303:139;;30030:419;;;:::o;30455:229::-;30595:34;30591:1;30583:6;30579:14;30572:58;30664:12;30659:2;30651:6;30647:15;30640:37;30455:229;:::o;30690:366::-;30832:3;30853:67;30917:2;30912:3;30853:67;:::i;:::-;30846:74;;30929:93;31018:3;30929:93;:::i;:::-;31047:2;31042:3;31038:12;31031:19;;30690:366;;;:::o;31062:419::-;31228:4;31266:2;31255:9;31251:18;31243:26;;31315:9;31309:4;31305:20;31301:1;31290:9;31286:17;31279:47;31343:131;31469:4;31343:131;:::i;:::-;31335:139;;31062:419;;;:::o;31487:175::-;31627:27;31623:1;31615:6;31611:14;31604:51;31487:175;:::o;31668:366::-;31810:3;31831:67;31895:2;31890:3;31831:67;:::i;:::-;31824:74;;31907:93;31996:3;31907:93;:::i;:::-;32025:2;32020:3;32016:12;32009:19;;31668:366;;;:::o;32040:419::-;32206:4;32244:2;32233:9;32229:18;32221:26;;32293:9;32287:4;32283:20;32279:1;32268:9;32264:17;32257:47;32321:131;32447:4;32321:131;:::i;:::-;32313:139;;32040:419;;;:::o;32465:98::-;32516:6;32550:5;32544:12;32534:22;;32465:98;;;:::o;32569:168::-;32652:11;32686:6;32681:3;32674:19;32726:4;32721:3;32717:14;32702:29;;32569:168;;;;:::o;32743:373::-;32829:3;32857:38;32889:5;32857:38;:::i;:::-;32911:70;32974:6;32969:3;32911:70;:::i;:::-;32904:77;;32990:65;33048:6;33043:3;33036:4;33029:5;33025:16;32990:65;:::i;:::-;33080:29;33102:6;33080:29;:::i;:::-;33075:3;33071:39;33064:46;;32833:283;32743:373;;;;:::o;33122:640::-;33317:4;33355:3;33344:9;33340:19;33332:27;;33369:71;33437:1;33426:9;33422:17;33413:6;33369:71;:::i;:::-;33450:72;33518:2;33507:9;33503:18;33494:6;33450:72;:::i;:::-;33532;33600:2;33589:9;33585:18;33576:6;33532:72;:::i;:::-;33651:9;33645:4;33641:20;33636:2;33625:9;33621:18;33614:48;33679:76;33750:4;33741:6;33679:76;:::i;:::-;33671:84;;33122:640;;;;;;;:::o;33768:141::-;33824:5;33855:6;33849:13;33840:22;;33871:32;33897:5;33871:32;:::i;:::-;33768:141;;;;:::o;33915:349::-;33984:6;34033:2;34021:9;34012:7;34008:23;34004:32;34001:119;;;34039:79;;:::i;:::-;34001:119;34159:1;34184:63;34239:7;34230:6;34219:9;34215:22;34184:63;:::i;:::-;34174:73;;34130:127;33915:349;;;;:::o
Swarm Source
ipfs://d4dcdb71a3a3f148bbc77675a23b14a3b736cd1b8b14b0b440dde72d4e71b7f3
Loading...
Loading
Loading...
Loading
OVERVIEW
Global Citizen Club sets the international stage alight by partnering with Whoscall, a caller-ID APP by Gogolook with 100 million downloads worldwide to release a limited edition sub-collection of GCC x Whoscall Special Edition NFTs. A unique partnership that brings about a un...Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.