Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| ERC20Mint | 16349962 | 570 days ago | IN | 0 ETH | 0.00000036 | ||||
| ERC20Mint | 11281970 | 687 days ago | IN | 0 ETH | 0.00006715 | ||||
| ERC20Mint | 11136541 | 691 days ago | IN | 0 ETH | 0.00008134 | ||||
| ERC20Mint | 11136525 | 691 days ago | IN | 0 ETH | 0.0000789 | ||||
| ERC20Mint | 11049103 | 693 days ago | IN | 0 ETH | 0.00003867 | ||||
| ERC20Mint | 11049067 | 693 days ago | IN | 0 ETH | 0.00003961 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MyNFT
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at basescan.org on 2024-02-19
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.19;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.19;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.19;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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 towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (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 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 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.
uint256 twos = denominator & (0 - denominator);
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 (unsignedRoundsUp(rounding) && 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
* towards zero.
*
* 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* 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 256, 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.19;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @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), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @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) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
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);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.19;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.19;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.19;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.19;
/**
* @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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.19;
/**
* @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 address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.19;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.19;
/**
* @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}.
*/
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => 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 returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(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 {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* 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 {
_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);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @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 {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - 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) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. 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
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}
// File: DeepShotContracts/Deepshot_V2_RevisedContracts/CharacterMintScifi_02.sol
pragma solidity ^0.8.19;
contract MyNFT is ERC721, Ownable {
using SafeMath for uint256;
//PUBLIC VARS
//---------------------------------------------------------------------------------
uint256 public constant MAX_MINT = 500;
uint256 public nextTokenId = 1;
//---------------------------------------------------------------------------------
uint256 public erc20TokenFee = 25 ether;
uint256 public gasMintFee = 1 ether;
//---------------------------------------------------------------------------------
address public Erc20TokenAddress = 0x78a087d713Be963Bf307b18F2Ff8122EF9A63ae9; //BSWAP
address public DeepShotWallet = 0x8998F85603737687fAd85EEdF45f43E79ceb608b;
string private _tokenURI;
//---------------------------------------------------------------------------------
constructor(address _owner,string memory baseTokenURI) ERC721("DEEPSHOT COLLECTION", "Pistol Scifi Class 02") Ownable(_owner) {
_tokenURI = baseTokenURI;
}
function SetNewPayable(address TokenAddr) external onlyOwner{
Erc20TokenAddress = TokenAddr;
}
//////////////////////////////////////////
///// WITHDRAW TOKENS FROM CONTRACT //////
//////////////////////////////////////////
//WITHDRAW FROM CONTRACT:
function withdrawToken(address tokenAddress) external onlyOwner {
IERC20 token = IERC20(tokenAddress);
uint256 balance = token.balanceOf(address(this));
token.transfer(owner(), balance);
}
function withdrawErc20Tokens() external onlyOwner {
IERC20 erc20Token = IERC20(Erc20TokenAddress);
require(erc20Token.transfer(owner(), erc20Token.balanceOf(address(this))), "Failed to withdraw ERC-20 tokens");
}
function withdrawGas() external onlyOwner {
payable(owner()).transfer(address(this).balance);
}
///////////////////////////////////
/////// MINT METHODS ///////////
///////////////////////////////////
function ERC20Mint() external payable {
require(nextTokenId < MAX_MINT, "Maximum number of tokens minted"); // Adjusted the condition
IERC20 erc20Token = IERC20(Erc20TokenAddress);
require(erc20Token.allowance(msg.sender, address(this)) >= erc20TokenFee, "Insufficient allowance for ERC-20 tokens");
require(erc20Token.balanceOf(msg.sender) >= erc20TokenFee, "Insufficient balanceOf ERC-20 tokens");
require(erc20Token.transferFrom(msg.sender, DeepShotWallet, erc20TokenFee), "Failed to transfer ERC-20 tokens");
_safeMint(msg.sender, nextTokenId);
nextTokenId++;
}
function GASMint() external payable {
require(nextTokenId <= MAX_MINT, "Maximum number of tokens minted");
require(msg.value >= gasMintFee, "Insufficient ETH sent for minting");
// Transfer ETH to the contract owner
payable(DeepShotWallet).transfer(gasMintFee);
// Mint the NFT
_safeMint(msg.sender, nextTokenId);
nextTokenId++;
}
/////////////////////////////////////
/////// SET MINT PRICES //////////
/////////////////////////////////////
function setErc20TokenFee(uint256 _fee) external onlyOwner {
erc20TokenFee = _fee;
}
function setGasMintFee(uint256 _fee) external onlyOwner {
gasMintFee = _fee;
}
//URI METHODS
function setBaseURI(string memory _newBaseURI) external onlyOwner {
_tokenURI = _newBaseURI;
}
function _baseURI() internal view override returns (string memory) {
return _tokenURI;
}
///////////////////////////////////
///// RETURN FUNCTIONS //////
///////////////////////////////////
function getBalanceByAddr(address AddressToCheck)public view returns (uint256){
return balanceOf(AddressToCheck);
}
function getBalance()public view returns (uint256){
return balanceOf(msg.sender);
}
function totalMinted()external view returns (uint256){
return nextTokenId;
}
function ownsAnyNFTs(address addr) public view returns (bool) {
return balanceOf(addr) > 0;
}
function ownsAnyNFTsByAddr(address AddressToCheck) public view returns (bool) {
return balanceOf(AddressToCheck) > 0;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DeepShotWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC20Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Erc20TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GASMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"TokenAddr","type":"address"}],"name":"SetNewPayable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20TokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasMintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getBalanceByAddr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"addr","type":"address"}],"name":"ownsAnyNFTs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"ownsAnyNFTsByAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setErc20TokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setGasMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawErc20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052600160075568015af1d78b58c40000600855670de0b6b3a76400006009557378a087d713be963bf307b18f2ff8122ef9a63ae9600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738998f85603737687fad85eedf45f43e79ceb608b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d957600080fd5b5060405162003e6338038062003e638339818101604052810190620000ff9190620004f1565b816040518060400160405280601381526020017f4445455053484f5420434f4c4c454354494f4e000000000000000000000000008152506040518060400160405280601581526020017f506973746f6c20536369666920436c617373203032000000000000000000000081525081600090816200017d9190620007a2565b5080600190816200018f9190620007a2565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002075760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001fe91906200089a565b60405180910390fd5b62000218816200023360201b60201c565b5080600c90816200022a9190620007a2565b505050620008b7565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200033a826200030d565b9050919050565b6200034c816200032d565b81146200035857600080fd5b50565b6000815190506200036c8162000341565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003c7826200037c565b810181811067ffffffffffffffff82111715620003e957620003e86200038d565b5b80604052505050565b6000620003fe620002f9565b90506200040c8282620003bc565b919050565b600067ffffffffffffffff8211156200042f576200042e6200038d565b5b6200043a826200037c565b9050602081019050919050565b60005b83811015620004675780820151818401526020810190506200044a565b60008484015250505050565b60006200048a620004848462000411565b620003f2565b905082815260208101848484011115620004a957620004a862000377565b5b620004b684828562000447565b509392505050565b600082601f830112620004d657620004d562000372565b5b8151620004e884826020860162000473565b91505092915050565b600080604083850312156200050b576200050a62000303565b5b60006200051b858286016200035b565b925050602083015167ffffffffffffffff8111156200053f576200053e62000308565b5b6200054d85828601620004be565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005aa57607f821691505b602082108103620005c057620005bf62000562565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200062a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005eb565b620006368683620005eb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006836200067d62000677846200064e565b62000658565b6200064e565b9050919050565b6000819050919050565b6200069f8362000662565b620006b7620006ae826200068a565b848454620005f8565b825550505050565b600090565b620006ce620006bf565b620006db81848462000694565b505050565b5b818110156200070357620006f7600082620006c4565b600181019050620006e1565b5050565b601f82111562000752576200071c81620005c6565b6200072784620005db565b8101602085101562000737578190505b6200074f6200074685620005db565b830182620006e0565b50505b505050565b600082821c905092915050565b6000620007776000198460080262000757565b1980831691505092915050565b600062000792838362000764565b9150826002028217905092915050565b620007ad8262000557565b67ffffffffffffffff811115620007c957620007c86200038d565b5b620007d5825462000591565b620007e282828562000707565b600060209050601f8311600181146200081a576000841562000805578287015190505b62000811858262000784565b86555062000881565b601f1984166200082a86620005c6565b60005b8281101562000854578489015182556001820191506020850194506020810190506200082d565b8683101562000874578489015162000870601f89168262000764565b8355505b6001600288020188555050505b505050505050565b62000894816200032d565b82525050565b6000602082019050620008b1600083018462000889565b92915050565b61359c80620008c76000396000f3fe60806040526004361061020f5760003560e01c806381a1f95111610118578063b1bfb49f116100a0578063e985e9c51161006f578063e985e9c51461075b578063f0292a0314610798578063f2fde38b146107c3578063f38c6b27146107ec578063f3f88501146108035761020f565b8063b1bfb49f146106c0578063b88d4fde146106eb578063c87b56dd14610714578063d2ccc3c3146107515761020f565b806394875c6c116100e757806394875c6c146105ef5780639579d5181461061857806395d89b4114610641578063a22cb4651461066c578063a2309ff8146106955761020f565b806381a1f95114610533578063894760691461055e5780638da5cb5b14610587578063944419db146105b25761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461043a57806370a0823114610477578063715018a6146104b457806375794a3c146104cb5780637c359605146104f65761020f565b806342842e0e146103b557806354bcab32146103de578063550bf2131461040757806355f804b3146104115761020f565b806312065fe0116101e257806312065fe0146102e25780631261795d1461030d5780631743d36b1461032457806323b872dd146103615780632e18c6e31461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612629565b61082e565b6040516102489190612671565b60405180910390f35b34801561025d57600080fd5b50610266610910565b604051610273919061271c565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612774565b6109a2565b6040516102b091906127e2565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612829565b6109be565b005b3480156102ee57600080fd5b506102f76109d4565b6040516103049190612878565b60405180910390f35b34801561031957600080fd5b506103226109e4565b005b34801561033057600080fd5b5061034b60048036038101906103469190612893565b610a3c565b6040516103589190612671565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906128c0565b610a50565b005b34801561039657600080fd5b5061039f610b52565b6040516103ac9190612878565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906128c0565b610b58565b005b3480156103ea57600080fd5b5061040560048036038101906104009190612893565b610b78565b005b61040f610bc4565b005b34801561041d57600080fd5b5061043860048036038101906104339190612a48565b610eb9565b005b34801561044657600080fd5b50610461600480360381019061045c9190612774565b610ed4565b60405161046e91906127e2565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612893565b610ee6565b6040516104ab9190612878565b60405180910390f35b3480156104c057600080fd5b506104c9610fa0565b005b3480156104d757600080fd5b506104e0610fb4565b6040516104ed9190612878565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612893565b610fba565b60405161052a9190612671565b60405180910390f35b34801561053f57600080fd5b50610548610fce565b6040516105559190612878565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190612893565b610fd4565b005b34801561059357600080fd5b5061059c6110ea565b6040516105a991906127e2565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612893565b611114565b6040516105e69190612878565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612774565b611126565b005b34801561062457600080fd5b5061063f600480360381019061063a9190612774565b611138565b005b34801561064d57600080fd5b5061065661114a565b604051610663919061271c565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612abd565b6111dc565b005b3480156106a157600080fd5b506106aa6111f2565b6040516106b79190612878565b60405180910390f35b3480156106cc57600080fd5b506106d56111fc565b6040516106e291906127e2565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190612b9e565b611222565b005b34801561072057600080fd5b5061073b60048036038101906107369190612774565b61123f565b604051610748919061271c565b60405180910390f35b6107596112a8565b005b34801561076757600080fd5b50610782600480360381019061077d9190612c21565b6113c5565b60405161078f9190612671565b60405180910390f35b3480156107a457600080fd5b506107ad611459565b6040516107ba9190612878565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190612893565b61145f565b005b3480156107f857600080fd5b506108016114e5565b005b34801561080f57600080fd5b50610818611654565b60405161082591906127e2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090957506109088261167a565b5b9050919050565b60606000805461091f90612c90565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90612c90565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b5050505050905090565b60006109ad826116e4565b506109b78261176c565b9050919050565b6109d082826109cb6117a9565b6117b1565b5050565b60006109df33610ee6565b905090565b6109ec6117c3565b6109f46110ea565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a39573d6000803e3d6000fd5b50565b600080610a4883610ee6565b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ac25760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610ab991906127e2565b60405180910390fd5b6000610ad68383610ad16117a9565b61184a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b4c578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610b4393929190612cc1565b60405180910390fd5b50505050565b60085481565b610b7383838360405180602001604052806000815250611222565b505050565b610b806117c3565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101f460075410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190612d44565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506008548173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610c6f929190612d64565b602060405180830381865afa158015610c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb09190612da2565b1015610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890612e41565b60405180910390fd5b6008548173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d2d91906127e2565b602060405180830381865afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190612da2565b1015610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612ed3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166008546040518463ffffffff1660e01b8152600401610e1093929190612ef3565b6020604051808303816000875af1158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190612f3f565b610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990612fb8565b60405180910390fd5b610e9e33600754611a64565b60076000815480929190610eb190613007565b919050555050565b610ec16117c3565b80600c9081610ed091906131fb565b5050565b6000610edf826116e4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f595760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610f5091906127e2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fa86117c3565b610fb26000611a82565b565b60075481565b600080610fc683610ee6565b119050919050565b60095481565b610fdc6117c3565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101c91906127e2565b602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190612da2565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6110836110ea565b836040518363ffffffff1660e01b81526004016110a19291906132cd565b6020604051808303816000875af11580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190612f3f565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061111f82610ee6565b9050919050565b61112e6117c3565b8060088190555050565b6111406117c3565b8060098190555050565b60606001805461115990612c90565b80601f016020809104026020016040519081016040528092919081815260200182805461118590612c90565b80156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b5050505050905090565b6111ee6111e76117a9565b8383611b48565b5050565b6000600754905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61122d848484610a50565b61123984848484611cb7565b50505050565b606061124a826116e4565b506000611255611e6e565b9050600081511161127557604051806020016040528060008152506112a0565b8061127f84611f00565b604051602001611290929190613332565b6040516020818303038152906040525b915050919050565b6101f460075411156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690612d44565b60405180910390fd5b600954341015611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b906133c8565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6009549081150290604051600060405180830381858888f1935050505015801561139e573d6000803e3d6000fd5b506113ab33600754611a64565b600760008154809291906113be90613007565b9190505550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6101f481565b6114676117c3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114d091906127e2565b60405180910390fd5b6114e281611a82565b50565b6114ed6117c3565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115386110ea565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161157191906127e2565b602060405180830381865afa15801561158e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b29190612da2565b6040518363ffffffff1660e01b81526004016115cf9291906132cd565b6020604051808303816000875af11580156115ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116129190612f3f565b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613434565b60405180910390fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806116f083611fce565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176357826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161175a9190612878565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6117be838383600161200b565b505050565b6117cb6117a9565b73ffffffffffffffffffffffffffffffffffffffff166117e96110ea565b73ffffffffffffffffffffffffffffffffffffffff16146118485761180c6117a9565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161183f91906127e2565b60405180910390fd5b565b60008061185684611fce565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611898576118978184866121d0565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611929576118da60008560008061200b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146119ac576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b611a7e828260405180602001604052806000815250612294565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb957816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611bb091906127e2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611caa9190612671565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611e68578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cfb6117a9565b8685856040518563ffffffff1660e01b8152600401611d1d94939291906134a9565b6020604051808303816000875af1925050508015611d5957506040513d601f19601f82011682018060405250810190611d56919061350a565b60015b611ddd573d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b506000815103611dd557836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611dcc91906127e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611e6657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611e5d91906127e2565b60405180910390fd5b505b50505050565b6060600c8054611e7d90612c90565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea990612c90565b8015611ef65780601f10611ecb57610100808354040283529160200191611ef6565b820191906000526020600020905b815481529060010190602001808311611ed957829003601f168201915b5050505050905090565b606060006001611f0f846122b0565b01905060008167ffffffffffffffff811115611f2e57611f2d61291d565b5b6040519080825280601f01601f191660200182016040528015611f605781602001600182028036833780820191505090505b509050600082602001820190505b600115611fc3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fb757611fb6613537565b5b04945060008503611f6e575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120445750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612178576000612054846116e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120bf57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156120d257506120d081846113c5565b155b1561211457826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161210b91906127e2565b60405180910390fd5b811561217657838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6121db838383612403565b61228f57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361225057806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122479190612878565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122869291906132cd565b60405180910390fd5b505050565b61229e83836124c4565b6122ab6000848484611cb7565b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061230e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161230457612303613537565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061234b576d04ee2d6d415b85acef8100000000838161234157612340613537565b5b0492506020810190505b662386f26fc10000831061237a57662386f26fc1000083816123705761236f613537565b5b0492506010810190505b6305f5e10083106123a3576305f5e100838161239957612398613537565b5b0492506008810190505b61271083106123c85761271083816123be576123bd613537565b5b0492506004810190505b606483106123eb57606483816123e1576123e0613537565b5b0492506002810190505b600a83106123fa576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124bb57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061247c575061247b84846113c5565b5b806124ba57508273ffffffffffffffffffffffffffffffffffffffff166124a28361176c565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125365760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161252d91906127e2565b60405180910390fd5b60006125448383600061184a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125b85760006040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016125af91906127e2565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612606816125d1565b811461261157600080fd5b50565b600081359050612623816125fd565b92915050565b60006020828403121561263f5761263e6125c7565b5b600061264d84828501612614565b91505092915050565b60008115159050919050565b61266b81612656565b82525050565b60006020820190506126866000830184612662565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126c65780820151818401526020810190506126ab565b60008484015250505050565b6000601f19601f8301169050919050565b60006126ee8261268c565b6126f88185612697565b93506127088185602086016126a8565b612711816126d2565b840191505092915050565b6000602082019050818103600083015261273681846126e3565b905092915050565b6000819050919050565b6127518161273e565b811461275c57600080fd5b50565b60008135905061276e81612748565b92915050565b60006020828403121561278a576127896125c7565b5b60006127988482850161275f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127cc826127a1565b9050919050565b6127dc816127c1565b82525050565b60006020820190506127f760008301846127d3565b92915050565b612806816127c1565b811461281157600080fd5b50565b600081359050612823816127fd565b92915050565b600080604083850312156128405761283f6125c7565b5b600061284e85828601612814565b925050602061285f8582860161275f565b9150509250929050565b6128728161273e565b82525050565b600060208201905061288d6000830184612869565b92915050565b6000602082840312156128a9576128a86125c7565b5b60006128b784828501612814565b91505092915050565b6000806000606084860312156128d9576128d86125c7565b5b60006128e786828701612814565b93505060206128f886828701612814565b92505060406129098682870161275f565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612955826126d2565b810181811067ffffffffffffffff821117156129745761297361291d565b5b80604052505050565b60006129876125bd565b9050612993828261294c565b919050565b600067ffffffffffffffff8211156129b3576129b261291d565b5b6129bc826126d2565b9050602081019050919050565b82818337600083830152505050565b60006129eb6129e684612998565b61297d565b905082815260208101848484011115612a0757612a06612918565b5b612a128482856129c9565b509392505050565b600082601f830112612a2f57612a2e612913565b5b8135612a3f8482602086016129d8565b91505092915050565b600060208284031215612a5e57612a5d6125c7565b5b600082013567ffffffffffffffff811115612a7c57612a7b6125cc565b5b612a8884828501612a1a565b91505092915050565b612a9a81612656565b8114612aa557600080fd5b50565b600081359050612ab781612a91565b92915050565b60008060408385031215612ad457612ad36125c7565b5b6000612ae285828601612814565b9250506020612af385828601612aa8565b9150509250929050565b600067ffffffffffffffff821115612b1857612b1761291d565b5b612b21826126d2565b9050602081019050919050565b6000612b41612b3c84612afd565b61297d565b905082815260208101848484011115612b5d57612b5c612918565b5b612b688482856129c9565b509392505050565b600082601f830112612b8557612b84612913565b5b8135612b95848260208601612b2e565b91505092915050565b60008060008060808587031215612bb857612bb76125c7565b5b6000612bc687828801612814565b9450506020612bd787828801612814565b9350506040612be88782880161275f565b925050606085013567ffffffffffffffff811115612c0957612c086125cc565b5b612c1587828801612b70565b91505092959194509250565b60008060408385031215612c3857612c376125c7565b5b6000612c4685828601612814565b9250506020612c5785828601612814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ca857607f821691505b602082108103612cbb57612cba612c61565b5b50919050565b6000606082019050612cd660008301866127d3565b612ce36020830185612869565b612cf060408301846127d3565b949350505050565b7f4d6178696d756d206e756d626572206f6620746f6b656e73206d696e74656400600082015250565b6000612d2e601f83612697565b9150612d3982612cf8565b602082019050919050565b60006020820190508181036000830152612d5d81612d21565b9050919050565b6000604082019050612d7960008301856127d3565b612d8660208301846127d3565b9392505050565b600081519050612d9c81612748565b92915050565b600060208284031215612db857612db76125c7565b5b6000612dc684828501612d8d565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636520666f72204552432d3260008201527f3020746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000612e2b602883612697565b9150612e3682612dcf565b604082019050919050565b60006020820190508181036000830152612e5a81612e1e565b9050919050565b7f496e73756666696369656e742062616c616e63654f66204552432d323020746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b6000612ebd602483612697565b9150612ec882612e61565b604082019050919050565b60006020820190508181036000830152612eec81612eb0565b9050919050565b6000606082019050612f0860008301866127d3565b612f1560208301856127d3565b612f226040830184612869565b949350505050565b600081519050612f3981612a91565b92915050565b600060208284031215612f5557612f546125c7565b5b6000612f6384828501612f2a565b91505092915050565b7f4661696c656420746f207472616e73666572204552432d323020746f6b656e73600082015250565b6000612fa2602083612697565b9150612fad82612f6c565b602082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130128261273e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361304457613043612fd8565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613074565b6130bb8683613074565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130f86130f36130ee8461273e565b6130d3565b61273e565b9050919050565b6000819050919050565b613112836130dd565b61312661311e826130ff565b848454613081565b825550505050565b600090565b61313b61312e565b613146818484613109565b505050565b5b8181101561316a5761315f600082613133565b60018101905061314c565b5050565b601f8211156131af576131808161304f565b61318984613064565b81016020851015613198578190505b6131ac6131a485613064565b83018261314b565b50505b505050565b600082821c905092915050565b60006131d2600019846008026131b4565b1980831691505092915050565b60006131eb83836131c1565b9150826002028217905092915050565b6132048261268c565b67ffffffffffffffff81111561321d5761321c61291d565b5b6132278254612c90565b61323282828561316e565b600060209050601f8311600181146132655760008415613253578287015190505b61325d85826131df565b8655506132c5565b601f1984166132738661304f565b60005b8281101561329b57848901518255600182019150602085019450602081019050613276565b868310156132b857848901516132b4601f8916826131c1565b8355505b6001600288020188555050505b505050505050565b60006040820190506132e260008301856127d3565b6132ef6020830184612869565b9392505050565b600081905092915050565b600061330c8261268c565b61331681856132f6565b93506133268185602086016126a8565b80840191505092915050565b600061333e8285613301565b915061334a8284613301565b91508190509392505050565b7f496e73756666696369656e74204554482073656e7420666f72206d696e74696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b2602183612697565b91506133bd82613356565b604082019050919050565b600060208201905081810360008301526133e1816133a5565b9050919050565b7f4661696c656420746f207769746864726177204552432d323020746f6b656e73600082015250565b600061341e602083612697565b9150613429826133e8565b602082019050919050565b6000602082019050818103600083015261344d81613411565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061347b82613454565b613485818561345f565b93506134958185602086016126a8565b61349e816126d2565b840191505092915050565b60006080820190506134be60008301876127d3565b6134cb60208301866127d3565b6134d86040830185612869565b81810360608301526134ea8184613470565b905095945050505050565b600081519050613504816125fd565b92915050565b6000602082840312156135205761351f6125c7565b5b600061352e848285016134f5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea26469706673582212204305b88a1c41394e594de2c8471b4f7dd8822c970763668d0bd3ee17e0d8389c64736f6c63430008130033000000000000000000000000f02cf1e4f657da1185bf01aa84cdf9ade37810b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007268747470733a2f2f6261666b726569646b726371736e69746f68747832703233667a74767579336c6b726d7566656b706a787868656b616a6e377a6e373477716d79692e697066732e7733732e6c696e6b2f3f66696c656e616d653d5343492d46495f506973746f6c436861722e6a736f6e0000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806381a1f95111610118578063b1bfb49f116100a0578063e985e9c51161006f578063e985e9c51461075b578063f0292a0314610798578063f2fde38b146107c3578063f38c6b27146107ec578063f3f88501146108035761020f565b8063b1bfb49f146106c0578063b88d4fde146106eb578063c87b56dd14610714578063d2ccc3c3146107515761020f565b806394875c6c116100e757806394875c6c146105ef5780639579d5181461061857806395d89b4114610641578063a22cb4651461066c578063a2309ff8146106955761020f565b806381a1f95114610533578063894760691461055e5780638da5cb5b14610587578063944419db146105b25761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461043a57806370a0823114610477578063715018a6146104b457806375794a3c146104cb5780637c359605146104f65761020f565b806342842e0e146103b557806354bcab32146103de578063550bf2131461040757806355f804b3146104115761020f565b806312065fe0116101e257806312065fe0146102e25780631261795d1461030d5780631743d36b1461032457806323b872dd146103615780632e18c6e31461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612629565b61082e565b6040516102489190612671565b60405180910390f35b34801561025d57600080fd5b50610266610910565b604051610273919061271c565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612774565b6109a2565b6040516102b091906127e2565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190612829565b6109be565b005b3480156102ee57600080fd5b506102f76109d4565b6040516103049190612878565b60405180910390f35b34801561031957600080fd5b506103226109e4565b005b34801561033057600080fd5b5061034b60048036038101906103469190612893565b610a3c565b6040516103589190612671565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906128c0565b610a50565b005b34801561039657600080fd5b5061039f610b52565b6040516103ac9190612878565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906128c0565b610b58565b005b3480156103ea57600080fd5b5061040560048036038101906104009190612893565b610b78565b005b61040f610bc4565b005b34801561041d57600080fd5b5061043860048036038101906104339190612a48565b610eb9565b005b34801561044657600080fd5b50610461600480360381019061045c9190612774565b610ed4565b60405161046e91906127e2565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190612893565b610ee6565b6040516104ab9190612878565b60405180910390f35b3480156104c057600080fd5b506104c9610fa0565b005b3480156104d757600080fd5b506104e0610fb4565b6040516104ed9190612878565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612893565b610fba565b60405161052a9190612671565b60405180910390f35b34801561053f57600080fd5b50610548610fce565b6040516105559190612878565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190612893565b610fd4565b005b34801561059357600080fd5b5061059c6110ea565b6040516105a991906127e2565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612893565b611114565b6040516105e69190612878565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612774565b611126565b005b34801561062457600080fd5b5061063f600480360381019061063a9190612774565b611138565b005b34801561064d57600080fd5b5061065661114a565b604051610663919061271c565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612abd565b6111dc565b005b3480156106a157600080fd5b506106aa6111f2565b6040516106b79190612878565b60405180910390f35b3480156106cc57600080fd5b506106d56111fc565b6040516106e291906127e2565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d9190612b9e565b611222565b005b34801561072057600080fd5b5061073b60048036038101906107369190612774565b61123f565b604051610748919061271c565b60405180910390f35b6107596112a8565b005b34801561076757600080fd5b50610782600480360381019061077d9190612c21565b6113c5565b60405161078f9190612671565b60405180910390f35b3480156107a457600080fd5b506107ad611459565b6040516107ba9190612878565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190612893565b61145f565b005b3480156107f857600080fd5b506108016114e5565b005b34801561080f57600080fd5b50610818611654565b60405161082591906127e2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090957506109088261167a565b5b9050919050565b60606000805461091f90612c90565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90612c90565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b5050505050905090565b60006109ad826116e4565b506109b78261176c565b9050919050565b6109d082826109cb6117a9565b6117b1565b5050565b60006109df33610ee6565b905090565b6109ec6117c3565b6109f46110ea565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a39573d6000803e3d6000fd5b50565b600080610a4883610ee6565b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ac25760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610ab991906127e2565b60405180910390fd5b6000610ad68383610ad16117a9565b61184a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b4c578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610b4393929190612cc1565b60405180910390fd5b50505050565b60085481565b610b7383838360405180602001604052806000815250611222565b505050565b610b806117c3565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101f460075410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190612d44565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506008548173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610c6f929190612d64565b602060405180830381865afa158015610c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb09190612da2565b1015610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890612e41565b60405180910390fd5b6008548173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d2d91906127e2565b602060405180830381865afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190612da2565b1015610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da690612ed3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166008546040518463ffffffff1660e01b8152600401610e1093929190612ef3565b6020604051808303816000875af1158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190612f3f565b610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990612fb8565b60405180910390fd5b610e9e33600754611a64565b60076000815480929190610eb190613007565b919050555050565b610ec16117c3565b80600c9081610ed091906131fb565b5050565b6000610edf826116e4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f595760006040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610f5091906127e2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fa86117c3565b610fb26000611a82565b565b60075481565b600080610fc683610ee6565b119050919050565b60095481565b610fdc6117c3565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101c91906127e2565b602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190612da2565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6110836110ea565b836040518363ffffffff1660e01b81526004016110a19291906132cd565b6020604051808303816000875af11580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190612f3f565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061111f82610ee6565b9050919050565b61112e6117c3565b8060088190555050565b6111406117c3565b8060098190555050565b60606001805461115990612c90565b80601f016020809104026020016040519081016040528092919081815260200182805461118590612c90565b80156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b5050505050905090565b6111ee6111e76117a9565b8383611b48565b5050565b6000600754905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61122d848484610a50565b61123984848484611cb7565b50505050565b606061124a826116e4565b506000611255611e6e565b9050600081511161127557604051806020016040528060008152506112a0565b8061127f84611f00565b604051602001611290929190613332565b6040516020818303038152906040525b915050919050565b6101f460075411156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690612d44565b60405180910390fd5b600954341015611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b906133c8565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6009549081150290604051600060405180830381858888f1935050505015801561139e573d6000803e3d6000fd5b506113ab33600754611a64565b600760008154809291906113be90613007565b9190505550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6101f481565b6114676117c3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114d95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114d091906127e2565b60405180910390fd5b6114e281611a82565b50565b6114ed6117c3565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115386110ea565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161157191906127e2565b602060405180830381865afa15801561158e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b29190612da2565b6040518363ffffffff1660e01b81526004016115cf9291906132cd565b6020604051808303816000875af11580156115ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116129190612f3f565b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613434565b60405180910390fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000806116f083611fce565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176357826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161175a9190612878565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6117be838383600161200b565b505050565b6117cb6117a9565b73ffffffffffffffffffffffffffffffffffffffff166117e96110ea565b73ffffffffffffffffffffffffffffffffffffffff16146118485761180c6117a9565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161183f91906127e2565b60405180910390fd5b565b60008061185684611fce565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611898576118978184866121d0565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611929576118da60008560008061200b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146119ac576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b611a7e828260405180602001604052806000815250612294565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb957816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401611bb091906127e2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611caa9190612671565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611e68578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cfb6117a9565b8685856040518563ffffffff1660e01b8152600401611d1d94939291906134a9565b6020604051808303816000875af1925050508015611d5957506040513d601f19601f82011682018060405250810190611d56919061350a565b60015b611ddd573d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b506000815103611dd557836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611dcc91906127e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611e6657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611e5d91906127e2565b60405180910390fd5b505b50505050565b6060600c8054611e7d90612c90565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea990612c90565b8015611ef65780601f10611ecb57610100808354040283529160200191611ef6565b820191906000526020600020905b815481529060010190602001808311611ed957829003601f168201915b5050505050905090565b606060006001611f0f846122b0565b01905060008167ffffffffffffffff811115611f2e57611f2d61291d565b5b6040519080825280601f01601f191660200182016040528015611f605781602001600182028036833780820191505090505b509050600082602001820190505b600115611fc3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611fb757611fb6613537565b5b04945060008503611f6e575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806120445750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612178576000612054846116e4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120bf57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156120d257506120d081846113c5565b155b1561211457826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161210b91906127e2565b60405180910390fd5b811561217657838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6121db838383612403565b61228f57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361225057806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016122479190612878565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016122869291906132cd565b60405180910390fd5b505050565b61229e83836124c4565b6122ab6000848484611cb7565b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061230e577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161230457612303613537565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061234b576d04ee2d6d415b85acef8100000000838161234157612340613537565b5b0492506020810190505b662386f26fc10000831061237a57662386f26fc1000083816123705761236f613537565b5b0492506010810190505b6305f5e10083106123a3576305f5e100838161239957612398613537565b5b0492506008810190505b61271083106123c85761271083816123be576123bd613537565b5b0492506004810190505b606483106123eb57606483816123e1576123e0613537565b5b0492506002810190505b600a83106123fa576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124bb57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061247c575061247b84846113c5565b5b806124ba57508273ffffffffffffffffffffffffffffffffffffffff166124a28361176c565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125365760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161252d91906127e2565b60405180910390fd5b60006125448383600061184a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125b85760006040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016125af91906127e2565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612606816125d1565b811461261157600080fd5b50565b600081359050612623816125fd565b92915050565b60006020828403121561263f5761263e6125c7565b5b600061264d84828501612614565b91505092915050565b60008115159050919050565b61266b81612656565b82525050565b60006020820190506126866000830184612662565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126c65780820151818401526020810190506126ab565b60008484015250505050565b6000601f19601f8301169050919050565b60006126ee8261268c565b6126f88185612697565b93506127088185602086016126a8565b612711816126d2565b840191505092915050565b6000602082019050818103600083015261273681846126e3565b905092915050565b6000819050919050565b6127518161273e565b811461275c57600080fd5b50565b60008135905061276e81612748565b92915050565b60006020828403121561278a576127896125c7565b5b60006127988482850161275f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127cc826127a1565b9050919050565b6127dc816127c1565b82525050565b60006020820190506127f760008301846127d3565b92915050565b612806816127c1565b811461281157600080fd5b50565b600081359050612823816127fd565b92915050565b600080604083850312156128405761283f6125c7565b5b600061284e85828601612814565b925050602061285f8582860161275f565b9150509250929050565b6128728161273e565b82525050565b600060208201905061288d6000830184612869565b92915050565b6000602082840312156128a9576128a86125c7565b5b60006128b784828501612814565b91505092915050565b6000806000606084860312156128d9576128d86125c7565b5b60006128e786828701612814565b93505060206128f886828701612814565b92505060406129098682870161275f565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612955826126d2565b810181811067ffffffffffffffff821117156129745761297361291d565b5b80604052505050565b60006129876125bd565b9050612993828261294c565b919050565b600067ffffffffffffffff8211156129b3576129b261291d565b5b6129bc826126d2565b9050602081019050919050565b82818337600083830152505050565b60006129eb6129e684612998565b61297d565b905082815260208101848484011115612a0757612a06612918565b5b612a128482856129c9565b509392505050565b600082601f830112612a2f57612a2e612913565b5b8135612a3f8482602086016129d8565b91505092915050565b600060208284031215612a5e57612a5d6125c7565b5b600082013567ffffffffffffffff811115612a7c57612a7b6125cc565b5b612a8884828501612a1a565b91505092915050565b612a9a81612656565b8114612aa557600080fd5b50565b600081359050612ab781612a91565b92915050565b60008060408385031215612ad457612ad36125c7565b5b6000612ae285828601612814565b9250506020612af385828601612aa8565b9150509250929050565b600067ffffffffffffffff821115612b1857612b1761291d565b5b612b21826126d2565b9050602081019050919050565b6000612b41612b3c84612afd565b61297d565b905082815260208101848484011115612b5d57612b5c612918565b5b612b688482856129c9565b509392505050565b600082601f830112612b8557612b84612913565b5b8135612b95848260208601612b2e565b91505092915050565b60008060008060808587031215612bb857612bb76125c7565b5b6000612bc687828801612814565b9450506020612bd787828801612814565b9350506040612be88782880161275f565b925050606085013567ffffffffffffffff811115612c0957612c086125cc565b5b612c1587828801612b70565b91505092959194509250565b60008060408385031215612c3857612c376125c7565b5b6000612c4685828601612814565b9250506020612c5785828601612814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ca857607f821691505b602082108103612cbb57612cba612c61565b5b50919050565b6000606082019050612cd660008301866127d3565b612ce36020830185612869565b612cf060408301846127d3565b949350505050565b7f4d6178696d756d206e756d626572206f6620746f6b656e73206d696e74656400600082015250565b6000612d2e601f83612697565b9150612d3982612cf8565b602082019050919050565b60006020820190508181036000830152612d5d81612d21565b9050919050565b6000604082019050612d7960008301856127d3565b612d8660208301846127d3565b9392505050565b600081519050612d9c81612748565b92915050565b600060208284031215612db857612db76125c7565b5b6000612dc684828501612d8d565b91505092915050565b7f496e73756666696369656e7420616c6c6f77616e636520666f72204552432d3260008201527f3020746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000612e2b602883612697565b9150612e3682612dcf565b604082019050919050565b60006020820190508181036000830152612e5a81612e1e565b9050919050565b7f496e73756666696369656e742062616c616e63654f66204552432d323020746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b6000612ebd602483612697565b9150612ec882612e61565b604082019050919050565b60006020820190508181036000830152612eec81612eb0565b9050919050565b6000606082019050612f0860008301866127d3565b612f1560208301856127d3565b612f226040830184612869565b949350505050565b600081519050612f3981612a91565b92915050565b600060208284031215612f5557612f546125c7565b5b6000612f6384828501612f2a565b91505092915050565b7f4661696c656420746f207472616e73666572204552432d323020746f6b656e73600082015250565b6000612fa2602083612697565b9150612fad82612f6c565b602082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130128261273e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361304457613043612fd8565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613074565b6130bb8683613074565b95508019841693508086168417925050509392505050565b6000819050919050565b60006130f86130f36130ee8461273e565b6130d3565b61273e565b9050919050565b6000819050919050565b613112836130dd565b61312661311e826130ff565b848454613081565b825550505050565b600090565b61313b61312e565b613146818484613109565b505050565b5b8181101561316a5761315f600082613133565b60018101905061314c565b5050565b601f8211156131af576131808161304f565b61318984613064565b81016020851015613198578190505b6131ac6131a485613064565b83018261314b565b50505b505050565b600082821c905092915050565b60006131d2600019846008026131b4565b1980831691505092915050565b60006131eb83836131c1565b9150826002028217905092915050565b6132048261268c565b67ffffffffffffffff81111561321d5761321c61291d565b5b6132278254612c90565b61323282828561316e565b600060209050601f8311600181146132655760008415613253578287015190505b61325d85826131df565b8655506132c5565b601f1984166132738661304f565b60005b8281101561329b57848901518255600182019150602085019450602081019050613276565b868310156132b857848901516132b4601f8916826131c1565b8355505b6001600288020188555050505b505050505050565b60006040820190506132e260008301856127d3565b6132ef6020830184612869565b9392505050565b600081905092915050565b600061330c8261268c565b61331681856132f6565b93506133268185602086016126a8565b80840191505092915050565b600061333e8285613301565b915061334a8284613301565b91508190509392505050565b7f496e73756666696369656e74204554482073656e7420666f72206d696e74696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b60006133b2602183612697565b91506133bd82613356565b604082019050919050565b600060208201905081810360008301526133e1816133a5565b9050919050565b7f4661696c656420746f207769746864726177204552432d323020746f6b656e73600082015250565b600061341e602083612697565b9150613429826133e8565b602082019050919050565b6000602082019050818103600083015261344d81613411565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061347b82613454565b613485818561345f565b93506134958185602086016126a8565b61349e816126d2565b840191505092915050565b60006080820190506134be60008301876127d3565b6134cb60208301866127d3565b6134d86040830185612869565b81810360608301526134ea8184613470565b905095945050505050565b600081519050613504816125fd565b92915050565b6000602082840312156135205761351f6125c7565b5b600061352e848285016134f5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea26469706673582212204305b88a1c41394e594de2c8471b4f7dd8822c970763668d0bd3ee17e0d8389c64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f02cf1e4f657da1185bf01aa84cdf9ade37810b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007268747470733a2f2f6261666b726569646b726371736e69746f68747832703233667a74767579336c6b726d7566656b706a787868656b616a6e377a6e373477716d79692e697066732e7733732e6c696e6b2f3f66696c656e616d653d5343492d46495f506973746f6c436861722e6a736f6e0000000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0xf02CF1E4f657Da1185bf01Aa84cdf9AdE37810b0
Arg [1] : baseTokenURI (string): https://bafkreidkrcqsnitohtx2p23fztvuy3lkrmufekpjxxhekajn7zn74wqmyi.ipfs.w3s.link/?filename=SCI-FI_PistolChar.json
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000f02cf1e4f657da1185bf01aa84cdf9ade37810b0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000072
Arg [3] : 68747470733a2f2f6261666b726569646b726371736e69746f68747832703233
Arg [4] : 667a74767579336c6b726d7566656b706a787868656b616a6e377a6e37347771
Arg [5] : 6d79692e697066732e7733732e6c696e6b2f3f66696c656e616d653d5343492d
Arg [6] : 46495f506973746f6c436861722e6a736f6e0000000000000000000000000000
Deployed Bytecode Sourcemap
67916:4313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50820:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51651:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52823:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52642:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71785:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69674:108;;;;;;;;;;;;;:::i;:::-;;71986:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53492:588;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68272:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54151:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68921:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69918:624;;;:::i;:::-;;71298:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51464:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51189:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39948:103;;;;;;;;;;;;;:::i;:::-;;68146:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72097:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68319:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69209:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39273:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71651:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71072:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71176:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51811:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53053:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71892:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68451:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54356:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51977:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70550:384;;;:::i;:::-;;53270:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68101:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40206:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69435:231;;;;;;;;;;;;;:::i;:::-;;68543:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50820:305;50922:4;50974:25;50959:40;;;:11;:40;;;;:105;;;;51031:33;51016:48;;;:11;:48;;;;50959:105;:158;;;;51081:36;51105:11;51081:23;:36::i;:::-;50959:158;50939:178;;50820:305;;;:::o;51651:91::-;51696:13;51729:5;51722:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51651:91;:::o;52823:158::-;52890:7;52910:22;52924:7;52910:13;:22::i;:::-;;52952:21;52965:7;52952:12;:21::i;:::-;52945:28;;52823:158;;;:::o;52642:115::-;52714:35;52723:2;52727:7;52736:12;:10;:12::i;:::-;52714:8;:35::i;:::-;52642:115;;:::o;71785:95::-;71829:7;71851:21;71861:10;71851:9;:21::i;:::-;71844:28;;71785:95;:::o;69674:108::-;39159:13;:11;:13::i;:::-;69734:7:::1;:5;:7::i;:::-;69726:25;;:48;69752:21;69726:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69674:108::o:0;71986:103::-;72042:4;72080:1;72062:15;72072:4;72062:9;:15::i;:::-;:19;72055:26;;71986:103;;;:::o;53492:588::-;53601:1;53587:16;;:2;:16;;;53583:89;;53657:1;53627:33;;;;;;;;;;;:::i;:::-;;;;;;;;53583:89;53893:21;53917:34;53925:2;53929:7;53938:12;:10;:12::i;:::-;53917:7;:34::i;:::-;53893:58;;53983:4;53966:21;;:13;:21;;;53962:111;;54032:4;54038:7;54047:13;54011:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;53962:111;53572:508;53492:588;;;:::o;68272:39::-;;;;:::o;54151:134::-;54238:39;54255:4;54261:2;54265:7;54238:39;;;;;;;;;;;;:16;:39::i;:::-;54151:134;;;:::o;68921:104::-;39159:13;:11;:13::i;:::-;69008:9:::1;68988:17;;:29;;;;;;;;;;;;;;;;;;68921:104:::0;:::o;69918:624::-;68136:3;69973:11;;:22;69965:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70067:17;70094;;;;;;;;;;;70067:45;;70182:13;;70131:10;:20;;;70152:10;70172:4;70131:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;70123:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;70293:13;;70257:10;:20;;;70278:10;70257:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;70249:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;70364:10;:23;;;70388:10;70400:14;;;;;;;;;;;70416:13;;70364:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70356:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;70478:34;70488:10;70500:11;;70478:9;:34::i;:::-;70521:11;;:13;;;;;;;;;:::i;:::-;;;;;;69956:586;69918:624::o;71298:108::-;39159:13;:11;:13::i;:::-;71387:11:::1;71375:9;:23;;;;;;:::i;:::-;;71298:108:::0;:::o;51464:120::-;51527:7;51554:22;51568:7;51554:13;:22::i;:::-;51547:29;;51464:120;;;:::o;51189:213::-;51252:7;51293:1;51276:19;;:5;:19;;;51272:89;;51346:1;51319:30;;;;;;;;;;;:::i;:::-;;;;;;;;51272:89;51378:9;:16;51388:5;51378:16;;;;;;;;;;;;;;;;51371:23;;51189:213;;;:::o;39948:103::-;39159:13;:11;:13::i;:::-;40013:30:::1;40040:1;40013:18;:30::i;:::-;39948:103::o:0;68146:30::-;;;;:::o;72097:129::-;72169:4;72217:1;72189:25;72199:14;72189:9;:25::i;:::-;:29;72182:36;;72097:129;;;:::o;68319:35::-;;;;:::o;69209:218::-;39159:13;:11;:13::i;:::-;69284:12:::1;69306;69284:35;;69329:15;69347:5;:15;;;69371:4;69347:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69329:48;;69387:5;:14;;;69402:7;:5;:7::i;:::-;69411;69387:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69274:153;;69209:218:::0;:::o;39273:87::-;39319:7;39346:6;;;;;;;;;;;39339:13;;39273:87;:::o;71651:126::-;71722:7;71744:25;71754:14;71744:9;:25::i;:::-;71737:32;;71651:126;;;:::o;71072:98::-;39159:13;:11;:13::i;:::-;71158:4:::1;71142:13;:20;;;;71072:98:::0;:::o;71176:92::-;39159:13;:11;:13::i;:::-;71256:4:::1;71243:10;:17;;;;71176:92:::0;:::o;51811:95::-;51858:13;51891:7;51884:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51811:95;:::o;53053:146::-;53139:52;53158:12;:10;:12::i;:::-;53172:8;53182;53139:18;:52::i;:::-;53053:146;;:::o;71892:86::-;71937:7;71959:11;;71952:18;;71892:86;:::o;68451:77::-;;;;;;;;;;;;;:::o;54356:211::-;54470:31;54483:4;54489:2;54493:7;54470:12;:31::i;:::-;54512:47;54535:4;54541:2;54545:7;54554:4;54512:22;:47::i;:::-;54356:211;;;;:::o;51977:260::-;52041:13;52067:22;52081:7;52067:13;:22::i;:::-;;52102:21;52126:10;:8;:10::i;:::-;52102:34;;52178:1;52160:7;52154:21;:25;:75;;;;;;;;;;;;;;;;;52196:7;52205:18;:7;:16;:18::i;:::-;52182:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52154:75;52147:82;;;51977:260;;;:::o;70550:384::-;68136:3;70603:11;;:23;;70595:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;70692:10;;70679:9;:23;;70671:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70802:14;;;;;;;;;;;70794:32;;:44;70827:10;;70794:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70870:34;70880:10;70892:11;;70870:9;:34::i;:::-;70913:11;;:13;;;;;;;;;:::i;:::-;;;;;;70550:384::o;53270:155::-;53358:4;53382:18;:25;53401:5;53382:25;;;;;;;;;;;;;;;:35;53408:8;53382:35;;;;;;;;;;;;;;;;;;;;;;;;;53375:42;;53270:155;;;;:::o;68101:38::-;68136:3;68101:38;:::o;40206:220::-;39159:13;:11;:13::i;:::-;40311:1:::1;40291:22;;:8;:22;;::::0;40287:93:::1;;40365:1;40337:31;;;;;;;;;;;:::i;:::-;;;;;;;;40287:93;40390:28;40409:8;40390:18;:28::i;:::-;40206:220:::0;:::o;69435:231::-;39159:13;:11;:13::i;:::-;69494:17:::1;69521;;;;;;;;;;;69494:45;;69556:10;:19;;;69576:7;:5;:7::i;:::-;69585:10;:20;;;69614:4;69585:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69556:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69548:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69485:181;69435:231::o:0;68543:74::-;;;;;;;;;;;;;:::o;43561:148::-;43637:4;43676:25;43661:40;;;:11;:40;;;;43654:47;;43561:148;;;:::o;65798:247::-;65861:7;65881:13;65897:17;65906:7;65897:8;:17::i;:::-;65881:33;;65946:1;65929:19;;:5;:19;;;65925:90;;65995:7;65972:31;;;;;;;;;;;:::i;:::-;;;;;;;;65925:90;66032:5;66025:12;;;65798:247;;;:::o;55329:129::-;55399:7;55426:15;:24;55442:7;55426:24;;;;;;;;;;;;;;;;;;;;;55419:31;;55329:129;;;:::o;37282:98::-;37335:7;37362:10;37355:17;;37282:98;:::o;64030:122::-;64111:33;64120:2;64124:7;64133:4;64139;64111:8;:33::i;:::-;64030:122;;;:::o;39438:166::-;39509:12;:10;:12::i;:::-;39498:23;;:7;:5;:7::i;:::-;:23;;;39494:103;;39572:12;:10;:12::i;:::-;39545:40;;;;;;;;;;;:::i;:::-;;;;;;;;39494:103;39438:166::o;58291:824::-;58377:7;58397:12;58412:17;58421:7;58412:8;:17::i;:::-;58397:32;;58508:1;58492:18;;:4;:18;;;58488:88;;58527:37;58544:4;58550;58556:7;58527:16;:37::i;:::-;58488:88;58639:1;58623:18;;:4;:18;;;58619:263;;58741:48;58758:1;58762:7;58779:1;58783:5;58741:8;:48::i;:::-;58854:1;58835:9;:15;58845:4;58835:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58619:263;58912:1;58898:16;;:2;:16;;;58894:111;;58977:1;58960:9;:13;58970:2;58960:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;58894:111;59036:2;59017:7;:16;59025:7;59017:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59075:7;59071:2;59056:27;;59065:4;59056:27;;;;;;;;;;;;59103:4;59096:11;;;58291:824;;;;;:::o;60149:102::-;60217:26;60227:2;60231:7;60217:26;;;;;;;;;;;;:9;:26::i;:::-;60149:102;;:::o;40586:191::-;40660:16;40679:6;;;;;;;;;;;40660:25;;40705:8;40696:6;;:17;;;;;;;;;;;;;;;;;;40760:8;40729:40;;40750:8;40729:40;;;;;;;;;;;;40649:128;40586:191;:::o;65237:318::-;65365:1;65345:22;;:8;:22;;;65341:93;;65413:8;65391:31;;;;;;;;;;;:::i;:::-;;;;;;;;65341:93;65482:8;65444:18;:25;65463:5;65444:25;;;;;;;;;;;;;;;:35;65470:8;65444:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;65528:8;65506:41;;65521:5;65506:41;;;65538:8;65506:41;;;;;;:::i;:::-;;;;;;;;65237:318;;;:::o;66595:799::-;66729:1;66712:2;:14;;;:18;66708:679;;;66767:2;66751:36;;;66788:12;:10;:12::i;:::-;66802:4;66808:7;66817:4;66751:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66747:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67082:1;67065:6;:13;:18;67061:300;;67137:2;67115:25;;;;;;;;;;;:::i;:::-;;;;;;;;67061:300;67311:6;67305:13;67296:6;67292:2;67288:15;67281:38;66747:629;66880:41;;;66870:51;;;:6;:51;;;;66866:132;;66975:2;66953:25;;;;;;;;;;;:::i;:::-;;;;;;;;66866:132;66823:190;66708:679;66595:799;;;;:::o;71414:102::-;71466:13;71499:9;71492:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71414:102;:::o;34052:718::-;34108:13;34159:14;34196:1;34176:17;34187:5;34176:10;:17::i;:::-;:21;34159:38;;34212:20;34246:6;34235:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34212:41;;34268:11;34397:6;34393:2;34389:15;34381:6;34377:28;34370:35;;34434:290;34441:4;34434:290;;;34466:5;;;;;;;;34608:10;34603:2;34596:5;34592:14;34587:32;34582:3;34574:46;34666:2;34657:11;;;;;;:::i;:::-;;;;;34700:1;34691:5;:10;34434:290;34687:21;34434:290;34745:6;34738:13;;;;;34052:718;;;:::o;55091:117::-;55157:7;55184;:16;55192:7;55184:16;;;;;;;;;;;;;;;;;;;;;55177:23;;55091:117;;;:::o;64340:678::-;64502:9;:31;;;;64531:1;64515:18;;:4;:18;;;;64502:31;64498:471;;;64550:13;64566:22;64580:7;64566:13;:22::i;:::-;64550:38;;64735:1;64719:18;;:4;:18;;;;:35;;;;;64750:4;64741:13;;:5;:13;;;;64719:35;:69;;;;;64759:29;64776:5;64783:4;64759:16;:29::i;:::-;64758:30;64719:69;64715:144;;;64838:4;64816:27;;;;;;;;;;;:::i;:::-;;;;;;;;64715:144;64879:9;64875:83;;;64934:7;64930:2;64914:28;;64923:5;64914:28;;;;;;;;;;;;64875:83;64535:434;64498:471;65008:2;64981:15;:24;64997:7;64981:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;64340:678;;;;:::o;56498:376::-;56611:38;56625:5;56632:7;56641;56611:13;:38::i;:::-;56606:261;;56687:1;56670:19;;:5;:19;;;56666:190;;56740:7;56717:31;;;;;;;;;;;:::i;:::-;;;;;;;;56666:190;56823:7;56832;56796:44;;;;;;;;;;;;:::i;:::-;;;;;;;;56606:261;56498:376;;;:::o;60478:185::-;60573:18;60579:2;60583:7;60573:5;:18::i;:::-;60602:53;60633:1;60637:2;60641:7;60650:4;60602:22;:53::i;:::-;60478:185;;;:::o;30456:948::-;30509:7;30529:14;30546:1;30529:18;;30596:8;30587:5;:17;30583:106;;30634:8;30625:17;;;;;;:::i;:::-;;;;;30671:2;30661:12;;;;30583:106;30716:8;30707:5;:17;30703:106;;30754:8;30745:17;;;;;;:::i;:::-;;;;;30791:2;30781:12;;;;30703:106;30836:8;30827:5;:17;30823:106;;30874:8;30865:17;;;;;;:::i;:::-;;;;;30911:2;30901:12;;;;30823:106;30956:7;30947:5;:16;30943:103;;30993:7;30984:16;;;;;;:::i;:::-;;;;;31029:1;31019:11;;;;30943:103;31073:7;31064:5;:16;31060:103;;31110:7;31101:16;;;;;;:::i;:::-;;;;;31146:1;31136:11;;;;31060:103;31190:7;31181:5;:16;31177:103;;31227:7;31218:16;;;;;;:::i;:::-;;;;;31263:1;31253:11;;;;31177:103;31307:7;31298:5;:16;31294:68;;31345:1;31335:11;;;;31294:68;31390:6;31383:13;;;30456:948;;;:::o;55778:276::-;55881:4;55937:1;55918:21;;:7;:21;;;;:128;;;;;55966:7;55957:16;;:5;:16;;;:52;;;;55977:32;55994:5;56001:7;55977:16;:32::i;:::-;55957:52;:88;;;;56038:7;56013:32;;:21;56026:7;56013:12;:21::i;:::-;:32;;;55957:88;55918:128;55898:148;;55778:276;;;;;:::o;59451:335::-;59533:1;59519:16;;:2;:16;;;59515:89;;59589:1;59559:33;;;;;;;;;;;:::i;:::-;;;;;;;;59515:89;59614:21;59638:32;59646:2;59650:7;59667:1;59638:7;:32::i;:::-;59614:56;;59710:1;59685:27;;:13;:27;;;59681:98;;59764:1;59736:31;;;;;;;;;;;:::i;:::-;;;;;;;;59681:98;59504:282;59451:335;;:::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:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:442::-;12752:4;12790:2;12779:9;12775:18;12767:26;;12803:71;12871:1;12860:9;12856:17;12847:6;12803:71;:::i;:::-;12884:72;12952:2;12941:9;12937:18;12928:6;12884:72;:::i;:::-;12966;13034:2;13023:9;13019:18;13010:6;12966:72;:::i;:::-;12603:442;;;;;;:::o;13051:181::-;13191:33;13187:1;13179:6;13175:14;13168:57;13051:181;:::o;13238:366::-;13380:3;13401:67;13465:2;13460:3;13401:67;:::i;:::-;13394:74;;13477:93;13566:3;13477:93;:::i;:::-;13595:2;13590:3;13586:12;13579:19;;13238:366;;;:::o;13610:419::-;13776:4;13814:2;13803:9;13799:18;13791:26;;13863:9;13857:4;13853:20;13849:1;13838:9;13834:17;13827:47;13891:131;14017:4;13891:131;:::i;:::-;13883:139;;13610:419;;;:::o;14035:332::-;14156:4;14194:2;14183:9;14179:18;14171:26;;14207:71;14275:1;14264:9;14260:17;14251:6;14207:71;:::i;:::-;14288:72;14356:2;14345:9;14341:18;14332:6;14288:72;:::i;:::-;14035:332;;;;;:::o;14373:143::-;14430:5;14461:6;14455:13;14446:22;;14477:33;14504:5;14477:33;:::i;:::-;14373:143;;;;:::o;14522:351::-;14592:6;14641:2;14629:9;14620:7;14616:23;14612:32;14609:119;;;14647:79;;:::i;:::-;14609:119;14767:1;14792:64;14848:7;14839:6;14828:9;14824:22;14792:64;:::i;:::-;14782:74;;14738:128;14522:351;;;;:::o;14879:227::-;15019:34;15015:1;15007:6;15003:14;14996:58;15088:10;15083:2;15075:6;15071:15;15064:35;14879:227;:::o;15112:366::-;15254:3;15275:67;15339:2;15334:3;15275:67;:::i;:::-;15268:74;;15351:93;15440:3;15351:93;:::i;:::-;15469:2;15464:3;15460:12;15453:19;;15112:366;;;:::o;15484:419::-;15650:4;15688:2;15677:9;15673:18;15665:26;;15737:9;15731:4;15727:20;15723:1;15712:9;15708:17;15701:47;15765:131;15891:4;15765:131;:::i;:::-;15757:139;;15484:419;;;:::o;15909:223::-;16049:34;16045:1;16037:6;16033:14;16026:58;16118:6;16113:2;16105:6;16101:15;16094:31;15909:223;:::o;16138:366::-;16280:3;16301:67;16365:2;16360:3;16301:67;:::i;:::-;16294:74;;16377:93;16466:3;16377:93;:::i;:::-;16495:2;16490:3;16486:12;16479:19;;16138:366;;;:::o;16510:419::-;16676:4;16714:2;16703:9;16699:18;16691:26;;16763:9;16757:4;16753:20;16749:1;16738:9;16734:17;16727:47;16791:131;16917:4;16791:131;:::i;:::-;16783:139;;16510:419;;;:::o;16935:442::-;17084:4;17122:2;17111:9;17107:18;17099:26;;17135:71;17203:1;17192:9;17188:17;17179:6;17135:71;:::i;:::-;17216:72;17284:2;17273:9;17269:18;17260:6;17216:72;:::i;:::-;17298;17366:2;17355:9;17351:18;17342:6;17298:72;:::i;:::-;16935:442;;;;;;:::o;17383:137::-;17437:5;17468:6;17462:13;17453:22;;17484:30;17508:5;17484:30;:::i;:::-;17383:137;;;;:::o;17526:345::-;17593:6;17642:2;17630:9;17621:7;17617:23;17613:32;17610:119;;;17648:79;;:::i;:::-;17610:119;17768:1;17793:61;17846:7;17837:6;17826:9;17822:22;17793:61;:::i;:::-;17783:71;;17739:125;17526:345;;;;:::o;17877:182::-;18017:34;18013:1;18005:6;18001:14;17994:58;17877:182;:::o;18065:366::-;18207:3;18228:67;18292:2;18287:3;18228:67;:::i;:::-;18221:74;;18304:93;18393:3;18304:93;:::i;:::-;18422:2;18417:3;18413:12;18406:19;;18065:366;;;:::o;18437:419::-;18603:4;18641:2;18630:9;18626:18;18618:26;;18690:9;18684:4;18680:20;18676:1;18665:9;18661:17;18654:47;18718:131;18844:4;18718:131;:::i;:::-;18710:139;;18437:419;;;:::o;18862:180::-;18910:77;18907:1;18900:88;19007:4;19004:1;18997:15;19031:4;19028:1;19021:15;19048:233;19087:3;19110:24;19128:5;19110:24;:::i;:::-;19101:33;;19156:66;19149:5;19146:77;19143:103;;19226:18;;:::i;:::-;19143:103;19273:1;19266:5;19262:13;19255:20;;19048:233;;;:::o;19287:141::-;19336:4;19359:3;19351:11;;19382:3;19379:1;19372:14;19416:4;19413:1;19403:18;19395:26;;19287:141;;;:::o;19434:93::-;19471:6;19518:2;19513;19506:5;19502:14;19498:23;19488:33;;19434:93;;;:::o;19533:107::-;19577:8;19627:5;19621:4;19617:16;19596:37;;19533:107;;;;:::o;19646:393::-;19715:6;19765:1;19753:10;19749:18;19788:97;19818:66;19807:9;19788:97;:::i;:::-;19906:39;19936:8;19925:9;19906:39;:::i;:::-;19894:51;;19978:4;19974:9;19967:5;19963:21;19954:30;;20027:4;20017:8;20013:19;20006:5;20003:30;19993:40;;19722:317;;19646:393;;;;;:::o;20045:60::-;20073:3;20094:5;20087:12;;20045:60;;;:::o;20111:142::-;20161:9;20194:53;20212:34;20221:24;20239:5;20221:24;:::i;:::-;20212:34;:::i;:::-;20194:53;:::i;:::-;20181:66;;20111:142;;;:::o;20259:75::-;20302:3;20323:5;20316:12;;20259:75;;;:::o;20340:269::-;20450:39;20481:7;20450:39;:::i;:::-;20511:91;20560:41;20584:16;20560:41;:::i;:::-;20552:6;20545:4;20539:11;20511:91;:::i;:::-;20505:4;20498:105;20416:193;20340:269;;;:::o;20615:73::-;20660:3;20615:73;:::o;20694:189::-;20771:32;;:::i;:::-;20812:65;20870:6;20862;20856:4;20812:65;:::i;:::-;20747:136;20694:189;;:::o;20889:186::-;20949:120;20966:3;20959:5;20956:14;20949:120;;;21020:39;21057:1;21050:5;21020:39;:::i;:::-;20993:1;20986:5;20982:13;20973:22;;20949:120;;;20889:186;;:::o;21081:543::-;21182:2;21177:3;21174:11;21171:446;;;21216:38;21248:5;21216:38;:::i;:::-;21300:29;21318:10;21300:29;:::i;:::-;21290:8;21286:44;21483:2;21471:10;21468:18;21465:49;;;21504:8;21489:23;;21465:49;21527:80;21583:22;21601:3;21583:22;:::i;:::-;21573:8;21569:37;21556:11;21527:80;:::i;:::-;21186:431;;21171:446;21081:543;;;:::o;21630:117::-;21684:8;21734:5;21728:4;21724:16;21703:37;;21630:117;;;;:::o;21753:169::-;21797:6;21830:51;21878:1;21874:6;21866:5;21863:1;21859:13;21830:51;:::i;:::-;21826:56;21911:4;21905;21901:15;21891:25;;21804:118;21753:169;;;;:::o;21927:295::-;22003:4;22149:29;22174:3;22168:4;22149:29;:::i;:::-;22141:37;;22211:3;22208:1;22204:11;22198:4;22195:21;22187:29;;21927:295;;;;:::o;22227:1395::-;22344:37;22377:3;22344:37;:::i;:::-;22446:18;22438:6;22435:30;22432:56;;;22468:18;;:::i;:::-;22432:56;22512:38;22544:4;22538:11;22512:38;:::i;:::-;22597:67;22657:6;22649;22643:4;22597:67;:::i;:::-;22691:1;22715:4;22702:17;;22747:2;22739:6;22736:14;22764:1;22759:618;;;;23421:1;23438:6;23435:77;;;23487:9;23482:3;23478:19;23472:26;23463:35;;23435:77;23538:67;23598:6;23591:5;23538:67;:::i;:::-;23532:4;23525:81;23394:222;22729:887;;22759:618;22811:4;22807:9;22799:6;22795:22;22845:37;22877:4;22845:37;:::i;:::-;22904:1;22918:208;22932:7;22929:1;22926:14;22918:208;;;23011:9;23006:3;23002:19;22996:26;22988:6;22981:42;23062:1;23054:6;23050:14;23040:24;;23109:2;23098:9;23094:18;23081:31;;22955:4;22952:1;22948:12;22943:17;;22918:208;;;23154:6;23145:7;23142:19;23139:179;;;23212:9;23207:3;23203:19;23197:26;23255:48;23297:4;23289:6;23285:17;23274:9;23255:48;:::i;:::-;23247:6;23240:64;23162:156;23139:179;23364:1;23360;23352:6;23348:14;23344:22;23338:4;23331:36;22766:611;;;22729:887;;22319:1303;;;22227:1395;;:::o;23628:332::-;23749:4;23787:2;23776:9;23772:18;23764:26;;23800:71;23868:1;23857:9;23853:17;23844:6;23800:71;:::i;:::-;23881:72;23949:2;23938:9;23934:18;23925:6;23881:72;:::i;:::-;23628:332;;;;;:::o;23966:148::-;24068:11;24105:3;24090:18;;23966:148;;;;:::o;24120:390::-;24226:3;24254:39;24287:5;24254:39;:::i;:::-;24309:89;24391:6;24386:3;24309:89;:::i;:::-;24302:96;;24407:65;24465:6;24460:3;24453:4;24446:5;24442:16;24407:65;:::i;:::-;24497:6;24492:3;24488:16;24481:23;;24230:280;24120:390;;;;:::o;24516:435::-;24696:3;24718:95;24809:3;24800:6;24718:95;:::i;:::-;24711:102;;24830:95;24921:3;24912:6;24830:95;:::i;:::-;24823:102;;24942:3;24935:10;;24516:435;;;;;:::o;24957:220::-;25097:34;25093:1;25085:6;25081:14;25074:58;25166:3;25161:2;25153:6;25149:15;25142:28;24957:220;:::o;25183:366::-;25325:3;25346:67;25410:2;25405:3;25346:67;:::i;:::-;25339:74;;25422:93;25511:3;25422:93;:::i;:::-;25540:2;25535:3;25531:12;25524:19;;25183:366;;;:::o;25555:419::-;25721:4;25759:2;25748:9;25744:18;25736:26;;25808:9;25802:4;25798:20;25794:1;25783:9;25779:17;25772:47;25836:131;25962:4;25836:131;:::i;:::-;25828:139;;25555:419;;;:::o;25980:182::-;26120:34;26116:1;26108:6;26104:14;26097:58;25980:182;:::o;26168:366::-;26310:3;26331:67;26395:2;26390:3;26331:67;:::i;:::-;26324:74;;26407:93;26496:3;26407:93;:::i;:::-;26525:2;26520:3;26516:12;26509:19;;26168:366;;;:::o;26540:419::-;26706:4;26744:2;26733:9;26729:18;26721:26;;26793:9;26787:4;26783:20;26779:1;26768:9;26764:17;26757:47;26821:131;26947:4;26821:131;:::i;:::-;26813:139;;26540:419;;;:::o;26965:98::-;27016:6;27050:5;27044:12;27034:22;;26965:98;;;:::o;27069:168::-;27152:11;27186:6;27181:3;27174:19;27226:4;27221:3;27217:14;27202:29;;27069:168;;;;:::o;27243:373::-;27329:3;27357:38;27389:5;27357:38;:::i;:::-;27411:70;27474:6;27469:3;27411:70;:::i;:::-;27404:77;;27490:65;27548:6;27543:3;27536:4;27529:5;27525:16;27490:65;:::i;:::-;27580:29;27602:6;27580:29;:::i;:::-;27575:3;27571:39;27564:46;;27333:283;27243:373;;;;:::o;27622:640::-;27817:4;27855:3;27844:9;27840:19;27832:27;;27869:71;27937:1;27926:9;27922:17;27913:6;27869:71;:::i;:::-;27950:72;28018:2;28007:9;28003:18;27994:6;27950:72;:::i;:::-;28032;28100:2;28089:9;28085:18;28076:6;28032:72;:::i;:::-;28151:9;28145:4;28141:20;28136:2;28125:9;28121:18;28114:48;28179:76;28250:4;28241:6;28179:76;:::i;:::-;28171:84;;27622:640;;;;;;;:::o;28268:141::-;28324:5;28355:6;28349:13;28340:22;;28371:32;28397:5;28371:32;:::i;:::-;28268:141;;;;:::o;28415:349::-;28484:6;28533:2;28521:9;28512:7;28508:23;28504:32;28501:119;;;28539:79;;:::i;:::-;28501:119;28659:1;28684:63;28739:7;28730:6;28719:9;28715:22;28684:63;:::i;:::-;28674:73;;28630:127;28415:349;;;;:::o;28770:180::-;28818:77;28815:1;28808:88;28915:4;28912:1;28905:15;28939:4;28936:1;28929:15
Swarm Source
ipfs://4305b88a1c41394e594de2c8471b4f7dd8822c970763668d0bd3ee17e0d8389c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.