Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0.08 ETH
Eth Value
$163.40 (@ $2,042.50/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EARTH
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-03-31
*/
// SPDX-License-Identifier: MIT
// File: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (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: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (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: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (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: src/contract/openzeppelin-contracts/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (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: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (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: src/contract/openzeppelin-contracts/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: src/contract/openzeppelin-contracts/contracts/utils/Base64.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
/// @solidity memory-safe-assembly
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 32)
// Run over the input, 3 bytes at a time
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 bytes (18 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F which is the number of
// the previous character in the ASCII table prior to the Base64 Table
// The result is then added to the table to get the character to write,
// and finally write it in the result pointer but with a left shift
// of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
}
// When data `bytes` is not exactly 3 bytes long
// it is padded with `=` characters at the end
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}
// File: src/contract/EARTH.sol
pragma solidity ^0.8.4;
contract EARTH is ERC721, Ownable {
using Strings for uint256;
string constant NAME = "EARTH";
string constant SYMBOL = "EARTH";
string constant IMAGE_BASE_URI = "ipfs://QmckZx54qkufApdV499BJSyTDZTw6bxGGtJdgRNvk8iaM7";
uint constant NUM_TILES = 812;
uint constant NUM_PENTAGONS = 12;
event CustomDataChanged(uint256 indexed tokenId);
uint256 _maxSupply;
mapping(uint256 => bytes) _customData;
constructor() ERC721(NAME, SYMBOL) {
_maxSupply = NUM_TILES;
}
function mint(uint256 index) payable public {
address minter = msg.sender;
require(index < _maxSupply, "out of bounds");
require(msg.value >= 0.08 ether, "not enough ETH (0.08)");
_safeMint(minter, index);
}
/**
* Return owner of tile or zero address if not minted.
*/
function ownerOfOrZero(uint256 tokenId) public view returns (address) {
if (!_exists(tokenId)) {
return address(0);
}
return ownerOf(tokenId);
}
/**
* Return an array with all tile owners. If tile is not minted, address is zero.
*/
function owners() external view returns (address[] memory _owners) {
_owners = new address[](_maxSupply);
for (uint i=0; i<_owners.length; i++) {
_owners[i] = ownerOfOrZero(i);
}
}
/**
* Transfer contract funds to owner.
*/
function withdraw() public onlyOwner {
address owner = owner();
uint256 balance = address(this).balance;
payable(owner).transfer(balance);
}
/**
* Meta data
*/
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
bytes memory dataURI = abi.encodePacked(
'{',
'"name": "Tile #', tokenId.toString(), '",',
'"image": "', IMAGE_BASE_URI, "/tile", tokenId.toString(), '.jpeg",',
'"attributes": ', '[',
'{',
'"trait_type": "Shape",',
'"value": "', _shape(tokenId), '"',
'},',
'{',
'"trait_type": "Message",',
'"value": "', customData(tokenId), '"',
'}',
']',
'}'
);
return string(
abi.encodePacked(
"data:application/json;base64,",
Base64.encode(dataURI)
)
);
}
function _shape(uint256 tokenId) internal pure returns (string memory) {
if (tokenId < NUM_PENTAGONS) {
return "Pentagon";
}
return "Hexagon";
}
/**
* Custom data
*/
function setCustomData(uint256 index, bytes calldata data) public {
require(ownerOf(index) == msg.sender, "not owner");
_customData[index] = data;
emit CustomDataChanged(index);
}
function customData(uint256 index) public view returns (bytes memory) {
return _customData[index];
}
function customDataAll() external view returns (bytes[] memory _customDataAll) {
_customDataAll = new bytes[](_maxSupply);
for (uint i=0; i<_customDataAll.length; i++) {
_customDataAll[i] = customData(i);
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"CustomDataChanged","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":"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":"index","type":"uint256"}],"name":"customData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customDataAll","outputs":[{"internalType":"bytes[]","name":"_customDataAll","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOfOrZero","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owners","outputs":[{"internalType":"address[]","name":"_owners","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setCustomData","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":[{"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
60806040523480156200001157600080fd5b506040518060400160405280600581526020017f45415254480000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454152544800000000000000000000000000000000000000000000000000000081525081600090816200008f91906200041b565b508060019081620000a191906200041b565b505050620000c4620000b8620000d360201b60201c565b620000db60201b60201c565b61032c60078190555062000502565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022357607f821691505b602082108103620002395762000238620001db565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000264565b620002af868362000264565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fc620002f6620002f084620002c7565b620002d1565b620002c7565b9050919050565b6000819050919050565b6200031883620002db565b62000330620003278262000303565b84845462000271565b825550505050565b600090565b6200034762000338565b620003548184846200030d565b505050565b5b818110156200037c57620003706000826200033d565b6001810190506200035a565b5050565b601f821115620003cb5762000395816200023f565b620003a08462000254565b81016020851015620003b0578190505b620003c8620003bf8562000254565b83018262000359565b50505b505050565b600082821c905092915050565b6000620003f060001984600802620003d0565b1980831691505092915050565b60006200040b8383620003dd565b9150826002028217905092915050565b6200042682620001a1565b67ffffffffffffffff811115620004425762000441620001ac565b5b6200044e82546200020a565b6200045b82828562000380565b600060209050601f8311600181146200049357600084156200047e578287015190505b6200048a8582620003fd565b865550620004fa565b601f198416620004a3866200023f565b60005b82811015620004cd57848901518255600182019150602085019450602081019050620004a6565b86831015620004ed5784890151620004e9601f891682620003dd565b8355505b6001600288020188555050505b505050505050565b61403980620005126000396000f3fe6080604052600436106101405760003560e01c8063715018a6116100b6578063b843cb671161006f578063b843cb6714610439578063b88d4fde14610464578063c3901d101461048d578063c87b56dd146104ca578063e985e9c514610507578063f2fde38b1461054457610140565b8063715018a61461035c5780638da5cb5b1461037357806395d89b411461039e578063a0712d68146103c9578063a22cb465146103e5578063affe39c11461040e57610140565b80633ccfd60b116101085780633ccfd60b1461023c57806342842e0e14610253578063515f06e91461027c5780636352211e146102a55780636f50829a146102e257806370a082311461031f57610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806323b872dd14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612365565b61056d565b60405161017991906123ad565b60405180910390f35b34801561018e57600080fd5b5061019761064f565b6040516101a49190612458565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf91906124b0565b6106e1565b6040516101e1919061251e565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612565565b610727565b005b34801561021f57600080fd5b5061023a600480360381019061023591906125a5565b61083e565b005b34801561024857600080fd5b5061025161089e565b005b34801561025f57600080fd5b5061027a600480360381019061027591906125a5565b610902565b005b34801561028857600080fd5b506102a3600480360381019061029e919061265d565b610922565b005b3480156102b157600080fd5b506102cc60048036038101906102c791906124b0565b6109ed565b6040516102d9919061251e565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906124b0565b610a73565b6040516103169190612712565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612734565b610b18565b6040516103539190612770565b60405180910390f35b34801561036857600080fd5b50610371610bcf565b005b34801561037f57600080fd5b50610388610be3565b604051610395919061251e565b60405180910390f35b3480156103aa57600080fd5b506103b3610c0d565b6040516103c09190612458565b60405180910390f35b6103e360048036038101906103de91906124b0565b610c9f565b005b3480156103f157600080fd5b5061040c600480360381019061040791906127b7565b610d41565b005b34801561041a57600080fd5b50610423610d57565b60405161043091906128b5565b60405180910390f35b34801561044557600080fd5b5061044e610e1f565b60405161045b91906129e3565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612b35565b610ebd565b005b34801561049957600080fd5b506104b460048036038101906104af91906124b0565b610f1f565b6040516104c1919061251e565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec91906124b0565b610f48565b6040516104fe9190612458565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612bb8565b610fde565b60405161053b91906123ad565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612734565b611072565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106485750610647826110f5565b5b9050919050565b60606000805461065e90612c27565b80601f016020809104026020016040519081016040528092919081815260200182805461068a90612c27565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b60006106ec8261115f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610732826109ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990612cca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c16111aa565b73ffffffffffffffffffffffffffffffffffffffff1614806107f057506107ef816107ea6111aa565b610fde565b5b61082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612d5c565b60405180910390fd5b61083983836111b2565b505050565b61084f6108496111aa565b8261126b565b61088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590612dee565b60405180910390fd5b610899838383611300565b505050565b6108a66115f9565b60006108b0610be3565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108fd573d6000803e3d6000fd5b505050565b61091d83838360405180602001604052806000815250610ebd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610942846109ed565b73ffffffffffffffffffffffffffffffffffffffff1614610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90612e5a565b60405180910390fd5b81816008600086815260200190815260200160002091826109ba929190613031565b50827f8c204152ec4f09fd07cc5fcf37c95d873e20aa3f48ae1dccf4f2ed3b8d9c769e60405160405180910390a2505050565b6000806109f983611677565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a619061314d565b60405180910390fd5b80915050919050565b6060600860008381526020019081526020016000208054610a9390612c27565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90612c27565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f906131df565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd76115f9565b610be160006116b4565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c1c90612c27565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4890612c27565b8015610c955780601f10610c6a57610100808354040283529160200191610c95565b820191906000526020600020905b815481529060010190602001808311610c7857829003601f168201915b5050505050905090565b60003390506007548210610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf9061324b565b60405180910390fd5b67011c37937e080000341015610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906132b7565b60405180910390fd5b610d3d818361177a565b5050565b610d53610d4c6111aa565b8383611798565b5050565b606060075467ffffffffffffffff811115610d7557610d74612a0a565b5b604051908082528060200260200182016040528015610da35781602001602082028036833780820191505090505b50905060005b8151811015610e1b57610dbb81610f1f565b828281518110610dce57610dcd6132d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610e1390613335565b915050610da9565b5090565b606060075467ffffffffffffffff811115610e3d57610e3c612a0a565b5b604051908082528060200260200182016040528015610e7057816020015b6060815260200190600190039081610e5b5790505b50905060005b8151811015610eb957610e8881610a73565b828281518110610e9b57610e9a6132d7565b5b60200260200101819052508080610eb190613335565b915050610e76565b5090565b610ece610ec86111aa565b8361126b565b610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612dee565b60405180910390fd5b610f1984848484611904565b50505050565b6000610f2a82611960565b610f375760009050610f43565b610f40826109ed565b90505b919050565b60606000610f55836119a1565b604051806060016040528060358152602001613f8f60359139610f77856119a1565b610f8086611a6f565b610f8987610a73565b604051602001610f9d959493929190613869565b6040516020818303038152906040529050610fb781611af5565b604051602001610fc791906139dc565b604051602081830303815290604052915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61107a6115f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090613a70565b60405180910390fd5b6110f2816116b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61116881611960565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061314d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611225836109ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611277836109ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112b957506112b88185610fde565b5b806112f757508373ffffffffffffffffffffffffffffffffffffffff166112df846106e1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611320826109ed565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90613b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613b94565b60405180910390fd5b6113f28383836001611c58565b8273ffffffffffffffffffffffffffffffffffffffff16611412826109ed565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613b02565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115f48383836001611d7e565b505050565b6116016111aa565b73ffffffffffffffffffffffffffffffffffffffff1661161f610be3565b73ffffffffffffffffffffffffffffffffffffffff1614611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613c00565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611794828260405180602001604052806000815250611d84565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90613c6c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f791906123ad565b60405180910390a3505050565b61190f848484611300565b61191b84848484611ddf565b61195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190613cfe565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661198283611677565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016119b084611f66565b01905060008167ffffffffffffffff8111156119cf576119ce612a0a565b5b6040519080825280601f01601f191660200182016040528015611a015781602001600182028036833780820191505090505b509050600082602001820190505b600115611a64578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a5857611a57613d1e565b5b04945060008503611a0f575b819350505050919050565b6060600c821015611ab7576040518060400160405280600881526020017f50656e7461676f6e0000000000000000000000000000000000000000000000008152509050611af0565b6040518060400160405280600781526020017f48657861676f6e0000000000000000000000000000000000000000000000000081525090505b919050565b60606000825103611b1757604051806020016040528060008152509050611c53565b6000604051806060016040528060408152602001613fc46040913990506000600360028551611b469190613d4d565b611b509190613d81565b6004611b5c9190613db2565b67ffffffffffffffff811115611b7557611b74612a0a565b5b6040519080825280601f01601f191660200182016040528015611ba75781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c13576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611bb8565b5050600386510660018114611c2f5760028114611c4257611c4a565b603d6001830353603d6002830353611c4a565b603d60018303535b50505080925050505b919050565b6001811115611d7857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611cec5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ce49190613df4565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611d775780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6f9190613d4d565b925050819055505b5b50505050565b50505050565b611d8e83836120b9565b611d9b6000848484611ddf565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613cfe565b60405180910390fd5b505050565b6000611e008473ffffffffffffffffffffffffffffffffffffffff166122d6565b15611f59578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e296111aa565b8786866040518563ffffffff1660e01b8152600401611e4b9493929190613e28565b6020604051808303816000875af1925050508015611e8757506040513d601f19601f82011682018060405250810190611e849190613e89565b60015b611f09573d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b506000815103611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890613cfe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f5e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611fc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611fba57611fb9613d1e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef81000000008381611ff757611ff6613d1e565b5b0492506020810190505b662386f26fc10000831061203057662386f26fc10000838161202657612025613d1e565b5b0492506010810190505b6305f5e1008310612059576305f5e100838161204f5761204e613d1e565b5b0492506008810190505b612710831061207e57612710838161207457612073613d1e565b5b0492506004810190505b606483106120a1576064838161209757612096613d1e565b5b0492506002810190505b600a83106120b0576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90613f02565b60405180910390fd5b61213181611960565b15612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216890613f6e565b60405180910390fd5b61217f600083836001611c58565b61218881611960565b156121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90613f6e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d2600083836001611d7e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123428161230d565b811461234d57600080fd5b50565b60008135905061235f81612339565b92915050565b60006020828403121561237b5761237a612303565b5b600061238984828501612350565b91505092915050565b60008115159050919050565b6123a781612392565b82525050565b60006020820190506123c2600083018461239e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124025780820151818401526020810190506123e7565b60008484015250505050565b6000601f19601f8301169050919050565b600061242a826123c8565b61243481856123d3565b93506124448185602086016123e4565b61244d8161240e565b840191505092915050565b60006020820190508181036000830152612472818461241f565b905092915050565b6000819050919050565b61248d8161247a565b811461249857600080fd5b50565b6000813590506124aa81612484565b92915050565b6000602082840312156124c6576124c5612303565b5b60006124d48482850161249b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612508826124dd565b9050919050565b612518816124fd565b82525050565b6000602082019050612533600083018461250f565b92915050565b612542816124fd565b811461254d57600080fd5b50565b60008135905061255f81612539565b92915050565b6000806040838503121561257c5761257b612303565b5b600061258a85828601612550565b925050602061259b8582860161249b565b9150509250929050565b6000806000606084860312156125be576125bd612303565b5b60006125cc86828701612550565b93505060206125dd86828701612550565b92505060406125ee8682870161249b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261261d5761261c6125f8565b5b8235905067ffffffffffffffff81111561263a576126396125fd565b5b60208301915083600182028301111561265657612655612602565b5b9250929050565b60008060006040848603121561267657612675612303565b5b60006126848682870161249b565b935050602084013567ffffffffffffffff8111156126a5576126a4612308565b5b6126b186828701612607565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60006126e4826126bd565b6126ee81856126c8565b93506126fe8185602086016123e4565b6127078161240e565b840191505092915050565b6000602082019050818103600083015261272c81846126d9565b905092915050565b60006020828403121561274a57612749612303565b5b600061275884828501612550565b91505092915050565b61276a8161247a565b82525050565b60006020820190506127856000830184612761565b92915050565b61279481612392565b811461279f57600080fd5b50565b6000813590506127b18161278b565b92915050565b600080604083850312156127ce576127cd612303565b5b60006127dc85828601612550565b92505060206127ed858286016127a2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61282c816124fd565b82525050565b600061283e8383612823565b60208301905092915050565b6000602082019050919050565b6000612862826127f7565b61286c8185612802565b935061287783612813565b8060005b838110156128a857815161288f8882612832565b975061289a8361284a565b92505060018101905061287b565b5085935050505092915050565b600060208201905081810360008301526128cf8184612857565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061291f826126bd565b6129298185612903565b93506129398185602086016123e4565b6129428161240e565b840191505092915050565b60006129598383612914565b905092915050565b6000602082019050919050565b6000612979826128d7565b61298381856128e2565b935083602082028501612995856128f3565b8060005b858110156129d157848403895281516129b2858261294d565b94506129bd83612961565b925060208a01995050600181019050612999565b50829750879550505050505092915050565b600060208201905081810360008301526129fd818461296e565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a428261240e565b810181811067ffffffffffffffff82111715612a6157612a60612a0a565b5b80604052505050565b6000612a746122f9565b9050612a808282612a39565b919050565b600067ffffffffffffffff821115612aa057612a9f612a0a565b5b612aa98261240e565b9050602081019050919050565b82818337600083830152505050565b6000612ad8612ad384612a85565b612a6a565b905082815260208101848484011115612af457612af3612a05565b5b612aff848285612ab6565b509392505050565b600082601f830112612b1c57612b1b6125f8565b5b8135612b2c848260208601612ac5565b91505092915050565b60008060008060808587031215612b4f57612b4e612303565b5b6000612b5d87828801612550565b9450506020612b6e87828801612550565b9350506040612b7f8782880161249b565b925050606085013567ffffffffffffffff811115612ba057612b9f612308565b5b612bac87828801612b07565b91505092959194509250565b60008060408385031215612bcf57612bce612303565b5b6000612bdd85828601612550565b9250506020612bee85828601612550565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3f57607f821691505b602082108103612c5257612c51612bf8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb46021836123d3565b9150612cbf82612c58565b604082019050919050565b60006020820190508181036000830152612ce381612ca7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d46603d836123d3565b9150612d5182612cea565b604082019050919050565b60006020820190508181036000830152612d7581612d39565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dd8602d836123d3565b9150612de382612d7c565b604082019050919050565b60006020820190508181036000830152612e0781612dcb565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000612e446009836123d3565b9150612e4f82612e0e565b602082019050919050565b60006020820190508181036000830152612e7381612e37565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ee77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612eaa565b612ef18683612eaa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f2e612f29612f248461247a565b612f09565b61247a565b9050919050565b6000819050919050565b612f4883612f13565b612f5c612f5482612f35565b848454612eb7565b825550505050565b600090565b612f71612f64565b612f7c818484612f3f565b505050565b5b81811015612fa057612f95600082612f69565b600181019050612f82565b5050565b601f821115612fe557612fb681612e85565b612fbf84612e9a565b81016020851015612fce578190505b612fe2612fda85612e9a565b830182612f81565b50505b505050565b600082821c905092915050565b600061300860001984600802612fea565b1980831691505092915050565b60006130218383612ff7565b9150826002028217905092915050565b61303b8383612e7a565b67ffffffffffffffff81111561305457613053612a0a565b5b61305e8254612c27565b613069828285612fa4565b6000601f8311600181146130985760008415613086578287013590505b6130908582613015565b8655506130f8565b601f1984166130a686612e85565b60005b828110156130ce578489013582556001820191506020850194506020810190506130a9565b868310156130eb57848901356130e7601f891682612ff7565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006131376018836123d3565b915061314282613101565b602082019050919050565b600060208201905081810360008301526131668161312a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006131c96029836123d3565b91506131d48261316d565b604082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b7f6f7574206f6620626f756e647300000000000000000000000000000000000000600082015250565b6000613235600d836123d3565b9150613240826131ff565b602082019050919050565b6000602082019050818103600083015261326481613228565b9050919050565b7f6e6f7420656e6f756768204554482028302e3038290000000000000000000000600082015250565b60006132a16015836123d3565b91506132ac8261326b565b602082019050919050565b600060208201905081810360008301526132d081613294565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133408261247a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337257613371613306565b5b600182019050919050565b600081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006133be60018361337d565b91506133c982613388565b600182019050919050565b7f226e616d65223a202254696c6520230000000000000000000000000000000000600082015250565b600061340a600f8361337d565b9150613415826133d4565b600f82019050919050565b600061342b826123c8565b613435818561337d565b93506134458185602086016123e4565b80840191505092915050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061348760028361337d565b915061349282613451565b600282019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b60006134d3600a8361337d565b91506134de8261349d565b600a82019050919050565b7f2f74696c65000000000000000000000000000000000000000000000000000000600082015250565b600061351f60058361337d565b915061352a826134e9565b600582019050919050565b7f2e6a706567222c00000000000000000000000000000000000000000000000000600082015250565b600061356b60078361337d565b915061357682613535565b600782019050919050565b7f2261747472696275746573223a20000000000000000000000000000000000000600082015250565b60006135b7600e8361337d565b91506135c282613581565b600e82019050919050565b7f5b00000000000000000000000000000000000000000000000000000000000000600082015250565b600061360360018361337d565b915061360e826135cd565b600182019050919050565b7f2274726169745f74797065223a20225368617065222c00000000000000000000600082015250565b600061364f60168361337d565b915061365a82613619565b601682019050919050565b7f2276616c7565223a202200000000000000000000000000000000000000000000600082015250565b600061369b600a8361337d565b91506136a682613665565b600a82019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b60006136e760018361337d565b91506136f2826136b1565b600182019050919050565b7f7d2c000000000000000000000000000000000000000000000000000000000000600082015250565b600061373360028361337d565b915061373e826136fd565b600282019050919050565b7f2274726169745f74797065223a20224d657373616765222c0000000000000000600082015250565b600061377f60188361337d565b915061378a82613749565b601882019050919050565b600081905092915050565b60006137ab826126bd565b6137b58185613795565b93506137c58185602086016123e4565b80840191505092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061380760018361337d565b9150613812826137d1565b600182019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061385360018361337d565b915061385e8261381d565b600182019050919050565b6000613874826133b1565b915061387f826133fd565b915061388b8288613420565b91506138968261347a565b91506138a1826134c6565b91506138ad8287613420565b91506138b882613512565b91506138c48286613420565b91506138cf8261355e565b91506138da826135aa565b91506138e5826135f6565b91506138f0826133b1565b91506138fb82613642565b91506139068261368e565b91506139128285613420565b915061391d826136da565b915061392882613726565b9150613933826133b1565b915061393e82613772565b91506139498261368e565b915061395582846137a0565b9150613960826136da565b915061396b826137fa565b915061397682613846565b9150613981826137fa565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006139c6601d8361337d565b91506139d182613990565b601d82019050919050565b60006139e7826139b9565b91506139f38284613420565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a5a6026836123d3565b9150613a65826139fe565b604082019050919050565b60006020820190508181036000830152613a8981613a4d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613aec6025836123d3565b9150613af782613a90565b604082019050919050565b60006020820190508181036000830152613b1b81613adf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613b7e6024836123d3565b9150613b8982613b22565b604082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bea6020836123d3565b9150613bf582613bb4565b602082019050919050565b60006020820190508181036000830152613c1981613bdd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c566019836123d3565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ce86032836123d3565b9150613cf382613c8c565b604082019050919050565b60006020820190508181036000830152613d1781613cdb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d588261247a565b9150613d638361247a565b9250828201905080821115613d7b57613d7a613306565b5b92915050565b6000613d8c8261247a565b9150613d978361247a565b925082613da757613da6613d1e565b5b828204905092915050565b6000613dbd8261247a565b9150613dc88361247a565b9250828202613dd68161247a565b91508282048414831517613ded57613dec613306565b5b5092915050565b6000613dff8261247a565b9150613e0a8361247a565b9250828203905081811115613e2257613e21613306565b5b92915050565b6000608082019050613e3d600083018761250f565b613e4a602083018661250f565b613e576040830185612761565b8181036060830152613e6981846126d9565b905095945050505050565b600081519050613e8381612339565b92915050565b600060208284031215613e9f57613e9e612303565b5b6000613ead84828501613e74565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613eec6020836123d3565b9150613ef782613eb6565b602082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613f58601c836123d3565b9150613f6382613f22565b602082019050919050565b60006020820190508181036000830152613f8781613f4b565b905091905056fe697066733a2f2f516d636b5a783534716b756641706456343939424a537954445a54773662784747744a6467524e766b3869614d374142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b066469a994ebbb0ec42fee19b38d2154aa83a2dc2ed12186f1ced8bb0cd876b64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101405760003560e01c8063715018a6116100b6578063b843cb671161006f578063b843cb6714610439578063b88d4fde14610464578063c3901d101461048d578063c87b56dd146104ca578063e985e9c514610507578063f2fde38b1461054457610140565b8063715018a61461035c5780638da5cb5b1461037357806395d89b411461039e578063a0712d68146103c9578063a22cb465146103e5578063affe39c11461040e57610140565b80633ccfd60b116101085780633ccfd60b1461023c57806342842e0e14610253578063515f06e91461027c5780636352211e146102a55780636f50829a146102e257806370a082311461031f57610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806323b872dd14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612365565b61056d565b60405161017991906123ad565b60405180910390f35b34801561018e57600080fd5b5061019761064f565b6040516101a49190612458565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf91906124b0565b6106e1565b6040516101e1919061251e565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612565565b610727565b005b34801561021f57600080fd5b5061023a600480360381019061023591906125a5565b61083e565b005b34801561024857600080fd5b5061025161089e565b005b34801561025f57600080fd5b5061027a600480360381019061027591906125a5565b610902565b005b34801561028857600080fd5b506102a3600480360381019061029e919061265d565b610922565b005b3480156102b157600080fd5b506102cc60048036038101906102c791906124b0565b6109ed565b6040516102d9919061251e565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906124b0565b610a73565b6040516103169190612712565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612734565b610b18565b6040516103539190612770565b60405180910390f35b34801561036857600080fd5b50610371610bcf565b005b34801561037f57600080fd5b50610388610be3565b604051610395919061251e565b60405180910390f35b3480156103aa57600080fd5b506103b3610c0d565b6040516103c09190612458565b60405180910390f35b6103e360048036038101906103de91906124b0565b610c9f565b005b3480156103f157600080fd5b5061040c600480360381019061040791906127b7565b610d41565b005b34801561041a57600080fd5b50610423610d57565b60405161043091906128b5565b60405180910390f35b34801561044557600080fd5b5061044e610e1f565b60405161045b91906129e3565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612b35565b610ebd565b005b34801561049957600080fd5b506104b460048036038101906104af91906124b0565b610f1f565b6040516104c1919061251e565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec91906124b0565b610f48565b6040516104fe9190612458565b60405180910390f35b34801561051357600080fd5b5061052e60048036038101906105299190612bb8565b610fde565b60405161053b91906123ad565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612734565b611072565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061063857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106485750610647826110f5565b5b9050919050565b60606000805461065e90612c27565b80601f016020809104026020016040519081016040528092919081815260200182805461068a90612c27565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b60006106ec8261115f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610732826109ed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990612cca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c16111aa565b73ffffffffffffffffffffffffffffffffffffffff1614806107f057506107ef816107ea6111aa565b610fde565b5b61082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612d5c565b60405180910390fd5b61083983836111b2565b505050565b61084f6108496111aa565b8261126b565b61088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590612dee565b60405180910390fd5b610899838383611300565b505050565b6108a66115f9565b60006108b0610be3565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156108fd573d6000803e3d6000fd5b505050565b61091d83838360405180602001604052806000815250610ebd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610942846109ed565b73ffffffffffffffffffffffffffffffffffffffff1614610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90612e5a565b60405180910390fd5b81816008600086815260200190815260200160002091826109ba929190613031565b50827f8c204152ec4f09fd07cc5fcf37c95d873e20aa3f48ae1dccf4f2ed3b8d9c769e60405160405180910390a2505050565b6000806109f983611677565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a619061314d565b60405180910390fd5b80915050919050565b6060600860008381526020019081526020016000208054610a9390612c27565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90612c27565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f906131df565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd76115f9565b610be160006116b4565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c1c90612c27565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4890612c27565b8015610c955780601f10610c6a57610100808354040283529160200191610c95565b820191906000526020600020905b815481529060010190602001808311610c7857829003601f168201915b5050505050905090565b60003390506007548210610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf9061324b565b60405180910390fd5b67011c37937e080000341015610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906132b7565b60405180910390fd5b610d3d818361177a565b5050565b610d53610d4c6111aa565b8383611798565b5050565b606060075467ffffffffffffffff811115610d7557610d74612a0a565b5b604051908082528060200260200182016040528015610da35781602001602082028036833780820191505090505b50905060005b8151811015610e1b57610dbb81610f1f565b828281518110610dce57610dcd6132d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610e1390613335565b915050610da9565b5090565b606060075467ffffffffffffffff811115610e3d57610e3c612a0a565b5b604051908082528060200260200182016040528015610e7057816020015b6060815260200190600190039081610e5b5790505b50905060005b8151811015610eb957610e8881610a73565b828281518110610e9b57610e9a6132d7565b5b60200260200101819052508080610eb190613335565b915050610e76565b5090565b610ece610ec86111aa565b8361126b565b610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612dee565b60405180910390fd5b610f1984848484611904565b50505050565b6000610f2a82611960565b610f375760009050610f43565b610f40826109ed565b90505b919050565b60606000610f55836119a1565b604051806060016040528060358152602001613f8f60359139610f77856119a1565b610f8086611a6f565b610f8987610a73565b604051602001610f9d959493929190613869565b6040516020818303038152906040529050610fb781611af5565b604051602001610fc791906139dc565b604051602081830303815290604052915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61107a6115f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090613a70565b60405180910390fd5b6110f2816116b4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61116881611960565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061314d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611225836109ed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611277836109ed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112b957506112b88185610fde565b5b806112f757508373ffffffffffffffffffffffffffffffffffffffff166112df846106e1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611320826109ed565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90613b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613b94565b60405180910390fd5b6113f28383836001611c58565b8273ffffffffffffffffffffffffffffffffffffffff16611412826109ed565b73ffffffffffffffffffffffffffffffffffffffff1614611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613b02565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115f48383836001611d7e565b505050565b6116016111aa565b73ffffffffffffffffffffffffffffffffffffffff1661161f610be3565b73ffffffffffffffffffffffffffffffffffffffff1614611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613c00565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611794828260405180602001604052806000815250611d84565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fd90613c6c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f791906123ad565b60405180910390a3505050565b61190f848484611300565b61191b84848484611ddf565b61195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190613cfe565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661198283611677565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016119b084611f66565b01905060008167ffffffffffffffff8111156119cf576119ce612a0a565b5b6040519080825280601f01601f191660200182016040528015611a015781602001600182028036833780820191505090505b509050600082602001820190505b600115611a64578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611a5857611a57613d1e565b5b04945060008503611a0f575b819350505050919050565b6060600c821015611ab7576040518060400160405280600881526020017f50656e7461676f6e0000000000000000000000000000000000000000000000008152509050611af0565b6040518060400160405280600781526020017f48657861676f6e0000000000000000000000000000000000000000000000000081525090505b919050565b60606000825103611b1757604051806020016040528060008152509050611c53565b6000604051806060016040528060408152602001613fc46040913990506000600360028551611b469190613d4d565b611b509190613d81565b6004611b5c9190613db2565b67ffffffffffffffff811115611b7557611b74612a0a565b5b6040519080825280601f01601f191660200182016040528015611ba75781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c13576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611bb8565b5050600386510660018114611c2f5760028114611c4257611c4a565b603d6001830353603d6002830353611c4a565b603d60018303535b50505080925050505b919050565b6001811115611d7857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611cec5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ce49190613df4565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611d775780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6f9190613d4d565b925050819055505b5b50505050565b50505050565b611d8e83836120b9565b611d9b6000848484611ddf565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613cfe565b60405180910390fd5b505050565b6000611e008473ffffffffffffffffffffffffffffffffffffffff166122d6565b15611f59578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e296111aa565b8786866040518563ffffffff1660e01b8152600401611e4b9493929190613e28565b6020604051808303816000875af1925050508015611e8757506040513d601f19601f82011682018060405250810190611e849190613e89565b60015b611f09573d8060008114611eb7576040519150601f19603f3d011682016040523d82523d6000602084013e611ebc565b606091505b506000815103611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890613cfe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f5e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611fc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611fba57611fb9613d1e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612001576d04ee2d6d415b85acef81000000008381611ff757611ff6613d1e565b5b0492506020810190505b662386f26fc10000831061203057662386f26fc10000838161202657612025613d1e565b5b0492506010810190505b6305f5e1008310612059576305f5e100838161204f5761204e613d1e565b5b0492506008810190505b612710831061207e57612710838161207457612073613d1e565b5b0492506004810190505b606483106120a1576064838161209757612096613d1e565b5b0492506002810190505b600a83106120b0576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90613f02565b60405180910390fd5b61213181611960565b15612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216890613f6e565b60405180910390fd5b61217f600083836001611c58565b61218881611960565b156121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90613f6e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d2600083836001611d7e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123428161230d565b811461234d57600080fd5b50565b60008135905061235f81612339565b92915050565b60006020828403121561237b5761237a612303565b5b600061238984828501612350565b91505092915050565b60008115159050919050565b6123a781612392565b82525050565b60006020820190506123c2600083018461239e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124025780820151818401526020810190506123e7565b60008484015250505050565b6000601f19601f8301169050919050565b600061242a826123c8565b61243481856123d3565b93506124448185602086016123e4565b61244d8161240e565b840191505092915050565b60006020820190508181036000830152612472818461241f565b905092915050565b6000819050919050565b61248d8161247a565b811461249857600080fd5b50565b6000813590506124aa81612484565b92915050565b6000602082840312156124c6576124c5612303565b5b60006124d48482850161249b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612508826124dd565b9050919050565b612518816124fd565b82525050565b6000602082019050612533600083018461250f565b92915050565b612542816124fd565b811461254d57600080fd5b50565b60008135905061255f81612539565b92915050565b6000806040838503121561257c5761257b612303565b5b600061258a85828601612550565b925050602061259b8582860161249b565b9150509250929050565b6000806000606084860312156125be576125bd612303565b5b60006125cc86828701612550565b93505060206125dd86828701612550565b92505060406125ee8682870161249b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261261d5761261c6125f8565b5b8235905067ffffffffffffffff81111561263a576126396125fd565b5b60208301915083600182028301111561265657612655612602565b5b9250929050565b60008060006040848603121561267657612675612303565b5b60006126848682870161249b565b935050602084013567ffffffffffffffff8111156126a5576126a4612308565b5b6126b186828701612607565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60006126e4826126bd565b6126ee81856126c8565b93506126fe8185602086016123e4565b6127078161240e565b840191505092915050565b6000602082019050818103600083015261272c81846126d9565b905092915050565b60006020828403121561274a57612749612303565b5b600061275884828501612550565b91505092915050565b61276a8161247a565b82525050565b60006020820190506127856000830184612761565b92915050565b61279481612392565b811461279f57600080fd5b50565b6000813590506127b18161278b565b92915050565b600080604083850312156127ce576127cd612303565b5b60006127dc85828601612550565b92505060206127ed858286016127a2565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61282c816124fd565b82525050565b600061283e8383612823565b60208301905092915050565b6000602082019050919050565b6000612862826127f7565b61286c8185612802565b935061287783612813565b8060005b838110156128a857815161288f8882612832565b975061289a8361284a565b92505060018101905061287b565b5085935050505092915050565b600060208201905081810360008301526128cf8184612857565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061291f826126bd565b6129298185612903565b93506129398185602086016123e4565b6129428161240e565b840191505092915050565b60006129598383612914565b905092915050565b6000602082019050919050565b6000612979826128d7565b61298381856128e2565b935083602082028501612995856128f3565b8060005b858110156129d157848403895281516129b2858261294d565b94506129bd83612961565b925060208a01995050600181019050612999565b50829750879550505050505092915050565b600060208201905081810360008301526129fd818461296e565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a428261240e565b810181811067ffffffffffffffff82111715612a6157612a60612a0a565b5b80604052505050565b6000612a746122f9565b9050612a808282612a39565b919050565b600067ffffffffffffffff821115612aa057612a9f612a0a565b5b612aa98261240e565b9050602081019050919050565b82818337600083830152505050565b6000612ad8612ad384612a85565b612a6a565b905082815260208101848484011115612af457612af3612a05565b5b612aff848285612ab6565b509392505050565b600082601f830112612b1c57612b1b6125f8565b5b8135612b2c848260208601612ac5565b91505092915050565b60008060008060808587031215612b4f57612b4e612303565b5b6000612b5d87828801612550565b9450506020612b6e87828801612550565b9350506040612b7f8782880161249b565b925050606085013567ffffffffffffffff811115612ba057612b9f612308565b5b612bac87828801612b07565b91505092959194509250565b60008060408385031215612bcf57612bce612303565b5b6000612bdd85828601612550565b9250506020612bee85828601612550565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3f57607f821691505b602082108103612c5257612c51612bf8565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cb46021836123d3565b9150612cbf82612c58565b604082019050919050565b60006020820190508181036000830152612ce381612ca7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d46603d836123d3565b9150612d5182612cea565b604082019050919050565b60006020820190508181036000830152612d7581612d39565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dd8602d836123d3565b9150612de382612d7c565b604082019050919050565b60006020820190508181036000830152612e0781612dcb565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000612e446009836123d3565b9150612e4f82612e0e565b602082019050919050565b60006020820190508181036000830152612e7381612e37565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ee77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612eaa565b612ef18683612eaa565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f2e612f29612f248461247a565b612f09565b61247a565b9050919050565b6000819050919050565b612f4883612f13565b612f5c612f5482612f35565b848454612eb7565b825550505050565b600090565b612f71612f64565b612f7c818484612f3f565b505050565b5b81811015612fa057612f95600082612f69565b600181019050612f82565b5050565b601f821115612fe557612fb681612e85565b612fbf84612e9a565b81016020851015612fce578190505b612fe2612fda85612e9a565b830182612f81565b50505b505050565b600082821c905092915050565b600061300860001984600802612fea565b1980831691505092915050565b60006130218383612ff7565b9150826002028217905092915050565b61303b8383612e7a565b67ffffffffffffffff81111561305457613053612a0a565b5b61305e8254612c27565b613069828285612fa4565b6000601f8311600181146130985760008415613086578287013590505b6130908582613015565b8655506130f8565b601f1984166130a686612e85565b60005b828110156130ce578489013582556001820191506020850194506020810190506130a9565b868310156130eb57848901356130e7601f891682612ff7565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006131376018836123d3565b915061314282613101565b602082019050919050565b600060208201905081810360008301526131668161312a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006131c96029836123d3565b91506131d48261316d565b604082019050919050565b600060208201905081810360008301526131f8816131bc565b9050919050565b7f6f7574206f6620626f756e647300000000000000000000000000000000000000600082015250565b6000613235600d836123d3565b9150613240826131ff565b602082019050919050565b6000602082019050818103600083015261326481613228565b9050919050565b7f6e6f7420656e6f756768204554482028302e3038290000000000000000000000600082015250565b60006132a16015836123d3565b91506132ac8261326b565b602082019050919050565b600060208201905081810360008301526132d081613294565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133408261247a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337257613371613306565b5b600182019050919050565b600081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006133be60018361337d565b91506133c982613388565b600182019050919050565b7f226e616d65223a202254696c6520230000000000000000000000000000000000600082015250565b600061340a600f8361337d565b9150613415826133d4565b600f82019050919050565b600061342b826123c8565b613435818561337d565b93506134458185602086016123e4565b80840191505092915050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061348760028361337d565b915061349282613451565b600282019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b60006134d3600a8361337d565b91506134de8261349d565b600a82019050919050565b7f2f74696c65000000000000000000000000000000000000000000000000000000600082015250565b600061351f60058361337d565b915061352a826134e9565b600582019050919050565b7f2e6a706567222c00000000000000000000000000000000000000000000000000600082015250565b600061356b60078361337d565b915061357682613535565b600782019050919050565b7f2261747472696275746573223a20000000000000000000000000000000000000600082015250565b60006135b7600e8361337d565b91506135c282613581565b600e82019050919050565b7f5b00000000000000000000000000000000000000000000000000000000000000600082015250565b600061360360018361337d565b915061360e826135cd565b600182019050919050565b7f2274726169745f74797065223a20225368617065222c00000000000000000000600082015250565b600061364f60168361337d565b915061365a82613619565b601682019050919050565b7f2276616c7565223a202200000000000000000000000000000000000000000000600082015250565b600061369b600a8361337d565b91506136a682613665565b600a82019050919050565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b60006136e760018361337d565b91506136f2826136b1565b600182019050919050565b7f7d2c000000000000000000000000000000000000000000000000000000000000600082015250565b600061373360028361337d565b915061373e826136fd565b600282019050919050565b7f2274726169745f74797065223a20224d657373616765222c0000000000000000600082015250565b600061377f60188361337d565b915061378a82613749565b601882019050919050565b600081905092915050565b60006137ab826126bd565b6137b58185613795565b93506137c58185602086016123e4565b80840191505092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061380760018361337d565b9150613812826137d1565b600182019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061385360018361337d565b915061385e8261381d565b600182019050919050565b6000613874826133b1565b915061387f826133fd565b915061388b8288613420565b91506138968261347a565b91506138a1826134c6565b91506138ad8287613420565b91506138b882613512565b91506138c48286613420565b91506138cf8261355e565b91506138da826135aa565b91506138e5826135f6565b91506138f0826133b1565b91506138fb82613642565b91506139068261368e565b91506139128285613420565b915061391d826136da565b915061392882613726565b9150613933826133b1565b915061393e82613772565b91506139498261368e565b915061395582846137a0565b9150613960826136da565b915061396b826137fa565b915061397682613846565b9150613981826137fa565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006139c6601d8361337d565b91506139d182613990565b601d82019050919050565b60006139e7826139b9565b91506139f38284613420565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a5a6026836123d3565b9150613a65826139fe565b604082019050919050565b60006020820190508181036000830152613a8981613a4d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613aec6025836123d3565b9150613af782613a90565b604082019050919050565b60006020820190508181036000830152613b1b81613adf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613b7e6024836123d3565b9150613b8982613b22565b604082019050919050565b60006020820190508181036000830152613bad81613b71565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bea6020836123d3565b9150613bf582613bb4565b602082019050919050565b60006020820190508181036000830152613c1981613bdd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c566019836123d3565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ce86032836123d3565b9150613cf382613c8c565b604082019050919050565b60006020820190508181036000830152613d1781613cdb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d588261247a565b9150613d638361247a565b9250828201905080821115613d7b57613d7a613306565b5b92915050565b6000613d8c8261247a565b9150613d978361247a565b925082613da757613da6613d1e565b5b828204905092915050565b6000613dbd8261247a565b9150613dc88361247a565b9250828202613dd68161247a565b91508282048414831517613ded57613dec613306565b5b5092915050565b6000613dff8261247a565b9150613e0a8361247a565b9250828203905081811115613e2257613e21613306565b5b92915050565b6000608082019050613e3d600083018761250f565b613e4a602083018661250f565b613e576040830185612761565b8181036060830152613e6981846126d9565b905095945050505050565b600081519050613e8381612339565b92915050565b600060208284031215613e9f57613e9e612303565b5b6000613ead84828501613e74565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613eec6020836123d3565b9150613ef782613eb6565b602082019050919050565b60006020820190508181036000830152613f1b81613edf565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613f58601c836123d3565b9150613f6382613f22565b602082019050919050565b60006020820190508181036000830152613f8781613f4b565b905091905056fe697066733a2f2f516d636b5a783534716b756641706456343939424a537954445a54773662784747744a6467524e766b3869614d374142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b066469a994ebbb0ec42fee19b38d2154aa83a2dc2ed12186f1ced8bb0cd876b64736f6c63430008130033
Deployed Bytecode Sourcemap
58390:3499:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36094:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37022:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38534:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38052:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39234:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59855:172;;;;;;;;;;;;;:::i;:::-;;39640:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61292:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36732:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61511:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36463:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53835:103;;;;;;;;;;;;;:::i;:::-;;53187:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37191:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58925:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38777:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59562:225;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61633:253;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39896:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59261:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60136:911;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39003:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54093:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36094:305;36196:4;36248:25;36233:40;;;:11;:40;;;;:105;;;;36305:33;36290:48;;;:11;:48;;;;36233:105;:158;;;;36355:36;36379:11;36355:23;:36::i;:::-;36233:158;36213:178;;36094:305;;;:::o;37022:100::-;37076:13;37109:5;37102:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37022:100;:::o;38534:171::-;38610:7;38630:23;38645:7;38630:14;:23::i;:::-;38673:15;:24;38689:7;38673:24;;;;;;;;;;;;;;;;;;;;;38666:31;;38534:171;;;:::o;38052:416::-;38133:13;38149:23;38164:7;38149:14;:23::i;:::-;38133:39;;38197:5;38191:11;;:2;:11;;;38183:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38291:5;38275:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38300:37;38317:5;38324:12;:10;:12::i;:::-;38300:16;:37::i;:::-;38275:62;38253:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;38439:21;38448:2;38452:7;38439:8;:21::i;:::-;38122:346;38052:416;;:::o;39234:335::-;39429:41;39448:12;:10;:12::i;:::-;39462:7;39429:18;:41::i;:::-;39421:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39533:28;39543:4;39549:2;39553:7;39533:9;:28::i;:::-;39234:335;;;:::o;59855:172::-;53073:13;:11;:13::i;:::-;59903::::1;59919:7;:5;:7::i;:::-;59903:23;;59937:15;59955:21;59937:39;;59995:5;59987:23;;:32;60011:7;59987:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59892:135;;59855:172::o:0;39640:185::-;39778:39;39795:4;39801:2;39805:7;39778:39;;;;;;;;;;;;:16;:39::i;:::-;39640:185;;;:::o;61292:211::-;61395:10;61377:28;;:14;61385:5;61377:7;:14::i;:::-;:28;;;61369:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;61451:4;;61430:11;:18;61442:5;61430:18;;;;;;;;;;;:25;;;;;;;:::i;:::-;;61489:5;61471:24;;;;;;;;;;61292:211;;;:::o;36732:223::-;36804:7;36824:13;36840:17;36849:7;36840:8;:17::i;:::-;36824:33;;36893:1;36876:19;;:5;:19;;;36868:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:5;36935:12;;;36732:223;;;:::o;61511:114::-;61567:12;61599:11;:18;61611:5;61599:18;;;;;;;;;;;61592:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61511:114;;;:::o;36463:207::-;36535:7;36580:1;36563:19;;:5;:19;;;36555:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36646:9;:16;36656:5;36646:16;;;;;;;;;;;;;;;;36639:23;;36463:207;;;:::o;53835:103::-;53073:13;:11;:13::i;:::-;53900:30:::1;53927:1;53900:18;:30::i;:::-;53835:103::o:0;53187:87::-;53233:7;53260:6;;;;;;;;;;;53253:13;;53187:87;:::o;37191:104::-;37247:13;37280:7;37273:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37191:104;:::o;58925:250::-;58980:14;58997:10;58980:27;;59034:10;;59026:5;:18;59018:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59094:10;59081:9;:23;;59073:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59143:24;59153:6;59161:5;59143:9;:24::i;:::-;58969:206;58925:250;:::o;38777:155::-;38872:52;38891:12;:10;:12::i;:::-;38905:8;38915;38872:18;:52::i;:::-;38777:155;;:::o;59562:225::-;59603:24;59664:10;;59650:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59640:35;;59691:6;59686:94;59703:7;:14;59701:1;:16;59686:94;;;59752:16;59766:1;59752:13;:16::i;:::-;59739:7;59747:1;59739:10;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;;;59719:3;;;;;:::i;:::-;;;;59686:94;;;;59562:225;:::o;61633:253::-;61681:29;61752:10;;61740:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61723:40;;61779:6;61774:105;61791:14;:21;61789:1;:23;61774:105;;;61854:13;61865:1;61854:10;:13::i;:::-;61834:14;61849:1;61834:17;;;;;;;;:::i;:::-;;;;;;;:33;;;;61814:3;;;;;:::i;:::-;;;;61774:105;;;;61633:253;:::o;39896:322::-;40070:41;40089:12;:10;:12::i;:::-;40103:7;40070:18;:41::i;:::-;40062:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;40172:38;40186:4;40192:2;40196:7;40205:4;40172:13;:38::i;:::-;39896:322;;;;:::o;59261:189::-;59322:7;59347:16;59355:7;59347;:16::i;:::-;59342:67;;59395:1;59380:17;;;;59342:67;59426:16;59434:7;59426;:16::i;:::-;59419:23;;59261:189;;;;:::o;60136:911::-;60209:13;60235:20;60330:18;:7;:16;:18::i;:::-;60387:14;;;;;;;;;;;;;;;;;60412:18;:7;:16;:18::i;:::-;60599:15;60606:7;60599:6;:15::i;:::-;60766:19;60777:7;60766:10;:19::i;:::-;60258:609;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60235:632;;60991:22;61005:7;60991:13;:22::i;:::-;60906:122;;;;;;;;:::i;:::-;;;;;;;;;;;;;60878:161;;;60136:911;;;:::o;39003:164::-;39100:4;39124:18;:25;39143:5;39124:25;;;;;;;;;;;;;;;:35;39150:8;39124:35;;;;;;;;;;;;;;;;;;;;;;;;;39117:42;;39003:164;;;;:::o;54093:201::-;53073:13;:11;:13::i;:::-;54202:1:::1;54182:22;;:8;:22;;::::0;54174:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54258:28;54277:8;54258:18;:28::i;:::-;54093:201:::0;:::o;34500:157::-;34585:4;34624:25;34609:40;;;:11;:40;;;;34602:47;;34500:157;;;:::o;48353:135::-;48435:16;48443:7;48435;:16::i;:::-;48427:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48353:135;:::o;18156:98::-;18209:7;18236:10;18229:17;;18156:98;:::o;47632:174::-;47734:2;47707:15;:24;47723:7;47707:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47790:7;47786:2;47752:46;;47761:23;47776:7;47761:14;:23::i;:::-;47752:46;;;;;;;;;;;;47632:174;;:::o;42251:264::-;42344:4;42361:13;42377:23;42392:7;42377:14;:23::i;:::-;42361:39;;42430:5;42419:16;;:7;:16;;;:52;;;;42439:32;42456:5;42463:7;42439:16;:32::i;:::-;42419:52;:87;;;;42499:7;42475:31;;:20;42487:7;42475:11;:20::i;:::-;:31;;;42419:87;42411:96;;;42251:264;;;;:::o;46250:1263::-;46409:4;46382:31;;:23;46397:7;46382:14;:23::i;:::-;:31;;;46374:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46488:1;46474:16;;:2;:16;;;46466:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46544:42;46565:4;46571:2;46575:7;46584:1;46544:20;:42::i;:::-;46716:4;46689:31;;:23;46704:7;46689:14;:23::i;:::-;:31;;;46681:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46834:15;:24;46850:7;46834:24;;;;;;;;;;;;46827:31;;;;;;;;;;;47329:1;47310:9;:15;47320:4;47310:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;47362:1;47345:9;:13;47355:2;47345:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47404:2;47385:7;:16;47393:7;47385:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47443:7;47439:2;47424:27;;47433:4;47424:27;;;;;;;;;;;;47464:41;47484:4;47490:2;47494:7;47503:1;47464:19;:41::i;:::-;46250:1263;;;:::o;53352:132::-;53427:12;:10;:12::i;:::-;53416:23;;:7;:5;:7::i;:::-;:23;;;53408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53352:132::o;41526:117::-;41592:7;41619;:16;41627:7;41619:16;;;;;;;;;;;;;;;;;;;;;41612:23;;41526:117;;;:::o;54454:191::-;54528:16;54547:6;;;;;;;;;;;54528:25;;54573:8;54564:6;;:17;;;;;;;;;;;;;;;;;;54628:8;54597:40;;54618:8;54597:40;;;;;;;;;;;;54517:128;54454:191;:::o;42857:110::-;42933:26;42943:2;42947:7;42933:26;;;;;;;;;;;;:9;:26::i;:::-;42857:110;;:::o;47949:315::-;48104:8;48095:17;;:5;:17;;;48087:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48191:8;48153:18;:25;48172:5;48153:25;;;;;;;;;;;;;;;:35;48179:8;48153:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48237:8;48215:41;;48230:5;48215:41;;;48247:8;48215:41;;;;;;:::i;:::-;;;;;;;;47949:315;;;:::o;41099:313::-;41255:28;41265:4;41271:2;41275:7;41255:9;:28::i;:::-;41302:47;41325:4;41331:2;41335:7;41344:4;41302:22;:47::i;:::-;41294:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41099:313;;;;:::o;41956:128::-;42021:4;42074:1;42045:31;;:17;42054:7;42045:8;:17::i;:::-;:31;;;;42038:38;;41956:128;;;:::o;31723:716::-;31779:13;31830:14;31867:1;31847:17;31858:5;31847:10;:17::i;:::-;:21;31830:38;;31883:20;31917:6;31906:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31883:41;;31939:11;32068:6;32064:2;32060:15;32052:6;32048:28;32041:35;;32105:288;32112:4;32105:288;;;32137:5;;;;;;;;32279:8;32274:2;32267:5;32263:14;32258:30;32253:3;32245:44;32335:2;32326:11;;;;;;:::i;:::-;;;;;32369:1;32360:5;:10;32105:288;32356:21;32105:288;32414:6;32407:13;;;;;31723:716;;;:::o;61055:189::-;61111:13;58702:2;61141:7;:23;61137:73;;;61181:17;;;;;;;;;;;;;;;;;;;;;61137:73;61220:16;;;;;;;;;;;;;;;;;;;61055:189;;;;:::o;55218:3097::-;55276:13;55528:1;55513:4;:11;:16;55509:31;;55531:9;;;;;;;;;;;;;;;;55509:31;55593:19;55615:6;;;;;;;;;;;;;;;;;55593:28;;56032:20;56091:1;56086;56072:4;:11;:15;;;;:::i;:::-;56071:21;;;;:::i;:::-;56066:1;:27;;;;:::i;:::-;56055:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56032:62;;56274:1;56267:5;56263:13;56378:2;56370:6;56366:15;56489:4;56541;56535:11;56529:4;56525:22;56451:1432;56575:6;56566:7;56563:19;56451:1432;;;56681:1;56672:7;56668:15;56657:26;;56720:7;56714:14;57373:4;57365:5;57361:2;57357:14;57353:25;57343:8;57339:40;57333:47;57322:9;57314:67;57427:1;57416:9;57412:17;57399:30;;57519:4;57511:5;57507:2;57503:14;57499:25;57489:8;57485:40;57479:47;57468:9;57460:67;57573:1;57562:9;57558:17;57545:30;;57664:4;57656:5;57653:1;57649:13;57645:24;57635:8;57631:39;57625:46;57614:9;57606:66;57718:1;57707:9;57703:17;57690:30;;57801:4;57794:5;57790:16;57780:8;57776:31;57770:38;57759:9;57751:58;57855:1;57844:9;57840:17;57827:30;;56602:1281;56451:1432;;;56455:107;;58045:1;58038:4;58032:11;58028:19;58066:1;58061:123;;;;58203:1;58198:73;;;;58021:250;;58061:123;58114:4;58110:1;58099:9;58095:17;58087:32;58164:4;58160:1;58149:9;58145:17;58137:32;58061:123;;58198:73;58251:4;58247:1;58236:9;58232:17;58224:32;58021:250;;56160:2122;;58301:6;58294:13;;;;55218:3097;;;;:::o;50637:410::-;50827:1;50815:9;:13;50811:229;;;50865:1;50849:18;;:4;:18;;;50845:87;;50907:9;50888;:15;50898:4;50888:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;50845:87;50964:1;50950:16;;:2;:16;;;50946:83;;51004:9;50987;:13;50997:2;50987:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;50946:83;50811:229;50637:410;;;;:::o;51769:158::-;;;;;:::o;43194:319::-;43323:18;43329:2;43333:7;43323:5;:18::i;:::-;43374:53;43405:1;43409:2;43413:7;43422:4;43374:22;:53::i;:::-;43352:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;43194:319;;;:::o;49052:853::-;49206:4;49227:15;:2;:13;;;:15::i;:::-;49223:675;;;49279:2;49263:36;;;49300:12;:10;:12::i;:::-;49314:4;49320:7;49329:4;49263:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49259:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49521:1;49504:6;:13;:18;49500:328;;49547:60;;;;;;;;;;:::i;:::-;;;;;;;;49500:328;49778:6;49772:13;49763:6;49759:2;49755:15;49748:38;49259:584;49395:41;;;49385:51;;;:6;:51;;;;49378:58;;;;;49223:675;49882:4;49875:11;;49052:853;;;;;;;:::o;28566:922::-;28619:7;28639:14;28656:1;28639:18;;28706:6;28697:5;:15;28693:102;;28742:6;28733:15;;;;;;:::i;:::-;;;;;28777:2;28767:12;;;;28693:102;28822:6;28813:5;:15;28809:102;;28858:6;28849:15;;;;;;:::i;:::-;;;;;28893:2;28883:12;;;;28809:102;28938:6;28929:5;:15;28925:102;;28974:6;28965:15;;;;;;:::i;:::-;;;;;29009:2;28999:12;;;;28925:102;29054:5;29045;:14;29041:99;;29089:5;29080:14;;;;;;:::i;:::-;;;;;29123:1;29113:11;;;;29041:99;29167:5;29158;:14;29154:99;;29202:5;29193:14;;;;;;:::i;:::-;;;;;29236:1;29226:11;;;;29154:99;29280:5;29271;:14;29267:99;;29315:5;29306:14;;;;;;:::i;:::-;;;;;29349:1;29339:11;;;;29267:99;29393:5;29384;:14;29380:66;;29429:1;29419:11;;;;29380:66;29474:6;29467:13;;;28566:922;;;:::o;43849:942::-;43943:1;43929:16;;:2;:16;;;43921:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44002:16;44010:7;44002;:16::i;:::-;44001:17;43993:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44064:48;44093:1;44097:2;44101:7;44110:1;44064:20;:48::i;:::-;44211:16;44219:7;44211;:16::i;:::-;44210:17;44202:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44626:1;44609:9;:13;44619:2;44609:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;44670:2;44651:7;:16;44659:7;44651:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44715:7;44711:2;44690:33;;44707:1;44690:33;;;;;;;;;;;;44736:47;44764:1;44768:2;44772:7;44781:1;44736:19;:47::i;:::-;43849:942;;:::o;9262:326::-;9322:4;9579:1;9557:7;:19;;;:23;9550:30;;9262:326;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:117::-;5624:1;5621;5614:12;5638:117;5747:1;5744;5737:12;5761:117;5870:1;5867;5860:12;5897:552;5954:8;5964:6;6014:3;6007:4;5999:6;5995:17;5991:27;5981:122;;6022:79;;:::i;:::-;5981:122;6135:6;6122:20;6112:30;;6165:18;6157:6;6154:30;6151:117;;;6187:79;;:::i;:::-;6151:117;6301:4;6293:6;6289:17;6277:29;;6355:3;6347:4;6339:6;6335:17;6325:8;6321:32;6318:41;6315:128;;;6362:79;;:::i;:::-;6315:128;5897:552;;;;;:::o;6455:672::-;6534:6;6542;6550;6599:2;6587:9;6578:7;6574:23;6570:32;6567:119;;;6605:79;;:::i;:::-;6567:119;6725:1;6750:53;6795:7;6786:6;6775:9;6771:22;6750:53;:::i;:::-;6740:63;;6696:117;6880:2;6869:9;6865:18;6852:32;6911:18;6903:6;6900:30;6897:117;;;6933:79;;:::i;:::-;6897:117;7046:64;7102:7;7093:6;7082:9;7078:22;7046:64;:::i;:::-;7028:82;;;;6823:297;6455:672;;;;;:::o;7133:98::-;7184:6;7218:5;7212:12;7202:22;;7133:98;;;:::o;7237:168::-;7320:11;7354:6;7349:3;7342:19;7394:4;7389:3;7385:14;7370:29;;7237:168;;;;:::o;7411:373::-;7497:3;7525:38;7557:5;7525:38;:::i;:::-;7579:70;7642:6;7637:3;7579:70;:::i;:::-;7572:77;;7658:65;7716:6;7711:3;7704:4;7697:5;7693:16;7658:65;:::i;:::-;7748:29;7770:6;7748:29;:::i;:::-;7743:3;7739:39;7732:46;;7501:283;7411:373;;;;:::o;7790:309::-;7901:4;7939:2;7928:9;7924:18;7916:26;;7988:9;7982:4;7978:20;7974:1;7963:9;7959:17;7952:47;8016:76;8087:4;8078:6;8016:76;:::i;:::-;8008:84;;7790:309;;;;:::o;8105:329::-;8164:6;8213:2;8201:9;8192:7;8188:23;8184:32;8181:119;;;8219:79;;:::i;:::-;8181:119;8339:1;8364:53;8409:7;8400:6;8389:9;8385:22;8364:53;:::i;:::-;8354:63;;8310:117;8105:329;;;;:::o;8440:118::-;8527:24;8545:5;8527:24;:::i;:::-;8522:3;8515:37;8440:118;;:::o;8564:222::-;8657:4;8695:2;8684:9;8680:18;8672:26;;8708:71;8776:1;8765:9;8761:17;8752:6;8708:71;:::i;:::-;8564:222;;;;:::o;8792:116::-;8862:21;8877:5;8862:21;:::i;:::-;8855:5;8852:32;8842:60;;8898:1;8895;8888:12;8842:60;8792:116;:::o;8914:133::-;8957:5;8995:6;8982:20;8973:29;;9011:30;9035:5;9011:30;:::i;:::-;8914:133;;;;:::o;9053:468::-;9118:6;9126;9175:2;9163:9;9154:7;9150:23;9146:32;9143:119;;;9181:79;;:::i;:::-;9143:119;9301:1;9326:53;9371:7;9362:6;9351:9;9347:22;9326:53;:::i;:::-;9316:63;;9272:117;9428:2;9454:50;9496:7;9487:6;9476:9;9472:22;9454:50;:::i;:::-;9444:60;;9399:115;9053:468;;;;;:::o;9527:114::-;9594:6;9628:5;9622:12;9612:22;;9527:114;;;:::o;9647:184::-;9746:11;9780:6;9775:3;9768:19;9820:4;9815:3;9811:14;9796:29;;9647:184;;;;:::o;9837:132::-;9904:4;9927:3;9919:11;;9957:4;9952:3;9948:14;9940:22;;9837:132;;;:::o;9975:108::-;10052:24;10070:5;10052:24;:::i;:::-;10047:3;10040:37;9975:108;;:::o;10089:179::-;10158:10;10179:46;10221:3;10213:6;10179:46;:::i;:::-;10257:4;10252:3;10248:14;10234:28;;10089:179;;;;:::o;10274:113::-;10344:4;10376;10371:3;10367:14;10359:22;;10274:113;;;:::o;10423:732::-;10542:3;10571:54;10619:5;10571:54;:::i;:::-;10641:86;10720:6;10715:3;10641:86;:::i;:::-;10634:93;;10751:56;10801:5;10751:56;:::i;:::-;10830:7;10861:1;10846:284;10871:6;10868:1;10865:13;10846:284;;;10947:6;10941:13;10974:63;11033:3;11018:13;10974:63;:::i;:::-;10967:70;;11060:60;11113:6;11060:60;:::i;:::-;11050:70;;10906:224;10893:1;10890;10886:9;10881:14;;10846:284;;;10850:14;11146:3;11139:10;;10547:608;;;10423:732;;;;:::o;11161:373::-;11304:4;11342:2;11331:9;11327:18;11319:26;;11391:9;11385:4;11381:20;11377:1;11366:9;11362:17;11355:47;11419:108;11522:4;11513:6;11419:108;:::i;:::-;11411:116;;11161:373;;;;:::o;11540:123::-;11616:6;11650:5;11644:12;11634:22;;11540:123;;;:::o;11669:193::-;11777:11;11811:6;11806:3;11799:19;11851:4;11846:3;11842:14;11827:29;;11669:193;;;;:::o;11868:141::-;11944:4;11967:3;11959:11;;11997:4;11992:3;11988:14;11980:22;;11868:141;;;:::o;12015:158::-;12088:11;12122:6;12117:3;12110:19;12162:4;12157:3;12153:14;12138:29;;12015:158;;;;:::o;12179:353::-;12255:3;12283:38;12315:5;12283:38;:::i;:::-;12337:60;12390:6;12385:3;12337:60;:::i;:::-;12330:67;;12406:65;12464:6;12459:3;12452:4;12445:5;12441:16;12406:65;:::i;:::-;12496:29;12518:6;12496:29;:::i;:::-;12491:3;12487:39;12480:46;;12259:273;12179:353;;;;:::o;12538:192::-;12625:10;12660:64;12720:3;12712:6;12660:64;:::i;:::-;12646:78;;12538:192;;;;:::o;12736:122::-;12815:4;12847;12842:3;12838:14;12830:22;;12736:122;;;:::o;12890:983::-;13027:3;13056:63;13113:5;13056:63;:::i;:::-;13135:95;13223:6;13218:3;13135:95;:::i;:::-;13128:102;;13256:3;13301:4;13293:6;13289:17;13284:3;13280:27;13331:65;13390:5;13331:65;:::i;:::-;13419:7;13450:1;13435:393;13460:6;13457:1;13454:13;13435:393;;;13531:9;13525:4;13521:20;13516:3;13509:33;13582:6;13576:13;13610:82;13687:4;13672:13;13610:82;:::i;:::-;13602:90;;13715:69;13777:6;13715:69;:::i;:::-;13705:79;;13813:4;13808:3;13804:14;13797:21;;13495:333;13482:1;13479;13475:9;13470:14;;13435:393;;;13439:14;13844:4;13837:11;;13864:3;13857:10;;13032:841;;;;;12890:983;;;;:::o;13879:409::-;14040:4;14078:2;14067:9;14063:18;14055:26;;14127:9;14121:4;14117:20;14113:1;14102:9;14098:17;14091:47;14155:126;14276:4;14267:6;14155:126;:::i;:::-;14147:134;;13879:409;;;;:::o;14294:117::-;14403:1;14400;14393:12;14417:180;14465:77;14462:1;14455:88;14562:4;14559:1;14552:15;14586:4;14583:1;14576:15;14603:281;14686:27;14708:4;14686:27;:::i;:::-;14678:6;14674:40;14816:6;14804:10;14801:22;14780:18;14768:10;14765:34;14762:62;14759:88;;;14827:18;;:::i;:::-;14759:88;14867:10;14863:2;14856:22;14646:238;14603:281;;:::o;14890:129::-;14924:6;14951:20;;:::i;:::-;14941:30;;14980:33;15008:4;15000:6;14980:33;:::i;:::-;14890:129;;;:::o;15025:307::-;15086:4;15176:18;15168:6;15165:30;15162:56;;;15198:18;;:::i;:::-;15162:56;15236:29;15258:6;15236:29;:::i;:::-;15228:37;;15320:4;15314;15310:15;15302:23;;15025:307;;;:::o;15338:146::-;15435:6;15430:3;15425;15412:30;15476:1;15467:6;15462:3;15458:16;15451:27;15338:146;;;:::o;15490:423::-;15567:5;15592:65;15608:48;15649:6;15608:48;:::i;:::-;15592:65;:::i;:::-;15583:74;;15680:6;15673:5;15666:21;15718:4;15711:5;15707:16;15756:3;15747:6;15742:3;15738:16;15735:25;15732:112;;;15763:79;;:::i;:::-;15732:112;15853:54;15900:6;15895:3;15890;15853:54;:::i;:::-;15573:340;15490:423;;;;;:::o;15932:338::-;15987:5;16036:3;16029:4;16021:6;16017:17;16013:27;16003:122;;16044:79;;:::i;:::-;16003:122;16161:6;16148:20;16186:78;16260:3;16252:6;16245:4;16237:6;16233:17;16186:78;:::i;:::-;16177:87;;15993:277;15932:338;;;;:::o;16276:943::-;16371:6;16379;16387;16395;16444:3;16432:9;16423:7;16419:23;16415:33;16412:120;;;16451:79;;:::i;:::-;16412:120;16571:1;16596:53;16641:7;16632:6;16621:9;16617:22;16596:53;:::i;:::-;16586:63;;16542:117;16698:2;16724:53;16769:7;16760:6;16749:9;16745:22;16724:53;:::i;:::-;16714:63;;16669:118;16826:2;16852:53;16897:7;16888:6;16877:9;16873:22;16852:53;:::i;:::-;16842:63;;16797:118;16982:2;16971:9;16967:18;16954:32;17013:18;17005:6;17002:30;16999:117;;;17035:79;;:::i;:::-;16999:117;17140:62;17194:7;17185:6;17174:9;17170:22;17140:62;:::i;:::-;17130:72;;16925:287;16276:943;;;;;;;:::o;17225:474::-;17293:6;17301;17350:2;17338:9;17329:7;17325:23;17321:32;17318:119;;;17356:79;;:::i;:::-;17318:119;17476:1;17501:53;17546:7;17537:6;17526:9;17522:22;17501:53;:::i;:::-;17491:63;;17447:117;17603:2;17629:53;17674:7;17665:6;17654:9;17650:22;17629:53;:::i;:::-;17619:63;;17574:118;17225:474;;;;;:::o;17705:180::-;17753:77;17750:1;17743:88;17850:4;17847:1;17840:15;17874:4;17871:1;17864:15;17891:320;17935:6;17972:1;17966:4;17962:12;17952:22;;18019:1;18013:4;18009:12;18040:18;18030:81;;18096:4;18088:6;18084:17;18074:27;;18030:81;18158:2;18150:6;18147:14;18127:18;18124:38;18121:84;;18177:18;;:::i;:::-;18121:84;17942:269;17891:320;;;:::o;18217:220::-;18357:34;18353:1;18345:6;18341:14;18334:58;18426:3;18421:2;18413:6;18409:15;18402:28;18217:220;:::o;18443:366::-;18585:3;18606:67;18670:2;18665:3;18606:67;:::i;:::-;18599:74;;18682:93;18771:3;18682:93;:::i;:::-;18800:2;18795:3;18791:12;18784:19;;18443:366;;;:::o;18815:419::-;18981:4;19019:2;19008:9;19004:18;18996:26;;19068:9;19062:4;19058:20;19054:1;19043:9;19039:17;19032:47;19096:131;19222:4;19096:131;:::i;:::-;19088:139;;18815:419;;;:::o;19240:248::-;19380:34;19376:1;19368:6;19364:14;19357:58;19449:31;19444:2;19436:6;19432:15;19425:56;19240:248;:::o;19494:366::-;19636:3;19657:67;19721:2;19716:3;19657:67;:::i;:::-;19650:74;;19733:93;19822:3;19733:93;:::i;:::-;19851:2;19846:3;19842:12;19835:19;;19494:366;;;:::o;19866:419::-;20032:4;20070:2;20059:9;20055:18;20047:26;;20119:9;20113:4;20109:20;20105:1;20094:9;20090:17;20083:47;20147:131;20273:4;20147:131;:::i;:::-;20139:139;;19866:419;;;:::o;20291:232::-;20431:34;20427:1;20419:6;20415:14;20408:58;20500:15;20495:2;20487:6;20483:15;20476:40;20291:232;:::o;20529:366::-;20671:3;20692:67;20756:2;20751:3;20692:67;:::i;:::-;20685:74;;20768:93;20857:3;20768:93;:::i;:::-;20886:2;20881:3;20877:12;20870:19;;20529:366;;;:::o;20901:419::-;21067:4;21105:2;21094:9;21090:18;21082:26;;21154:9;21148:4;21144:20;21140:1;21129:9;21125:17;21118:47;21182:131;21308:4;21182:131;:::i;:::-;21174:139;;20901:419;;;:::o;21326:159::-;21466:11;21462:1;21454:6;21450:14;21443:35;21326:159;:::o;21491:365::-;21633:3;21654:66;21718:1;21713:3;21654:66;:::i;:::-;21647:73;;21729:93;21818:3;21729:93;:::i;:::-;21847:2;21842:3;21838:12;21831:19;;21491:365;;;:::o;21862:419::-;22028:4;22066:2;22055:9;22051:18;22043:26;;22115:9;22109:4;22105:20;22101:1;22090:9;22086:17;22079:47;22143:131;22269:4;22143:131;:::i;:::-;22135:139;;21862:419;;;:::o;22287:96::-;22345:6;22373:3;22363:13;;22287:96;;;;:::o;22389:140::-;22437:4;22460:3;22452:11;;22483:3;22480:1;22473:14;22517:4;22514:1;22504:18;22496:26;;22389:140;;;:::o;22535:93::-;22572:6;22619:2;22614;22607:5;22603:14;22599:23;22589:33;;22535:93;;;:::o;22634:107::-;22678:8;22728:5;22722:4;22718:16;22697:37;;22634:107;;;;:::o;22747:393::-;22816:6;22866:1;22854:10;22850:18;22889:97;22919:66;22908:9;22889:97;:::i;:::-;23007:39;23037:8;23026:9;23007:39;:::i;:::-;22995:51;;23079:4;23075:9;23068:5;23064:21;23055:30;;23128:4;23118:8;23114:19;23107:5;23104:30;23094:40;;22823:317;;22747:393;;;;;:::o;23146:60::-;23174:3;23195:5;23188:12;;23146:60;;;:::o;23212:142::-;23262:9;23295:53;23313:34;23322:24;23340:5;23322:24;:::i;:::-;23313:34;:::i;:::-;23295:53;:::i;:::-;23282:66;;23212:142;;;:::o;23360:75::-;23403:3;23424:5;23417:12;;23360:75;;;:::o;23441:269::-;23551:39;23582:7;23551:39;:::i;:::-;23612:91;23661:41;23685:16;23661:41;:::i;:::-;23653:6;23646:4;23640:11;23612:91;:::i;:::-;23606:4;23599:105;23517:193;23441:269;;;:::o;23716:73::-;23761:3;23716:73;:::o;23795:189::-;23872:32;;:::i;:::-;23913:65;23971:6;23963;23957:4;23913:65;:::i;:::-;23848:136;23795:189;;:::o;23990:186::-;24050:120;24067:3;24060:5;24057:14;24050:120;;;24121:39;24158:1;24151:5;24121:39;:::i;:::-;24094:1;24087:5;24083:13;24074:22;;24050:120;;;23990:186;;:::o;24182:541::-;24282:2;24277:3;24274:11;24271:445;;;24316:37;24347:5;24316:37;:::i;:::-;24399:29;24417:10;24399:29;:::i;:::-;24389:8;24385:44;24582:2;24570:10;24567:18;24564:49;;;24603:8;24588:23;;24564:49;24626:80;24682:22;24700:3;24682:22;:::i;:::-;24672:8;24668:37;24655:11;24626:80;:::i;:::-;24286:430;;24271:445;24182:541;;;:::o;24729:117::-;24783:8;24833:5;24827:4;24823:16;24802:37;;24729:117;;;;:::o;24852:169::-;24896:6;24929:51;24977:1;24973:6;24965:5;24962:1;24958:13;24929:51;:::i;:::-;24925:56;25010:4;25004;25000:15;24990:25;;24903:118;24852:169;;;;:::o;25026:295::-;25102:4;25248:29;25273:3;25267:4;25248:29;:::i;:::-;25240:37;;25310:3;25307:1;25303:11;25297:4;25294:21;25286:29;;25026:295;;;;:::o;25326:1398::-;25448:43;25487:3;25482;25448:43;:::i;:::-;25556:18;25548:6;25545:30;25542:56;;;25578:18;;:::i;:::-;25542:56;25622:38;25654:4;25648:11;25622:38;:::i;:::-;25707:66;25766:6;25758;25752:4;25707:66;:::i;:::-;25800:1;25829:2;25821:6;25818:14;25846:1;25841:631;;;;26516:1;26533:6;26530:84;;;26589:9;26584:3;26580:19;26567:33;26558:42;;26530:84;26640:67;26700:6;26693:5;26640:67;:::i;:::-;26634:4;26627:81;26489:229;25811:907;;25841:631;25893:4;25889:9;25881:6;25877:22;25927:36;25958:4;25927:36;:::i;:::-;25985:1;25999:215;26013:7;26010:1;26007:14;25999:215;;;26099:9;26094:3;26090:19;26077:33;26069:6;26062:49;26150:1;26142:6;26138:14;26128:24;;26197:2;26186:9;26182:18;26169:31;;26036:4;26033:1;26029:12;26024:17;;25999:215;;;26242:6;26233:7;26230:19;26227:186;;;26307:9;26302:3;26298:19;26285:33;26350:48;26392:4;26384:6;26380:17;26369:9;26350:48;:::i;:::-;26342:6;26335:64;26250:163;26227:186;26459:1;26455;26447:6;26443:14;26439:22;26433:4;26426:36;25848:624;;;25811:907;;25423:1301;;;25326:1398;;;:::o;26730:174::-;26870:26;26866:1;26858:6;26854:14;26847:50;26730:174;:::o;26910:366::-;27052:3;27073:67;27137:2;27132:3;27073:67;:::i;:::-;27066:74;;27149:93;27238:3;27149:93;:::i;:::-;27267:2;27262:3;27258:12;27251:19;;26910:366;;;:::o;27282:419::-;27448:4;27486:2;27475:9;27471:18;27463:26;;27535:9;27529:4;27525:20;27521:1;27510:9;27506:17;27499:47;27563:131;27689:4;27563:131;:::i;:::-;27555:139;;27282:419;;;:::o;27707:228::-;27847:34;27843:1;27835:6;27831:14;27824:58;27916:11;27911:2;27903:6;27899:15;27892:36;27707:228;:::o;27941:366::-;28083:3;28104:67;28168:2;28163:3;28104:67;:::i;:::-;28097:74;;28180:93;28269:3;28180:93;:::i;:::-;28298:2;28293:3;28289:12;28282:19;;27941:366;;;:::o;28313:419::-;28479:4;28517:2;28506:9;28502:18;28494:26;;28566:9;28560:4;28556:20;28552:1;28541:9;28537:17;28530:47;28594:131;28720:4;28594:131;:::i;:::-;28586:139;;28313:419;;;:::o;28738:163::-;28878:15;28874:1;28866:6;28862:14;28855:39;28738:163;:::o;28907:366::-;29049:3;29070:67;29134:2;29129:3;29070:67;:::i;:::-;29063:74;;29146:93;29235:3;29146:93;:::i;:::-;29264:2;29259:3;29255:12;29248:19;;28907:366;;;:::o;29279:419::-;29445:4;29483:2;29472:9;29468:18;29460:26;;29532:9;29526:4;29522:20;29518:1;29507:9;29503:17;29496:47;29560:131;29686:4;29560:131;:::i;:::-;29552:139;;29279:419;;;:::o;29704:171::-;29844:23;29840:1;29832:6;29828:14;29821:47;29704:171;:::o;29881:366::-;30023:3;30044:67;30108:2;30103:3;30044:67;:::i;:::-;30037:74;;30120:93;30209:3;30120:93;:::i;:::-;30238:2;30233:3;30229:12;30222:19;;29881:366;;;:::o;30253:419::-;30419:4;30457:2;30446:9;30442:18;30434:26;;30506:9;30500:4;30496:20;30492:1;30481:9;30477:17;30470:47;30534:131;30660:4;30534:131;:::i;:::-;30526:139;;30253:419;;;:::o;30678:180::-;30726:77;30723:1;30716:88;30823:4;30820:1;30813:15;30847:4;30844:1;30837:15;30864:180;30912:77;30909:1;30902:88;31009:4;31006:1;30999:15;31033:4;31030:1;31023:15;31050:233;31089:3;31112:24;31130:5;31112:24;:::i;:::-;31103:33;;31158:66;31151:5;31148:77;31145:103;;31228:18;;:::i;:::-;31145:103;31275:1;31268:5;31264:13;31257:20;;31050:233;;;:::o;31289:148::-;31391:11;31428:3;31413:18;;31289:148;;;;:::o;31443:155::-;31583:3;31579:1;31571:6;31567:14;31560:27;31443:155;:::o;31608:416::-;31768:3;31793:84;31875:1;31870:3;31793:84;:::i;:::-;31786:91;;31890:93;31979:3;31890:93;:::i;:::-;32012:1;32007:3;32003:11;31996:18;;31608:416;;;:::o;32034:222::-;32178:66;32174:1;32166:6;32162:14;32155:90;32034:222;:::o;32266:418::-;32426:3;32451:85;32533:2;32528:3;32451:85;:::i;:::-;32444:92;;32549:93;32638:3;32549:93;:::i;:::-;32671:2;32666:3;32662:12;32655:19;;32266:418;;;:::o;32694:410::-;32800:3;32832:39;32865:5;32832:39;:::i;:::-;32891:89;32973:6;32968:3;32891:89;:::i;:::-;32884:96;;32993:65;33051:6;33046:3;33039:4;33032:5;33028:16;32993:65;:::i;:::-;33087:6;33082:3;33078:16;33071:23;;32804:300;32694:410;;;;:::o;33114:222::-;33258:66;33254:1;33246:6;33242:14;33235:90;33114:222;:::o;33346:416::-;33506:3;33531:84;33613:1;33608:3;33531:84;:::i;:::-;33524:91;;33628:93;33717:3;33628:93;:::i;:::-;33750:1;33745:3;33741:11;33734:18;;33346:416;;;:::o;33772:222::-;33916:66;33912:1;33904:6;33900:14;33893:90;33772:222;:::o;34004:418::-;34164:3;34189:85;34271:2;34266:3;34189:85;:::i;:::-;34182:92;;34287:93;34376:3;34287:93;:::i;:::-;34409:2;34404:3;34400:12;34393:19;;34004:418;;;:::o;34432:163::-;34576:7;34572:1;34564:6;34560:14;34553:31;34432:163;:::o;34605:416::-;34765:3;34790:84;34872:1;34867:3;34790:84;:::i;:::-;34783:91;;34887:93;34976:3;34887:93;:::i;:::-;35009:1;35004:3;35000:11;34993:18;;34605:416;;;:::o;35031:222::-;35175:66;35171:1;35163:6;35159:14;35152:90;35031:222;:::o;35263:416::-;35423:3;35448:84;35530:1;35525:3;35448:84;:::i;:::-;35441:91;;35545:93;35634:3;35545:93;:::i;:::-;35667:1;35662:3;35658:11;35651:18;;35263:416;;;:::o;35689:222::-;35833:66;35829:1;35821:6;35817:14;35810:90;35689:222;:::o;35921:418::-;36081:3;36106:85;36188:2;36183:3;36106:85;:::i;:::-;36099:92;;36204:93;36293:3;36204:93;:::i;:::-;36326:2;36321:3;36317:12;36310:19;;35921:418;;;:::o;36349:159::-;36493:3;36489:1;36481:6;36477:14;36470:27;36349:159;:::o;36518:416::-;36678:3;36703:84;36785:1;36780:3;36703:84;:::i;:::-;36696:91;;36800:93;36889:3;36800:93;:::i;:::-;36922:1;36917:3;36913:11;36906:18;;36518:416;;;:::o;36944:222::-;37088:66;37084:1;37076:6;37072:14;37065:90;36944:222;:::o;37176:418::-;37336:3;37361:85;37443:2;37438:3;37361:85;:::i;:::-;37354:92;;37459:93;37548:3;37459:93;:::i;:::-;37581:2;37576:3;37572:12;37565:19;;37176:418;;;:::o;37604:222::-;37748:66;37744:1;37736:6;37732:14;37725:90;37604:222;:::o;37836:418::-;37996:3;38021:85;38103:2;38098:3;38021:85;:::i;:::-;38014:92;;38119:93;38208:3;38119:93;:::i;:::-;38241:2;38236:3;38232:12;38225:19;;37836:418;;;:::o;38264:222::-;38408:66;38404:1;38396:6;38392:14;38385:90;38264:222;:::o;38496:416::-;38656:3;38681:84;38763:1;38758:3;38681:84;:::i;:::-;38674:91;;38778:93;38867:3;38778:93;:::i;:::-;38900:1;38895:3;38891:11;38884:18;;38496:416;;;:::o;38922:152::-;39062:4;39058:1;39050:6;39046:14;39039:28;38922:152;:::o;39080:400::-;39240:3;39261:84;39343:1;39338:3;39261:84;:::i;:::-;39254:91;;39354:93;39443:3;39354:93;:::i;:::-;39472:1;39467:3;39463:11;39456:18;;39080:400;;;:::o;39486:214::-;39626:66;39622:1;39614:6;39610:14;39603:90;39486:214;:::o;39706:402::-;39866:3;39887:85;39969:2;39964:3;39887:85;:::i;:::-;39880:92;;39981:93;40070:3;39981:93;:::i;:::-;40099:2;40094:3;40090:12;40083:19;;39706:402;;;:::o;40114:147::-;40215:11;40252:3;40237:18;;40114:147;;;;:::o;40267:386::-;40371:3;40399:38;40431:5;40399:38;:::i;:::-;40453:88;40534:6;40529:3;40453:88;:::i;:::-;40446:95;;40550:65;40608:6;40603:3;40596:4;40589:5;40585:16;40550:65;:::i;:::-;40640:6;40635:3;40631:16;40624:23;;40375:278;40267:386;;;;:::o;40659:143::-;40795:3;40791:1;40783:6;40779:14;40772:27;40659:143;:::o;40804:384::-;40964:3;40981:84;41063:1;41058:3;40981:84;:::i;:::-;40974:91;;41070:93;41159:3;41070:93;:::i;:::-;41184:1;41179:3;41175:11;41168:18;;40804:384;;;:::o;41190:143::-;41326:3;41322:1;41314:6;41310:14;41303:27;41190:143;:::o;41335:384::-;41495:3;41512:84;41594:1;41589:3;41512:84;:::i;:::-;41505:91;;41601:93;41690:3;41601:93;:::i;:::-;41715:1;41710:3;41706:11;41699:18;;41335:384;;;:::o;41721:6123::-;44063:3;44081:148;44225:3;44081:148;:::i;:::-;44074:155;;44242:148;44386:3;44242:148;:::i;:::-;44235:155;;44403:95;44494:3;44485:6;44403:95;:::i;:::-;44396:102;;44511:148;44655:3;44511:148;:::i;:::-;44504:155;;44672:148;44816:3;44672:148;:::i;:::-;44665:155;;44833:95;44924:3;44915:6;44833:95;:::i;:::-;44826:102;;44941:148;45085:3;44941:148;:::i;:::-;44934:155;;45102:95;45193:3;45184:6;45102:95;:::i;:::-;45095:102;;45210:148;45354:3;45210:148;:::i;:::-;45203:155;;45371:148;45515:3;45371:148;:::i;:::-;45364:155;;45532:148;45676:3;45532:148;:::i;:::-;45525:155;;45693:148;45837:3;45693:148;:::i;:::-;45686:155;;45854:148;45998:3;45854:148;:::i;:::-;45847:155;;46015:148;46159:3;46015:148;:::i;:::-;46008:155;;46176:95;46267:3;46258:6;46176:95;:::i;:::-;46169:102;;46284:148;46428:3;46284:148;:::i;:::-;46277:155;;46445:148;46589:3;46445:148;:::i;:::-;46438:155;;46606:148;46750:3;46606:148;:::i;:::-;46599:155;;46767:148;46911:3;46767:148;:::i;:::-;46760:155;;46928:148;47072:3;46928:148;:::i;:::-;46921:155;;47089:93;47178:3;47169:6;47089:93;:::i;:::-;47082:100;;47195:148;47339:3;47195:148;:::i;:::-;47188:155;;47356:148;47500:3;47356:148;:::i;:::-;47349:155;;47517:148;47661:3;47517:148;:::i;:::-;47510:155;;47678:148;47822:3;47678:148;:::i;:::-;47671:155;;47839:3;47832:10;;41721:6123;;;;;;;;:::o;47846:171::-;47982:31;47978:1;47970:6;47966:14;47959:55;47846:171;:::o;48019:386::-;48179:3;48196:85;48278:2;48273:3;48196:85;:::i;:::-;48189:92;;48286:93;48375:3;48286:93;:::i;:::-;48400:2;48395:3;48391:12;48384:19;;48019:386;;;:::o;48407:525::-;48640:3;48658:148;48802:3;48658:148;:::i;:::-;48651:155;;48819:95;48910:3;48901:6;48819:95;:::i;:::-;48812:102;;48927:3;48920:10;;48407:525;;;;:::o;48934:213::-;49070:34;49066:1;49058:6;49054:14;49047:58;49135:8;49130:2;49122:6;49118:15;49111:33;48934:213;:::o;49149:350::-;49291:3;49308:67;49372:2;49367:3;49308:67;:::i;:::-;49301:74;;49380:93;49469:3;49380:93;:::i;:::-;49494:2;49489:3;49485:12;49478:19;;49149:350;;;:::o;49501:403::-;49667:4;49701:2;49690:9;49686:18;49678:26;;49746:9;49740:4;49736:20;49732:1;49721:9;49717:17;49710:47;49770:131;49896:4;49770:131;:::i;:::-;49762:139;;49501:403;;;:::o;49906:212::-;50042:34;50038:1;50030:6;50026:14;50019:58;50107:7;50102:2;50094:6;50090:15;50083:32;49906:212;:::o;50120:350::-;50262:3;50279:67;50343:2;50338:3;50279:67;:::i;:::-;50272:74;;50351:93;50440:3;50351:93;:::i;:::-;50465:2;50460:3;50456:12;50449:19;;50120:350;;;:::o;50472:403::-;50638:4;50672:2;50661:9;50657:18;50649:26;;50717:9;50711:4;50707:20;50703:1;50692:9;50688:17;50681:47;50741:131;50867:4;50741:131;:::i;:::-;50733:139;;50472:403;;;:::o;50877:211::-;51013:34;51009:1;51001:6;50997:14;50990:58;51078:6;51073:2;51065:6;51061:15;51054:31;50877:211;:::o;51090:350::-;51232:3;51249:67;51313:2;51308:3;51249:67;:::i;:::-;51242:74;;51321:93;51410:3;51321:93;:::i;:::-;51435:2;51430:3;51426:12;51419:19;;51090:350;;;:::o;51442:403::-;51608:4;51642:2;51631:9;51627:18;51619:26;;51687:9;51681:4;51677:20;51673:1;51662:9;51658:17;51651:47;51711:131;51837:4;51711:131;:::i;:::-;51703:139;;51442:403;;;:::o;51847:174::-;51983:34;51979:1;51971:6;51967:14;51960:58;51847:174;:::o;52023:350::-;52165:3;52182:67;52246:2;52241:3;52182:67;:::i;:::-;52175:74;;52254:93;52343:3;52254:93;:::i;:::-;52368:2;52363:3;52359:12;52352:19;;52023:350;;;:::o;52375:403::-;52541:4;52575:2;52564:9;52560:18;52552:26;;52620:9;52614:4;52610:20;52606:1;52595:9;52591:17;52584:47;52644:131;52770:4;52644:131;:::i;:::-;52636:139;;52375:403;;;:::o;52780:167::-;52916:27;52912:1;52904:6;52900:14;52893:51;52780:167;:::o;52949:350::-;53091:3;53108:67;53172:2;53167:3;53108:67;:::i;:::-;53101:74;;53180:93;53269:3;53180:93;:::i;:::-;53294:2;53289:3;53285:12;53278:19;;52949:350;;;:::o;53301:403::-;53467:4;53501:2;53490:9;53486:18;53478:26;;53546:9;53540:4;53536:20;53532:1;53521:9;53517:17;53510:47;53570:131;53696:4;53570:131;:::i;:::-;53562:139;;53301:403;;;:::o;53706:225::-;53842:34;53838:1;53830:6;53826:14;53819:58;53907:20;53902:2;53894:6;53890:15;53883:45;53706:225;:::o;53933:350::-;54075:3;54092:67;54156:2;54151:3;54092:67;:::i;:::-;54085:74;;54164:93;54253:3;54164:93;:::i;:::-;54278:2;54273:3;54269:12;54262:19;;53933:350;;;:::o;54285:403::-;54451:4;54485:2;54474:9;54470:18;54462:26;;54530:9;54524:4;54520:20;54516:1;54505:9;54501:17;54494:47;54554:131;54680:4;54554:131;:::i;:::-;54546:139;;54285:403;;;:::o;54690:164::-;54734:77;54731:1;54724:88;54827:4;54824:1;54817:15;54847:4;54844:1;54837:15;54856:171;54896:3;54911:20;54929:1;54911:20;:::i;:::-;54906:25;;54941:20;54959:1;54941:20;:::i;:::-;54936:25;;54980:1;54977;54973:9;54966:16;;54997:3;54994:1;54991:10;54988:36;;;55004:18;;:::i;:::-;54988:36;54856:171;;;;:::o;55029:165::-;55069:1;55082:20;55100:1;55082:20;:::i;:::-;55077:25;;55112:20;55130:1;55112:20;:::i;:::-;55107:25;;55147:1;55137:35;;55152:18;;:::i;:::-;55137:35;55190:1;55187;55183:9;55178:14;;55029:165;;;;:::o;55196:362::-;55236:7;55255:20;55273:1;55255:20;:::i;:::-;55250:25;;55285:20;55303:1;55285:20;:::i;:::-;55280:25;;55336:1;55333;55329:9;55354:30;55372:11;55354:30;:::i;:::-;55343:41;;55513:1;55504:7;55500:15;55497:1;55494:22;55478:1;55471:9;55455:71;55436:119;;55535:18;;:::i;:::-;55436:119;55244:314;55196:362;;;;:::o;55560:174::-;55600:4;55616:20;55634:1;55616:20;:::i;:::-;55611:25;;55646:20;55664:1;55646:20;:::i;:::-;55641:25;;55686:1;55683;55679:9;55671:17;;55706:1;55700:4;55697:11;55694:37;;;55711:18;;:::i;:::-;55694:37;55560:174;;;;:::o;55736:612::-;55931:4;55965:3;55954:9;55950:19;55942:27;;55975:71;56043:1;56032:9;56028:17;56019:6;55975:71;:::i;:::-;56052:72;56120:2;56109:9;56105:18;56096:6;56052:72;:::i;:::-;56130;56198:2;56187:9;56183:18;56174:6;56130:72;:::i;:::-;56245:9;56239:4;56235:20;56230:2;56219:9;56215:18;56208:48;56269:76;56340:4;56331:6;56269:76;:::i;:::-;56261:84;;55736:612;;;;;;;:::o;56350:129::-;56406:5;56433:6;56427:13;56418:22;;56445:32;56471:5;56445:32;:::i;:::-;56350:129;;;;:::o;56481:325::-;56550:6;56595:2;56583:9;56574:7;56570:23;56566:32;56563:119;;;56601:79;;:::i;:::-;56563:119;56713:1;56734:63;56789:7;56780:6;56769:9;56765:22;56734:63;:::i;:::-;56724:73;;56688:115;56481:325;;;;:::o;56808:174::-;56944:34;56940:1;56932:6;56928:14;56921:58;56808:174;:::o;56984:350::-;57126:3;57143:67;57207:2;57202:3;57143:67;:::i;:::-;57136:74;;57215:93;57304:3;57215:93;:::i;:::-;57329:2;57324:3;57320:12;57313:19;;56984:350;;;:::o;57336:403::-;57502:4;57536:2;57525:9;57521:18;57513:26;;57581:9;57575:4;57571:20;57567:1;57556:9;57552:17;57545:47;57605:131;57731:4;57605:131;:::i;:::-;57597:139;;57336:403;;;:::o;57741:170::-;57877:30;57873:1;57865:6;57861:14;57854:54;57741:170;:::o;57913:350::-;58055:3;58072:67;58136:2;58131:3;58072:67;:::i;:::-;58065:74;;58144:93;58233:3;58144:93;:::i;:::-;58258:2;58253:3;58249:12;58242:19;;57913:350;;;:::o;58265:403::-;58431:4;58465:2;58454:9;58450:18;58442:26;;58510:9;58504:4;58500:20;58496:1;58485:9;58481:17;58474:47;58534:131;58660:4;58534:131;:::i;:::-;58526:139;;58265:403;;;:::o
Swarm Source
ipfs://b066469a994ebbb0ec42fee19b38d2154aa83a2dc2ed12186f1ced8bb0cd876b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$163.30
Net Worth in ETH
0.079951
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,041.24 | 0.08 | $163.3 |
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.