Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 33 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 17075979 | 1022 days ago | IN | 0 ETH | 0.00228561 | ||||
| Transfer From | 16756565 | 1067 days ago | IN | 0 ETH | 0.00099363 | ||||
| Mint | 16456710 | 1109 days ago | IN | 0.024 ETH | 0.00231052 | ||||
| Withdraw | 16456629 | 1109 days ago | IN | 0 ETH | 0.0006168 | ||||
| Mint | 16398851 | 1117 days ago | IN | 0.024 ETH | 0.0049033 | ||||
| Mint | 16386332 | 1119 days ago | IN | 0.012 ETH | 0.00307987 | ||||
| Safe Transfer Fr... | 16380022 | 1120 days ago | IN | 0 ETH | 0.00098533 | ||||
| Safe Transfer Fr... | 16380015 | 1120 days ago | IN | 0 ETH | 0.00187966 | ||||
| Safe Transfer Fr... | 16380012 | 1120 days ago | IN | 0 ETH | 0.0018821 | ||||
| Safe Transfer Fr... | 16380009 | 1120 days ago | IN | 0 ETH | 0.001998 | ||||
| Safe Transfer Fr... | 16379989 | 1120 days ago | IN | 0 ETH | 0.00224266 | ||||
| Mint | 16379965 | 1120 days ago | IN | 0.012 ETH | 0.00242823 | ||||
| Mint | 16372611 | 1121 days ago | IN | 0.024 ETH | 0.00268971 | ||||
| Mint | 16371543 | 1121 days ago | IN | 0.012 ETH | 0.00449925 | ||||
| Safe Transfer Fr... | 16365132 | 1122 days ago | IN | 0 ETH | 0.00093142 | ||||
| Mint | 16365124 | 1122 days ago | IN | 0.012 ETH | 0.00237086 | ||||
| Mint | 16365112 | 1122 days ago | IN | 0.012 ETH | 0.00244451 | ||||
| Mint | 16365004 | 1122 days ago | IN | 0.012 ETH | 0.00243371 | ||||
| Mint | 16364926 | 1122 days ago | IN | 0.012 ETH | 0.00240328 | ||||
| Mint | 16364889 | 1122 days ago | IN | 0.012 ETH | 0.00248409 | ||||
| Mint | 16362235 | 1122 days ago | IN | 0.012 ETH | 0.00177465 | ||||
| Mint | 16359807 | 1123 days ago | IN | 0.012 ETH | 0.00135122 | ||||
| Set Is Public Mi... | 16359401 | 1123 days ago | IN | 0 ETH | 0.00041478 | ||||
| Set Base Token U... | 16357140 | 1123 days ago | IN | 0 ETH | 0.00101122 | ||||
| Set Base Token U... | 16357049 | 1123 days ago | IN | 0 ETH | 0.00063602 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MovementByOzmandium
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-01-07
*/
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: erc721a/contracts/IERC721A.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables
* (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`,
* checking first that contract recipients are aware of the ERC721 protocol
* to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move
* this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom}
* whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @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 payable;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom}
* for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// File: erc721a/contracts/ERC721A.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @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, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & _BITMASK_BURNED == 0) {
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `curr` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @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) public payable virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom}
* for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @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 memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Hook that is called before a set of serially-ordered token IDs
* are about to be transferred. This includes minting.
* And also called before burning one token.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token IDs
* have been transferred. This includes minting.
* And also called after one token has been burned.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}
// File: contracts/movement.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract MovementByOzmandium is ERC721A, Ownable{
using Strings for uint256;
uint256 public mintPrice;
uint256 amountForTeam;
uint256 public maxSupply;
uint256 public maxPerWallet;
bool public isPublicMintEnabled;
bool public teamMinted = false;
string private baseTokenUri;
mapping(address => uint256) public walletMints;
constructor() ERC721A('Movement by Ozmandium', 'MBO') {
mintPrice = 0.012 ether;
maxSupply = 205;
maxPerWallet = 2;
}
modifier callerIsUser() {
require(tx.origin == msg.sender, "Cannot be called by contract");
_;
}
function setIsPublicMintEnabled(bool isPublicMintEnabled_) external onlyOwner {
isPublicMintEnabled = isPublicMintEnabled_;
}
function setBaseTokenUri(string calldata baseTokenUri_) external onlyOwner {
baseTokenUri = baseTokenUri_;
}
//return uri for certain token
function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
return string(abi.encodePacked(baseTokenUri, Strings.toString(tokenId_), ".json"));
}
function withdraw() external onlyOwner{
uint256 withdrawAmount = (address(this).balance);
payable(0xFbDbbCaA424A00521B23f9524c266E0278154866).transfer(withdrawAmount);
payable(msg.sender).transfer(address(this).balance);
}
function teamMint() external onlyOwner{
require(!teamMinted, "Team Already Minted!");
teamMinted = true;
_safeMint(msg.sender, 6);
}
function mint(uint256 quantity_) public payable callerIsUser{
require(isPublicMintEnabled, 'minting not enabled');
require(totalSupply() + quantity_ <= maxSupply, 'sold out');
require(walletMints[msg.sender] + quantity_ <= maxPerWallet, 'exceed max wallet');
require(msg.value == quantity_ * mintPrice, 'wrong mint value');
walletMints[msg.sender] += quantity_;
_safeMint(msg.sender, quantity_);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"baseTokenUri_","type":"string"}],"name":"setBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicMintEnabled_","type":"bool"}],"name":"setIsPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526000600d60016101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601581526020017f4d6f76656d656e74206279204f7a6d616e6469756d00000000000000000000008152506040518060400160405280600381526020017f4d424f00000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620001fa565b508060039080519060200190620000ca929190620001fa565b50620000db6200012760201b60201c565b600081905550505062000103620000f76200012c60201b60201c565b6200013460201b60201c565b662aa1efb94e000060098190555060cd600b819055506002600c819055506200030f565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020890620002aa565b90600052602060002090601f0160209004810192826200022c576000855562000278565b82601f106200024757805160ff191683800117855562000278565b8280016001018555821562000278579182015b82811115620002775782518255916020019190600101906200025a565b5b5090506200028791906200028b565b5090565b5b80821115620002a65760008160009055506001016200028c565b5090565b60006002820490506001821680620002c357607f821691505b60208210811415620002da57620002d9620002e0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612e00806200031f6000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063ba7a86b81161008a578063e8b5498d11610064578063e8b5498d14610591578063e985e9c5146105bc578063f0293fd3146105f9578063f2fde38b14610636576101b7565b8063ba7a86b814610512578063c87b56dd14610529578063d5abeb0114610566576101b7565b806395d89b41116100c657806395d89b4114610486578063a0712d68146104b1578063a22cb465146104cd578063b88d4fde146104f6576101b7565b8063715018a61461041b5780638da5cb5b1461043257806395652cfa1461045d576101b7565b806323b872dd11610159578063453c231011610133578063453c23101461034b5780636352211e146103765780636817c76c146103b357806370a08231146103de576101b7565b806323b872dd146102fc5780633ccfd60b1461031857806342842e0e1461032f576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806318160ddd146102a85780632373ac22146102d3576101b7565b80630116bc2d146101bc57806301ffc9a7146101e757806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101d161065f565b6040516101de91906126ae565b60405180910390f35b3480156101f357600080fd5b5061020e60048036038101906102099190612297565b610672565b60405161021b91906126ae565b60405180910390f35b34801561023057600080fd5b50610239610704565b60405161024691906126c9565b60405180910390f35b34801561025b57600080fd5b506102766004803603810190610271919061233e565b610796565b6040516102839190612647565b60405180910390f35b6102a660048036038101906102a1919061222a565b610815565b005b3480156102b457600080fd5b506102bd610959565b6040516102ca919061280b565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061226a565b610970565b005b61031660048036038101906103119190612114565b610995565b005b34801561032457600080fd5b5061032d610cba565b005b61034960048036038101906103449190612114565b610d6c565b005b34801561035757600080fd5b50610360610d8c565b60405161036d919061280b565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061233e565b610d92565b6040516103aa9190612647565b60405180910390f35b3480156103bf57600080fd5b506103c8610da4565b6040516103d5919061280b565b60405180910390f35b3480156103ea57600080fd5b50610405600480360381019061040091906120a7565b610daa565b604051610412919061280b565b60405180910390f35b34801561042757600080fd5b50610430610e63565b005b34801561043e57600080fd5b50610447610e77565b6040516104549190612647565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906122f1565b610ea1565b005b34801561049257600080fd5b5061049b610ebf565b6040516104a891906126c9565b60405180910390f35b6104cb60048036038101906104c6919061233e565b610f51565b005b3480156104d957600080fd5b506104f460048036038101906104ef91906121ea565b6111a6565b005b610510600480360381019061050b9190612167565b6112b1565b005b34801561051e57600080fd5b50610527611324565b005b34801561053557600080fd5b50610550600480360381019061054b919061233e565b6113a4565b60405161055d91906126c9565b60405180910390f35b34801561057257600080fd5b5061057b611420565b604051610588919061280b565b60405180910390f35b34801561059d57600080fd5b506105a6611426565b6040516105b391906126ae565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906120d4565b611439565b6040516105f091906126ae565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906120a7565b6114cd565b60405161062d919061280b565b60405180910390f35b34801561064257600080fd5b5061065d600480360381019061065891906120a7565b6114e5565b005b600d60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461071390612a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90612a3a565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b60006107a182611569565b6107d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082082610d92565b90508073ffffffffffffffffffffffffffffffffffffffff166108416115c8565b73ffffffffffffffffffffffffffffffffffffffff16146108a45761086d816108686115c8565b611439565b6108a3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109636115d0565b6001546000540303905090565b6109786115d5565b80600d60006101000a81548160ff02191690831515021790555050565b60006109a082611653565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a1384611721565b91509150610a298187610a246115c8565b611748565b610a7557610a3e86610a396115c8565b611439565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae9868686600161178c565b8015610af457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e888887611792565b7c0200000000000000000000000000000000000000000000000000000000176117ba565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060046000838152602001908152602001600020541415610c48576000548114610c47578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb286868660016117e5565b505050505050565b610cc26115d5565b600047905073fbdbbcaa424a00521b23f9524c266e027815486673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d21573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d68573d6000803e3d6000fd5b5050565b610d87838383604051806020016040528060008152506112b1565b505050565b600c5481565b6000610d9d82611653565b9050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e6b6115d5565b610e7560006117eb565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ea96115d5565b8181600e9190610eba929190611ed5565b505050565b606060038054610ece90612a3a565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa90612a3a565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb69061274b565b60405180910390fd5b600d60009054906101000a900460ff1661100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061270b565b60405180910390fd5b600b548161101a610959565b61102491906128d4565b1115611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061276b565b60405180910390fd5b600c5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110b391906128d4565b11156110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb9061278b565b60405180910390fd5b60095481611102919061292a565b3414611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a906126eb565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119291906128d4565b925050819055506111a333826118b1565b50565b80600760006111b36115c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112606115c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112a591906126ae565b60405180910390a35050565b6112bc848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461131e576112e7848484846118cf565b61131d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61132c6115d5565b600d60019054906101000a900460ff161561137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906127eb565b60405180910390fd5b6001600d60016101000a81548160ff0219169083151502179055506113a23360066118b1565b565b60606113af82611569565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906127cb565b60405180910390fd5b600e6113f983611a2f565b60405160200161140a929190612618565b6040516020818303038152906040529050919050565b600b5481565b600d60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915090505481565b6114ed6115d5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115549061272b565b60405180910390fd5b611566816117eb565b50565b6000816115746115d0565b11158015611583575060005482105b80156115c1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6115dd611b07565b73ffffffffffffffffffffffffffffffffffffffff166115fb610e77565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906127ab565b60405180910390fd5b565b600080829050806116626115d0565b116116ea576000548110156116e95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156116e7575b60008114156116dd5760046000836001900393508381526020019081526020016000205490506116b2565b809250505061171c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117a9868684611b0f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6118cb828260405180602001604052806000815250611b18565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118f56115c8565b8786866040518563ffffffff1660e01b81526004016119179493929190612662565b602060405180830381600087803b15801561193157600080fd5b505af192505050801561196257506040513d601f19601f8201168201806040525081019061195f91906122c4565b60015b6119dc573d8060008114611992576040519150601f19603f3d011682016040523d82523d6000602084013e611997565b606091505b506000815114156119d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001611a3e84611bb5565b01905060008167ffffffffffffffff811115611a5d57611a5c612b2a565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b509050600082602001820190505b600115611afc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ae657611ae5612acc565b5b0494506000851415611af757611afc565b611a9d565b819350505050919050565b600033905090565b60009392505050565b611b228383611d08565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb057600080549050600083820390505b611b6260008683806001019450866118cf565b611b98576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b4f578160005414611bad57600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c13577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c0957611c08612acc565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c50576d04ee2d6d415b85acef81000000008381611c4657611c45612acc565b5b0492506020810190505b662386f26fc100008310611c7f57662386f26fc100008381611c7557611c74612acc565b5b0492506010810190505b6305f5e1008310611ca8576305f5e1008381611c9e57611c9d612acc565b5b0492506008810190505b6127108310611ccd576127108381611cc357611cc2612acc565b5b0492506004810190505b60648310611cf05760648381611ce657611ce5612acc565b5b0492506002810190505b600a8310611cff576001810190505b80915050919050565b6000805490506000821415611d49576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d56600084838561178c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611dcd83611dbe6000866000611792565b611dc785611ec5565b176117ba565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e33565b506000821415611eaa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ec060008483856117e5565b505050565b60006001821460e11b9050919050565b828054611ee190612a3a565b90600052602060002090601f016020900481019282611f035760008555611f4a565b82601f10611f1c57803560ff1916838001178555611f4a565b82800160010185558215611f4a579182015b82811115611f49578235825591602001919060010190611f2e565b5b509050611f579190611f5b565b5090565b5b80821115611f74576000816000905550600101611f5c565b5090565b6000611f8b611f868461284b565b612826565b905082815260208101848484011115611fa757611fa6612b68565b5b611fb28482856129f8565b509392505050565b600081359050611fc981612d6e565b92915050565b600081359050611fde81612d85565b92915050565b600081359050611ff381612d9c565b92915050565b60008151905061200881612d9c565b92915050565b600082601f83011261202357612022612b5e565b5b8135612033848260208601611f78565b91505092915050565b60008083601f84011261205257612051612b5e565b5b8235905067ffffffffffffffff81111561206f5761206e612b59565b5b60208301915083600182028301111561208b5761208a612b63565b5b9250929050565b6000813590506120a181612db3565b92915050565b6000602082840312156120bd576120bc612b72565b5b60006120cb84828501611fba565b91505092915050565b600080604083850312156120eb576120ea612b72565b5b60006120f985828601611fba565b925050602061210a85828601611fba565b9150509250929050565b60008060006060848603121561212d5761212c612b72565b5b600061213b86828701611fba565b935050602061214c86828701611fba565b925050604061215d86828701612092565b9150509250925092565b6000806000806080858703121561218157612180612b72565b5b600061218f87828801611fba565b94505060206121a087828801611fba565b93505060406121b187828801612092565b925050606085013567ffffffffffffffff8111156121d2576121d1612b6d565b5b6121de8782880161200e565b91505092959194509250565b6000806040838503121561220157612200612b72565b5b600061220f85828601611fba565b925050602061222085828601611fcf565b9150509250929050565b6000806040838503121561224157612240612b72565b5b600061224f85828601611fba565b925050602061226085828601612092565b9150509250929050565b6000602082840312156122805761227f612b72565b5b600061228e84828501611fcf565b91505092915050565b6000602082840312156122ad576122ac612b72565b5b60006122bb84828501611fe4565b91505092915050565b6000602082840312156122da576122d9612b72565b5b60006122e884828501611ff9565b91505092915050565b6000806020838503121561230857612307612b72565b5b600083013567ffffffffffffffff81111561232657612325612b6d565b5b6123328582860161203c565b92509250509250929050565b60006020828403121561235457612353612b72565b5b600061236284828501612092565b91505092915050565b61237481612984565b82525050565b61238381612996565b82525050565b600061239482612891565b61239e81856128a7565b93506123ae818560208601612a07565b6123b781612b77565b840191505092915050565b60006123cd8261289c565b6123d781856128b8565b93506123e7818560208601612a07565b6123f081612b77565b840191505092915050565b60006124068261289c565b61241081856128c9565b9350612420818560208601612a07565b80840191505092915050565b6000815461243981612a3a565b61244381866128c9565b9450600182166000811461245e576001811461246f576124a2565b60ff198316865281860193506124a2565b6124788561287c565b60005b8381101561249a5781548189015260018201915060208101905061247b565b838801955050505b50505092915050565b60006124b86010836128b8565b91506124c382612b88565b602082019050919050565b60006124db6013836128b8565b91506124e682612bb1565b602082019050919050565b60006124fe6026836128b8565b915061250982612bda565b604082019050919050565b6000612521601c836128b8565b915061252c82612c29565b602082019050919050565b60006125446008836128b8565b915061254f82612c52565b602082019050919050565b60006125676005836128c9565b915061257282612c7b565b600582019050919050565b600061258a6011836128b8565b915061259582612ca4565b602082019050919050565b60006125ad6020836128b8565b91506125b882612ccd565b602082019050919050565b60006125d0602f836128b8565b91506125db82612cf6565b604082019050919050565b60006125f36014836128b8565b91506125fe82612d45565b602082019050919050565b612612816129ee565b82525050565b6000612624828561242c565b915061263082846123fb565b915061263b8261255a565b91508190509392505050565b600060208201905061265c600083018461236b565b92915050565b6000608082019050612677600083018761236b565b612684602083018661236b565b6126916040830185612609565b81810360608301526126a38184612389565b905095945050505050565b60006020820190506126c3600083018461237a565b92915050565b600060208201905081810360008301526126e381846123c2565b905092915050565b60006020820190508181036000830152612704816124ab565b9050919050565b60006020820190508181036000830152612724816124ce565b9050919050565b60006020820190508181036000830152612744816124f1565b9050919050565b6000602082019050818103600083015261276481612514565b9050919050565b6000602082019050818103600083015261278481612537565b9050919050565b600060208201905081810360008301526127a48161257d565b9050919050565b600060208201905081810360008301526127c4816125a0565b9050919050565b600060208201905081810360008301526127e4816125c3565b9050919050565b60006020820190508181036000830152612804816125e6565b9050919050565b60006020820190506128206000830184612609565b92915050565b6000612830612841565b905061283c8282612a6c565b919050565b6000604051905090565b600067ffffffffffffffff82111561286657612865612b2a565b5b61286f82612b77565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128df826129ee565b91506128ea836129ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561291f5761291e612a9d565b5b828201905092915050565b6000612935826129ee565b9150612940836129ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561297957612978612a9d565b5b828202905092915050565b600061298f826129ce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a25578082015181840152602081019050612a0a565b83811115612a34576000848401525b50505050565b60006002820490506001821680612a5257607f821691505b60208210811415612a6657612a65612afb565b5b50919050565b612a7582612b77565b810181811067ffffffffffffffff82111715612a9457612a93612b2a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f77726f6e67206d696e742076616c756500000000000000000000000000000000600082015250565b7f6d696e74696e67206e6f7420656e61626c656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742062652063616c6c656420627920636f6e747261637400000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f657863656564206d61782077616c6c6574000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5465616d20416c7265616479204d696e74656421000000000000000000000000600082015250565b612d7781612984565b8114612d8257600080fd5b50565b612d8e81612996565b8114612d9957600080fd5b50565b612da5816129a2565b8114612db057600080fd5b50565b612dbc816129ee565b8114612dc757600080fd5b5056fea26469706673582212204c7c5b7df9fb6e51d27dd4b0ba740c070a9cc490bb873a60183f4878511482b264736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063ba7a86b81161008a578063e8b5498d11610064578063e8b5498d14610591578063e985e9c5146105bc578063f0293fd3146105f9578063f2fde38b14610636576101b7565b8063ba7a86b814610512578063c87b56dd14610529578063d5abeb0114610566576101b7565b806395d89b41116100c657806395d89b4114610486578063a0712d68146104b1578063a22cb465146104cd578063b88d4fde146104f6576101b7565b8063715018a61461041b5780638da5cb5b1461043257806395652cfa1461045d576101b7565b806323b872dd11610159578063453c231011610133578063453c23101461034b5780636352211e146103765780636817c76c146103b357806370a08231146103de576101b7565b806323b872dd146102fc5780633ccfd60b1461031857806342842e0e1461032f576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806318160ddd146102a85780632373ac22146102d3576101b7565b80630116bc2d146101bc57806301ffc9a7146101e757806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101d161065f565b6040516101de91906126ae565b60405180910390f35b3480156101f357600080fd5b5061020e60048036038101906102099190612297565b610672565b60405161021b91906126ae565b60405180910390f35b34801561023057600080fd5b50610239610704565b60405161024691906126c9565b60405180910390f35b34801561025b57600080fd5b506102766004803603810190610271919061233e565b610796565b6040516102839190612647565b60405180910390f35b6102a660048036038101906102a1919061222a565b610815565b005b3480156102b457600080fd5b506102bd610959565b6040516102ca919061280b565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061226a565b610970565b005b61031660048036038101906103119190612114565b610995565b005b34801561032457600080fd5b5061032d610cba565b005b61034960048036038101906103449190612114565b610d6c565b005b34801561035757600080fd5b50610360610d8c565b60405161036d919061280b565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061233e565b610d92565b6040516103aa9190612647565b60405180910390f35b3480156103bf57600080fd5b506103c8610da4565b6040516103d5919061280b565b60405180910390f35b3480156103ea57600080fd5b50610405600480360381019061040091906120a7565b610daa565b604051610412919061280b565b60405180910390f35b34801561042757600080fd5b50610430610e63565b005b34801561043e57600080fd5b50610447610e77565b6040516104549190612647565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906122f1565b610ea1565b005b34801561049257600080fd5b5061049b610ebf565b6040516104a891906126c9565b60405180910390f35b6104cb60048036038101906104c6919061233e565b610f51565b005b3480156104d957600080fd5b506104f460048036038101906104ef91906121ea565b6111a6565b005b610510600480360381019061050b9190612167565b6112b1565b005b34801561051e57600080fd5b50610527611324565b005b34801561053557600080fd5b50610550600480360381019061054b919061233e565b6113a4565b60405161055d91906126c9565b60405180910390f35b34801561057257600080fd5b5061057b611420565b604051610588919061280b565b60405180910390f35b34801561059d57600080fd5b506105a6611426565b6040516105b391906126ae565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906120d4565b611439565b6040516105f091906126ae565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b91906120a7565b6114cd565b60405161062d919061280b565b60405180910390f35b34801561064257600080fd5b5061065d600480360381019061065891906120a7565b6114e5565b005b600d60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461071390612a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90612a3a565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905090565b60006107a182611569565b6107d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082082610d92565b90508073ffffffffffffffffffffffffffffffffffffffff166108416115c8565b73ffffffffffffffffffffffffffffffffffffffff16146108a45761086d816108686115c8565b611439565b6108a3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109636115d0565b6001546000540303905090565b6109786115d5565b80600d60006101000a81548160ff02191690831515021790555050565b60006109a082611653565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a07576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a1384611721565b91509150610a298187610a246115c8565b611748565b610a7557610a3e86610a396115c8565b611439565b610a74576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610adc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae9868686600161178c565b8015610af457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bc285610b9e888887611792565b7c0200000000000000000000000000000000000000000000000000000000176117ba565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c4a576000600185019050600060046000838152602001908152602001600020541415610c48576000548114610c47578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb286868660016117e5565b505050505050565b610cc26115d5565b600047905073fbdbbcaa424a00521b23f9524c266e027815486673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d21573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d68573d6000803e3d6000fd5b5050565b610d87838383604051806020016040528060008152506112b1565b505050565b600c5481565b6000610d9d82611653565b9050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e6b6115d5565b610e7560006117eb565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ea96115d5565b8181600e9190610eba929190611ed5565b505050565b606060038054610ece90612a3a565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa90612a3a565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb69061274b565b60405180910390fd5b600d60009054906101000a900460ff1661100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061270b565b60405180910390fd5b600b548161101a610959565b61102491906128d4565b1115611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c9061276b565b60405180910390fd5b600c5481600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110b391906128d4565b11156110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb9061278b565b60405180910390fd5b60095481611102919061292a565b3414611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a906126eb565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119291906128d4565b925050819055506111a333826118b1565b50565b80600760006111b36115c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112606115c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112a591906126ae565b60405180910390a35050565b6112bc848484610995565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461131e576112e7848484846118cf565b61131d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61132c6115d5565b600d60019054906101000a900460ff161561137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906127eb565b60405180910390fd5b6001600d60016101000a81548160ff0219169083151502179055506113a23360066118b1565b565b60606113af82611569565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e5906127cb565b60405180910390fd5b600e6113f983611a2f565b60405160200161140a929190612618565b6040516020818303038152906040529050919050565b600b5481565b600d60019054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915090505481565b6114ed6115d5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115549061272b565b60405180910390fd5b611566816117eb565b50565b6000816115746115d0565b11158015611583575060005482105b80156115c1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6115dd611b07565b73ffffffffffffffffffffffffffffffffffffffff166115fb610e77565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906127ab565b60405180910390fd5b565b600080829050806116626115d0565b116116ea576000548110156116e95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156116e7575b60008114156116dd5760046000836001900393508381526020019081526020016000205490506116b2565b809250505061171c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117a9868684611b0f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6118cb828260405180602001604052806000815250611b18565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118f56115c8565b8786866040518563ffffffff1660e01b81526004016119179493929190612662565b602060405180830381600087803b15801561193157600080fd5b505af192505050801561196257506040513d601f19601f8201168201806040525081019061195f91906122c4565b60015b6119dc573d8060008114611992576040519150601f19603f3d011682016040523d82523d6000602084013e611997565b606091505b506000815114156119d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001611a3e84611bb5565b01905060008167ffffffffffffffff811115611a5d57611a5c612b2a565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b509050600082602001820190505b600115611afc578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611ae657611ae5612acc565b5b0494506000851415611af757611afc565b611a9d565b819350505050919050565b600033905090565b60009392505050565b611b228383611d08565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb057600080549050600083820390505b611b6260008683806001019450866118cf565b611b98576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b4f578160005414611bad57600080fd5b50505b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611c13577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611c0957611c08612acc565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c50576d04ee2d6d415b85acef81000000008381611c4657611c45612acc565b5b0492506020810190505b662386f26fc100008310611c7f57662386f26fc100008381611c7557611c74612acc565b5b0492506010810190505b6305f5e1008310611ca8576305f5e1008381611c9e57611c9d612acc565b5b0492506008810190505b6127108310611ccd576127108381611cc357611cc2612acc565b5b0492506004810190505b60648310611cf05760648381611ce657611ce5612acc565b5b0492506002810190505b600a8310611cff576001810190505b80915050919050565b6000805490506000821415611d49576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d56600084838561178c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611dcd83611dbe6000866000611792565b611dc785611ec5565b176117ba565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e33565b506000821415611eaa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ec060008483856117e5565b505050565b60006001821460e11b9050919050565b828054611ee190612a3a565b90600052602060002090601f016020900481019282611f035760008555611f4a565b82601f10611f1c57803560ff1916838001178555611f4a565b82800160010185558215611f4a579182015b82811115611f49578235825591602001919060010190611f2e565b5b509050611f579190611f5b565b5090565b5b80821115611f74576000816000905550600101611f5c565b5090565b6000611f8b611f868461284b565b612826565b905082815260208101848484011115611fa757611fa6612b68565b5b611fb28482856129f8565b509392505050565b600081359050611fc981612d6e565b92915050565b600081359050611fde81612d85565b92915050565b600081359050611ff381612d9c565b92915050565b60008151905061200881612d9c565b92915050565b600082601f83011261202357612022612b5e565b5b8135612033848260208601611f78565b91505092915050565b60008083601f84011261205257612051612b5e565b5b8235905067ffffffffffffffff81111561206f5761206e612b59565b5b60208301915083600182028301111561208b5761208a612b63565b5b9250929050565b6000813590506120a181612db3565b92915050565b6000602082840312156120bd576120bc612b72565b5b60006120cb84828501611fba565b91505092915050565b600080604083850312156120eb576120ea612b72565b5b60006120f985828601611fba565b925050602061210a85828601611fba565b9150509250929050565b60008060006060848603121561212d5761212c612b72565b5b600061213b86828701611fba565b935050602061214c86828701611fba565b925050604061215d86828701612092565b9150509250925092565b6000806000806080858703121561218157612180612b72565b5b600061218f87828801611fba565b94505060206121a087828801611fba565b93505060406121b187828801612092565b925050606085013567ffffffffffffffff8111156121d2576121d1612b6d565b5b6121de8782880161200e565b91505092959194509250565b6000806040838503121561220157612200612b72565b5b600061220f85828601611fba565b925050602061222085828601611fcf565b9150509250929050565b6000806040838503121561224157612240612b72565b5b600061224f85828601611fba565b925050602061226085828601612092565b9150509250929050565b6000602082840312156122805761227f612b72565b5b600061228e84828501611fcf565b91505092915050565b6000602082840312156122ad576122ac612b72565b5b60006122bb84828501611fe4565b91505092915050565b6000602082840312156122da576122d9612b72565b5b60006122e884828501611ff9565b91505092915050565b6000806020838503121561230857612307612b72565b5b600083013567ffffffffffffffff81111561232657612325612b6d565b5b6123328582860161203c565b92509250509250929050565b60006020828403121561235457612353612b72565b5b600061236284828501612092565b91505092915050565b61237481612984565b82525050565b61238381612996565b82525050565b600061239482612891565b61239e81856128a7565b93506123ae818560208601612a07565b6123b781612b77565b840191505092915050565b60006123cd8261289c565b6123d781856128b8565b93506123e7818560208601612a07565b6123f081612b77565b840191505092915050565b60006124068261289c565b61241081856128c9565b9350612420818560208601612a07565b80840191505092915050565b6000815461243981612a3a565b61244381866128c9565b9450600182166000811461245e576001811461246f576124a2565b60ff198316865281860193506124a2565b6124788561287c565b60005b8381101561249a5781548189015260018201915060208101905061247b565b838801955050505b50505092915050565b60006124b86010836128b8565b91506124c382612b88565b602082019050919050565b60006124db6013836128b8565b91506124e682612bb1565b602082019050919050565b60006124fe6026836128b8565b915061250982612bda565b604082019050919050565b6000612521601c836128b8565b915061252c82612c29565b602082019050919050565b60006125446008836128b8565b915061254f82612c52565b602082019050919050565b60006125676005836128c9565b915061257282612c7b565b600582019050919050565b600061258a6011836128b8565b915061259582612ca4565b602082019050919050565b60006125ad6020836128b8565b91506125b882612ccd565b602082019050919050565b60006125d0602f836128b8565b91506125db82612cf6565b604082019050919050565b60006125f36014836128b8565b91506125fe82612d45565b602082019050919050565b612612816129ee565b82525050565b6000612624828561242c565b915061263082846123fb565b915061263b8261255a565b91508190509392505050565b600060208201905061265c600083018461236b565b92915050565b6000608082019050612677600083018761236b565b612684602083018661236b565b6126916040830185612609565b81810360608301526126a38184612389565b905095945050505050565b60006020820190506126c3600083018461237a565b92915050565b600060208201905081810360008301526126e381846123c2565b905092915050565b60006020820190508181036000830152612704816124ab565b9050919050565b60006020820190508181036000830152612724816124ce565b9050919050565b60006020820190508181036000830152612744816124f1565b9050919050565b6000602082019050818103600083015261276481612514565b9050919050565b6000602082019050818103600083015261278481612537565b9050919050565b600060208201905081810360008301526127a48161257d565b9050919050565b600060208201905081810360008301526127c4816125a0565b9050919050565b600060208201905081810360008301526127e4816125c3565b9050919050565b60006020820190508181036000830152612804816125e6565b9050919050565b60006020820190506128206000830184612609565b92915050565b6000612830612841565b905061283c8282612a6c565b919050565b6000604051905090565b600067ffffffffffffffff82111561286657612865612b2a565b5b61286f82612b77565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128df826129ee565b91506128ea836129ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561291f5761291e612a9d565b5b828201905092915050565b6000612935826129ee565b9150612940836129ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561297957612978612a9d565b5b828202905092915050565b600061298f826129ce565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a25578082015181840152602081019050612a0a565b83811115612a34576000848401525b50505050565b60006002820490506001821680612a5257607f821691505b60208210811415612a6657612a65612afb565b5b50919050565b612a7582612b77565b810181811067ffffffffffffffff82111715612a9457612a93612b2a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f77726f6e67206d696e742076616c756500000000000000000000000000000000600082015250565b7f6d696e74696e67206e6f7420656e61626c656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742062652063616c6c656420627920636f6e747261637400000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f657863656564206d61782077616c6c6574000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5465616d20416c7265616479204d696e74656421000000000000000000000000600082015250565b612d7781612984565b8114612d8257600080fd5b50565b612d8e81612996565b8114612d9957600080fd5b50565b612da5816129a2565b8114612db057600080fd5b50565b612dbc816129ee565b8114612dc757600080fd5b5056fea26469706673582212204c7c5b7df9fb6e51d27dd4b0ba740c070a9cc490bb873a60183f4878511482b264736f6c63430008070033
Deployed Bytecode Sourcemap
70329:2170:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70542:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37196:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38098:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44589:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44022:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33849:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70992:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48228:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71592:264;;;;;;;;;;;;;:::i;:::-;;51149:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70508:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39491:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70418:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35033:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17975:103;;;;;;;;;;;;;:::i;:::-;;17327:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71139:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38274:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72036:460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45147:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51940:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71864:164;;;;;;;;;;;;;:::i;:::-;;71306:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70477:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70580:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45538:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70651:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18233:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70542:31;;;;;;;;;;;;;:::o;37196:639::-;37281:4;37620:10;37605:25;;:11;:25;;;;:102;;;;37697:10;37682:25;;:11;:25;;;;37605:102;:179;;;;37774:10;37759:25;;:11;:25;;;;37605:179;37585:199;;37196:639;;;:::o;38098:100::-;38152:13;38185:5;38178:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38098:100;:::o;44589:218::-;44665:7;44690:16;44698:7;44690;:16::i;:::-;44685:64;;44715:34;;;;;;;;;;;;;;44685:64;44769:15;:24;44785:7;44769:24;;;;;;;;;;;:30;;;;;;;;;;;;44762:37;;44589:218;;;:::o;44022:408::-;44111:13;44127:16;44135:7;44127;:16::i;:::-;44111:32;;44183:5;44160:28;;:19;:17;:19::i;:::-;:28;;;44156:175;;44208:44;44225:5;44232:19;:17;:19::i;:::-;44208:16;:44::i;:::-;44203:128;;44280:35;;;;;;;;;;;;;;44203:128;44156:175;44376:2;44343:15;:24;44359:7;44343:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44414:7;44410:2;44394:28;;44403:5;44394:28;;;;;;;;;;;;44100:330;44022:408;;:::o;33849:323::-;33910:7;34138:15;:13;:15::i;:::-;34123:12;;34107:13;;:28;:46;34100:53;;33849:323;:::o;70992:139::-;17213:13;:11;:13::i;:::-;71103:20:::1;71081:19;;:42;;;;;;;;;;;;;;;;;;70992:139:::0;:::o;48228:2825::-;48370:27;48400;48419:7;48400:18;:27::i;:::-;48370:57;;48485:4;48444:45;;48460:19;48444:45;;;48440:86;;48498:28;;;;;;;;;;;;;;48440:86;48540:27;48569:23;48596:35;48623:7;48596:26;:35::i;:::-;48539:92;;;;48731:68;48756:15;48773:4;48779:19;:17;:19::i;:::-;48731:24;:68::i;:::-;48726:180;;48819:43;48836:4;48842:19;:17;:19::i;:::-;48819:16;:43::i;:::-;48814:92;;48871:35;;;;;;;;;;;;;;48814:92;48726:180;48937:1;48923:16;;:2;:16;;;48919:52;;;48948:23;;;;;;;;;;;;;;48919:52;48984:43;49006:4;49012:2;49016:7;49025:1;48984:21;:43::i;:::-;49120:15;49117:160;;;49260:1;49239:19;49232:30;49117:160;49657:18;:24;49676:4;49657:24;;;;;;;;;;;;;;;;49655:26;;;;;;;;;;;;49726:18;:22;49745:2;49726:22;;;;;;;;;;;;;;;;49724:24;;;;;;;;;;;50048:146;50085:2;50134:45;50149:4;50155:2;50159:19;50134:14;:45::i;:::-;30248:8;50106:73;50048:18;:146::i;:::-;50019:17;:26;50037:7;50019:26;;;;;;;;;;;:175;;;;50365:1;30248:8;50314:19;:47;:52;50310:627;;;50387:19;50419:1;50409:7;:11;50387:33;;50576:1;50542:17;:30;50560:11;50542:30;;;;;;;;;;;;:35;50538:384;;;50680:13;;50665:11;:28;50661:242;;50860:19;50827:17;:30;50845:11;50827:30;;;;;;;;;;;:52;;;;50661:242;50538:384;50368:569;50310:627;50984:7;50980:2;50965:27;;50974:4;50965:27;;;;;;;;;;;;51003:42;51024:4;51030:2;51034:7;51043:1;51003:20;:42::i;:::-;48359:2694;;;48228:2825;;;:::o;71592:264::-;17213:13;:11;:13::i;:::-;71651:22:::1;71677:21;71651:48;;71718:42;71710:60;;:76;71771:14;71710:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71805:10;71797:28;;:51;71826:21;71797:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71630:226;71592:264::o:0;51149:193::-;51295:39;51312:4;51318:2;51322:7;51295:39;;;;;;;;;;;;:16;:39::i;:::-;51149:193;;;:::o;70508:27::-;;;;:::o;39491:152::-;39563:7;39606:27;39625:7;39606:18;:27::i;:::-;39583:52;;39491:152;;;:::o;70418:24::-;;;;:::o;35033:233::-;35105:7;35146:1;35129:19;;:5;:19;;;35125:60;;;35157:28;;;;;;;;;;;;;;35125:60;29192:13;35203:18;:25;35222:5;35203:25;;;;;;;;;;;;;;;;:55;35196:62;;35033:233;;;:::o;17975:103::-;17213:13;:11;:13::i;:::-;18040:30:::1;18067:1;18040:18;:30::i;:::-;17975:103::o:0;17327:87::-;17373:7;17400:6;;;;;;;;;;;17393:13;;17327:87;:::o;71139:122::-;17213:13;:11;:13::i;:::-;71240::::1;;71225:12;:28;;;;;;;:::i;:::-;;71139:122:::0;;:::o;38274:104::-;38330:13;38363:7;38356:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38274:104;:::o;72036:460::-;70921:10;70908:23;;:9;:23;;;70900:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;72115:19:::1;;;;;;;;;;;72107:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;72206:9;;72193;72177:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;72169:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;72286:12;;72273:9;72247:11;:23;72259:10;72247:23;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:51;;72239:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;72364:9;;72352;:21;;;;:::i;:::-;72339:9;:34;72331:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;72436:9;72409:11;:23;72421:10;72409:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;72456:32;72466:10;72478:9;72456;:32::i;:::-;72036:460:::0;:::o;45147:234::-;45294:8;45242:18;:39;45261:19;:17;:19::i;:::-;45242:39;;;;;;;;;;;;;;;:49;45282:8;45242:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;45354:8;45318:55;;45333:19;:17;:19::i;:::-;45318:55;;;45364:8;45318:55;;;;;;:::i;:::-;;;;;;;;45147:234;;:::o;51940:407::-;52115:31;52128:4;52134:2;52138:7;52115:12;:31::i;:::-;52179:1;52161:2;:14;;;:19;52157:183;;52200:56;52231:4;52237:2;52241:7;52250:5;52200:30;:56::i;:::-;52195:145;;52284:40;;;;;;;;;;;;;;52195:145;52157:183;51940:407;;;;:::o;71864:164::-;17213:13;:11;:13::i;:::-;71922:10:::1;;;;;;;;;;;71921:11;71913:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;71981:4;71968:10;;:17;;;;;;;;;;;;;;;;;;71996:24;72006:10;72018:1;71996:9;:24::i;:::-;71864:164::o:0;71306:278::-;71380:13;71414:17;71422:8;71414:7;:17::i;:::-;71406:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;71525:12;71539:26;71556:8;71539:16;:26::i;:::-;71508:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71494:82;;71306:278;;;:::o;70477:24::-;;;;:::o;70580:30::-;;;;;;;;;;;;;:::o;45538:164::-;45635:4;45659:18;:25;45678:5;45659:25;;;;;;;;;;;;;;;:35;45685:8;45659:35;;;;;;;;;;;;;;;;;;;;;;;;;45652:42;;45538:164;;;;:::o;70651:46::-;;;;;;;;;;;;;;;;;:::o;18233:201::-;17213:13;:11;:13::i;:::-;18342:1:::1;18322:22;;:8;:22;;;;18314:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18398:28;18417:8;18398:18;:28::i;:::-;18233:201:::0;:::o;45960:282::-;46025:4;46081:7;46062:15;:13;:15::i;:::-;:26;;:66;;;;;46115:13;;46105:7;:23;46062:66;:153;;;;;46214:1;29968:8;46166:17;:26;46184:7;46166:26;;;;;;;;;;;;:44;:49;46062:153;46042:173;;45960:282;;;:::o;68268:105::-;68328:7;68355:10;68348:17;;68268:105;:::o;33365:92::-;33421:7;33365:92;:::o;17492:132::-;17567:12;:10;:12::i;:::-;17556:23;;:7;:5;:7::i;:::-;:23;;;17548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17492:132::o;40646:1275::-;40713:7;40733:12;40748:7;40733:22;;40816:4;40797:15;:13;:15::i;:::-;:23;40793:1061;;40850:13;;40843:4;:20;40839:1015;;;40888:14;40905:17;:23;40923:4;40905:23;;;;;;;;;;;;40888:40;;41022:1;29968:8;40994:6;:24;:29;40990:845;;;41659:113;41676:1;41666:6;:11;41659:113;;;41719:17;:25;41737:6;;;;;;;41719:25;;;;;;;;;;;;41710:34;;41659:113;;;41805:6;41798:13;;;;;;40990:845;40865:989;40839:1015;40793:1061;41882:31;;;;;;;;;;;;;;40646:1275;;;;:::o;47123:485::-;47225:27;47254:23;47295:38;47336:15;:24;47352:7;47336:24;;;;;;;;;;;47295:65;;47513:18;47490:41;;47570:19;47564:26;47545:45;;47475:126;47123:485;;;:::o;46351:659::-;46500:11;46665:16;46658:5;46654:28;46645:37;;46825:16;46814:9;46810:32;46797:45;;46975:15;46964:9;46961:30;46953:5;46942:9;46939:20;46936:56;46926:66;;46351:659;;;;;:::o;53009:159::-;;;;;:::o;67577:311::-;67712:7;67732:16;30372:3;67758:19;:41;;67732:68;;30372:3;67826:31;67837:4;67843:2;67847:9;67826:10;:31::i;:::-;67818:40;;:62;;67811:69;;;67577:311;;;;;:::o;42469:450::-;42549:14;42717:16;42710:5;42706:28;42697:37;;42894:5;42880:11;42855:23;42851:41;42848:52;42841:5;42838:63;42828:73;;42469:450;;;;:::o;53833:158::-;;;;;:::o;18594:191::-;18668:16;18687:6;;;;;;;;;;;18668:25;;18713:8;18704:6;;:17;;;;;;;;;;;;;;;;;;18768:8;18737:40;;18758:8;18737:40;;;;;;;;;;;;18657:128;18594:191;:::o;62100:112::-;62177:27;62187:2;62191:8;62177:27;;;;;;;;;;;;:9;:27::i;:::-;62100:112;;:::o;54431:716::-;54594:4;54640:2;54615:45;;;54661:19;:17;:19::i;:::-;54682:4;54688:7;54697:5;54615:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54611:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54915:1;54898:6;:13;:18;54894:235;;;54944:40;;;;;;;;;;;;;;54894:235;55087:6;55081:13;55072:6;55068:2;55064:15;55057:38;54611:529;54784:54;;;54774:64;;;:6;:64;;;;54767:71;;;54431:716;;;;;;:::o;13305:::-;13361:13;13412:14;13449:1;13429:17;13440:5;13429:10;:17::i;:::-;:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13465:41;;13521:11;13650:6;13646:2;13642:15;13634:6;13630:28;13623:35;;13687:288;13694:4;13687:288;;;13719:5;;;;;;;;13861:8;13856:2;13849:5;13845:14;13840:30;13835:3;13827:44;13917:2;13908:11;;;;;;:::i;:::-;;;;;13951:1;13942:5;:10;13938:21;;;13954:5;;13938:21;13687:288;;;13996:6;13989:13;;;;;13305:716;;;:::o;15878:98::-;15931:7;15958:10;15951:17;;15878:98;:::o;67278:147::-;67415:6;67278:147;;;;;:::o;61327:689::-;61458:19;61464:2;61468:8;61458:5;:19::i;:::-;61537:1;61519:2;:14;;;:19;61515:483;;61559:11;61573:13;;61559:27;;61605:13;61627:8;61621:3;:14;61605:30;;61654:233;61685:62;61724:1;61728:2;61732:7;;;;;;61741:5;61685:30;:62::i;:::-;61680:167;;61783:40;;;;;;;;;;;;;;61680:167;61882:3;61874:5;:11;61654:233;;61969:3;61952:13;;:20;61948:34;;61974:8;;;61948:34;61540:458;;61515:483;61327:689;;;:::o;10171:922::-;10224:7;10244:14;10261:1;10244:18;;10311:6;10302:5;:15;10298:102;;10347:6;10338:15;;;;;;:::i;:::-;;;;;10382:2;10372:12;;;;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;;;;:::i;:::-;;;;;10498:2;10488:12;;;;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;;;;:::i;:::-;;;;;10614:2;10604:12;;;;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;;;;:::i;:::-;;;;;10728:1;10718:11;;;;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;;;;:::i;:::-;;;;;10841:1;10831:11;;;;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;;;;:::i;:::-;;;;;10954:1;10944:11;;;;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;;;;10985:66;11079:6;11072:13;;;10171:922;;;:::o;55609:2966::-;55682:20;55705:13;;55682:36;;55745:1;55733:8;:13;55729:44;;;55755:18;;;;;;;;;;;;;;55729:44;55786:61;55816:1;55820:2;55824:12;55838:8;55786:21;:61::i;:::-;56330:1;29330:2;56300:1;:26;;56299:32;56287:8;:45;56261:18;:22;56280:2;56261:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;56609:139;56646:2;56700:33;56723:1;56727:2;56731:1;56700:14;:33::i;:::-;56667:30;56688:8;56667:20;:30::i;:::-;:66;56609:18;:139::i;:::-;56575:17;:31;56593:12;56575:31;;;;;;;;;;;:173;;;;56765:16;56796:11;56825:8;56810:12;:23;56796:37;;57346:16;57342:2;57338:25;57326:37;;57718:12;57678:8;57637:1;57575:25;57516:1;57455;57428:335;58089:1;58075:12;58071:20;58029:346;58130:3;58121:7;58118:16;58029:346;;58348:7;58338:8;58335:1;58308:25;58305:1;58302;58297:59;58183:1;58174:7;58170:15;58159:26;;58029:346;;;58033:77;58420:1;58408:8;:13;58404:45;;;58430:19;;;;;;;;;;;;;;58404:45;58482:3;58466:13;:19;;;;56035:2462;;58507:60;58536:1;58540:2;58544:12;58558:8;58507:20;:60::i;:::-;55671:2904;55609:2966;;:::o;43021:324::-;43091:14;43324:1;43314:8;43311:15;43285:24;43281:46;43271:56;;43021:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:118::-;7389:24;7407:5;7389:24;:::i;:::-;7384:3;7377:37;7302:118;;:::o;7426:109::-;7507:21;7522:5;7507:21;:::i;:::-;7502:3;7495:34;7426:109;;:::o;7541:360::-;7627:3;7655:38;7687:5;7655:38;:::i;:::-;7709:70;7772:6;7767:3;7709:70;:::i;:::-;7702:77;;7788:52;7833:6;7828:3;7821:4;7814:5;7810:16;7788:52;:::i;:::-;7865:29;7887:6;7865:29;:::i;:::-;7860:3;7856:39;7849:46;;7631:270;7541:360;;;;:::o;7907:364::-;7995:3;8023:39;8056:5;8023:39;:::i;:::-;8078:71;8142:6;8137:3;8078:71;:::i;:::-;8071:78;;8158:52;8203:6;8198:3;8191:4;8184:5;8180:16;8158:52;:::i;:::-;8235:29;8257:6;8235:29;:::i;:::-;8230:3;8226:39;8219:46;;7999:272;7907:364;;;;:::o;8277:377::-;8383:3;8411:39;8444:5;8411:39;:::i;:::-;8466:89;8548:6;8543:3;8466:89;:::i;:::-;8459:96;;8564:52;8609:6;8604:3;8597:4;8590:5;8586:16;8564:52;:::i;:::-;8641:6;8636:3;8632:16;8625:23;;8387:267;8277:377;;;;:::o;8684:845::-;8787:3;8824:5;8818:12;8853:36;8879:9;8853:36;:::i;:::-;8905:89;8987:6;8982:3;8905:89;:::i;:::-;8898:96;;9025:1;9014:9;9010:17;9041:1;9036:137;;;;9187:1;9182:341;;;;9003:520;;9036:137;9120:4;9116:9;9105;9101:25;9096:3;9089:38;9156:6;9151:3;9147:16;9140:23;;9036:137;;9182:341;9249:38;9281:5;9249:38;:::i;:::-;9309:1;9323:154;9337:6;9334:1;9331:13;9323:154;;;9411:7;9405:14;9401:1;9396:3;9392:11;9385:35;9461:1;9452:7;9448:15;9437:26;;9359:4;9356:1;9352:12;9347:17;;9323:154;;;9506:6;9501:3;9497:16;9490:23;;9189:334;;9003:520;;8791:738;;8684:845;;;;:::o;9535:366::-;9677:3;9698:67;9762:2;9757:3;9698:67;:::i;:::-;9691:74;;9774:93;9863:3;9774:93;:::i;:::-;9892:2;9887:3;9883:12;9876:19;;9535:366;;;:::o;9907:::-;10049:3;10070:67;10134:2;10129:3;10070:67;:::i;:::-;10063:74;;10146:93;10235:3;10146:93;:::i;:::-;10264:2;10259:3;10255:12;10248:19;;9907:366;;;:::o;10279:::-;10421:3;10442:67;10506:2;10501:3;10442:67;:::i;:::-;10435:74;;10518:93;10607:3;10518:93;:::i;:::-;10636:2;10631:3;10627:12;10620:19;;10279:366;;;:::o;10651:::-;10793:3;10814:67;10878:2;10873:3;10814:67;:::i;:::-;10807:74;;10890:93;10979:3;10890:93;:::i;:::-;11008:2;11003:3;10999:12;10992:19;;10651:366;;;:::o;11023:365::-;11165:3;11186:66;11250:1;11245:3;11186:66;:::i;:::-;11179:73;;11261:93;11350:3;11261:93;:::i;:::-;11379:2;11374:3;11370:12;11363:19;;11023:365;;;:::o;11394:400::-;11554:3;11575:84;11657:1;11652:3;11575:84;:::i;:::-;11568:91;;11668:93;11757:3;11668:93;:::i;:::-;11786:1;11781:3;11777:11;11770:18;;11394:400;;;:::o;11800:366::-;11942:3;11963:67;12027:2;12022:3;11963:67;:::i;:::-;11956:74;;12039:93;12128:3;12039:93;:::i;:::-;12157:2;12152:3;12148:12;12141:19;;11800:366;;;:::o;12172:::-;12314:3;12335:67;12399:2;12394:3;12335:67;:::i;:::-;12328:74;;12411:93;12500:3;12411:93;:::i;:::-;12529:2;12524:3;12520:12;12513:19;;12172:366;;;:::o;12544:::-;12686:3;12707:67;12771:2;12766:3;12707:67;:::i;:::-;12700:74;;12783:93;12872:3;12783:93;:::i;:::-;12901:2;12896:3;12892:12;12885:19;;12544:366;;;:::o;12916:::-;13058:3;13079:67;13143:2;13138:3;13079:67;:::i;:::-;13072:74;;13155:93;13244:3;13155:93;:::i;:::-;13273:2;13268:3;13264:12;13257:19;;12916:366;;;:::o;13288:118::-;13375:24;13393:5;13375:24;:::i;:::-;13370:3;13363:37;13288:118;;:::o;13412:695::-;13690:3;13712:92;13800:3;13791:6;13712:92;:::i;:::-;13705:99;;13821:95;13912:3;13903:6;13821:95;:::i;:::-;13814:102;;13933:148;14077:3;13933:148;:::i;:::-;13926:155;;14098:3;14091:10;;13412:695;;;;;:::o;14113:222::-;14206:4;14244:2;14233:9;14229:18;14221:26;;14257:71;14325:1;14314:9;14310:17;14301:6;14257:71;:::i;:::-;14113:222;;;;:::o;14341:640::-;14536:4;14574:3;14563:9;14559:19;14551:27;;14588:71;14656:1;14645:9;14641:17;14632:6;14588:71;:::i;:::-;14669:72;14737:2;14726:9;14722:18;14713:6;14669:72;:::i;:::-;14751;14819:2;14808:9;14804:18;14795:6;14751:72;:::i;:::-;14870:9;14864:4;14860:20;14855:2;14844:9;14840:18;14833:48;14898:76;14969:4;14960:6;14898:76;:::i;:::-;14890:84;;14341:640;;;;;;;:::o;14987:210::-;15074:4;15112:2;15101:9;15097:18;15089:26;;15125:65;15187:1;15176:9;15172:17;15163:6;15125:65;:::i;:::-;14987:210;;;;:::o;15203:313::-;15316:4;15354:2;15343:9;15339:18;15331:26;;15403:9;15397:4;15393:20;15389:1;15378:9;15374:17;15367:47;15431:78;15504:4;15495:6;15431:78;:::i;:::-;15423:86;;15203:313;;;;:::o;15522:419::-;15688:4;15726:2;15715:9;15711:18;15703:26;;15775:9;15769:4;15765:20;15761:1;15750:9;15746:17;15739:47;15803:131;15929:4;15803:131;:::i;:::-;15795:139;;15522:419;;;:::o;15947:::-;16113:4;16151:2;16140:9;16136:18;16128:26;;16200:9;16194:4;16190:20;16186:1;16175:9;16171:17;16164:47;16228:131;16354:4;16228:131;:::i;:::-;16220:139;;15947:419;;;:::o;16372:::-;16538:4;16576:2;16565:9;16561:18;16553:26;;16625:9;16619:4;16615:20;16611:1;16600:9;16596:17;16589:47;16653:131;16779:4;16653:131;:::i;:::-;16645:139;;16372:419;;;:::o;16797:::-;16963:4;17001:2;16990:9;16986:18;16978:26;;17050:9;17044:4;17040:20;17036:1;17025:9;17021:17;17014:47;17078:131;17204:4;17078:131;:::i;:::-;17070:139;;16797:419;;;:::o;17222:::-;17388:4;17426:2;17415:9;17411:18;17403:26;;17475:9;17469:4;17465:20;17461:1;17450:9;17446:17;17439:47;17503:131;17629:4;17503:131;:::i;:::-;17495:139;;17222:419;;;:::o;17647:::-;17813:4;17851:2;17840:9;17836:18;17828:26;;17900:9;17894:4;17890:20;17886:1;17875:9;17871:17;17864:47;17928:131;18054:4;17928:131;:::i;:::-;17920:139;;17647:419;;;:::o;18072:::-;18238:4;18276:2;18265:9;18261:18;18253:26;;18325:9;18319:4;18315:20;18311:1;18300:9;18296:17;18289:47;18353:131;18479:4;18353:131;:::i;:::-;18345:139;;18072:419;;;:::o;18497:::-;18663:4;18701:2;18690:9;18686:18;18678:26;;18750:9;18744:4;18740:20;18736:1;18725:9;18721:17;18714:47;18778:131;18904:4;18778:131;:::i;:::-;18770:139;;18497:419;;;:::o;18922:::-;19088:4;19126:2;19115:9;19111:18;19103:26;;19175:9;19169:4;19165:20;19161:1;19150:9;19146:17;19139:47;19203:131;19329:4;19203:131;:::i;:::-;19195:139;;18922:419;;;:::o;19347:222::-;19440:4;19478:2;19467:9;19463:18;19455:26;;19491:71;19559:1;19548:9;19544:17;19535:6;19491:71;:::i;:::-;19347:222;;;;:::o;19575:129::-;19609:6;19636:20;;:::i;:::-;19626:30;;19665:33;19693:4;19685:6;19665:33;:::i;:::-;19575:129;;;:::o;19710:75::-;19743:6;19776:2;19770:9;19760:19;;19710:75;:::o;19791:307::-;19852:4;19942:18;19934:6;19931:30;19928:56;;;19964:18;;:::i;:::-;19928:56;20002:29;20024:6;20002:29;:::i;:::-;19994:37;;20086:4;20080;20076:15;20068:23;;19791:307;;;:::o;20104:141::-;20153:4;20176:3;20168:11;;20199:3;20196:1;20189:14;20233:4;20230:1;20220:18;20212:26;;20104:141;;;:::o;20251:98::-;20302:6;20336:5;20330:12;20320:22;;20251:98;;;:::o;20355:99::-;20407:6;20441:5;20435:12;20425:22;;20355:99;;;:::o;20460:168::-;20543:11;20577:6;20572:3;20565:19;20617:4;20612:3;20608:14;20593:29;;20460:168;;;;:::o;20634:169::-;20718:11;20752:6;20747:3;20740:19;20792:4;20787:3;20783:14;20768:29;;20634:169;;;;:::o;20809:148::-;20911:11;20948:3;20933:18;;20809:148;;;;:::o;20963:305::-;21003:3;21022:20;21040:1;21022:20;:::i;:::-;21017:25;;21056:20;21074:1;21056:20;:::i;:::-;21051:25;;21210:1;21142:66;21138:74;21135:1;21132:81;21129:107;;;21216:18;;:::i;:::-;21129:107;21260:1;21257;21253:9;21246:16;;20963:305;;;;:::o;21274:348::-;21314:7;21337:20;21355:1;21337:20;:::i;:::-;21332:25;;21371:20;21389:1;21371:20;:::i;:::-;21366:25;;21559:1;21491:66;21487:74;21484:1;21481:81;21476:1;21469:9;21462:17;21458:105;21455:131;;;21566:18;;:::i;:::-;21455:131;21614:1;21611;21607:9;21596:20;;21274:348;;;;:::o;21628:96::-;21665:7;21694:24;21712:5;21694:24;:::i;:::-;21683:35;;21628:96;;;:::o;21730:90::-;21764:7;21807:5;21800:13;21793:21;21782:32;;21730:90;;;:::o;21826:149::-;21862:7;21902:66;21895:5;21891:78;21880:89;;21826:149;;;:::o;21981:126::-;22018:7;22058:42;22051:5;22047:54;22036:65;;21981:126;;;:::o;22113:77::-;22150:7;22179:5;22168:16;;22113:77;;;:::o;22196:154::-;22280:6;22275:3;22270;22257:30;22342:1;22333:6;22328:3;22324:16;22317:27;22196:154;;;:::o;22356:307::-;22424:1;22434:113;22448:6;22445:1;22442:13;22434:113;;;22533:1;22528:3;22524:11;22518:18;22514:1;22509:3;22505:11;22498:39;22470:2;22467:1;22463:10;22458:15;;22434:113;;;22565:6;22562:1;22559:13;22556:101;;;22645:1;22636:6;22631:3;22627:16;22620:27;22556:101;22405:258;22356:307;;;:::o;22669:320::-;22713:6;22750:1;22744:4;22740:12;22730:22;;22797:1;22791:4;22787:12;22818:18;22808:81;;22874:4;22866:6;22862:17;22852:27;;22808:81;22936:2;22928:6;22925:14;22905:18;22902:38;22899:84;;;22955:18;;:::i;:::-;22899:84;22720:269;22669:320;;;:::o;22995:281::-;23078:27;23100:4;23078:27;:::i;:::-;23070:6;23066:40;23208:6;23196:10;23193:22;23172:18;23160:10;23157:34;23154:62;23151:88;;;23219:18;;:::i;:::-;23151:88;23259:10;23255:2;23248:22;23038:238;22995:281;;:::o;23282:180::-;23330:77;23327:1;23320:88;23427:4;23424:1;23417:15;23451:4;23448:1;23441:15;23468:180;23516:77;23513:1;23506:88;23613:4;23610:1;23603:15;23637:4;23634:1;23627:15;23654:180;23702:77;23699:1;23692:88;23799:4;23796:1;23789:15;23823:4;23820:1;23813:15;23840:180;23888:77;23885:1;23878:88;23985:4;23982:1;23975:15;24009:4;24006:1;23999:15;24026:117;24135:1;24132;24125:12;24149:117;24258:1;24255;24248:12;24272:117;24381:1;24378;24371:12;24395:117;24504:1;24501;24494:12;24518:117;24627:1;24624;24617:12;24641:117;24750:1;24747;24740:12;24764:102;24805:6;24856:2;24852:7;24847:2;24840:5;24836:14;24832:28;24822:38;;24764:102;;;:::o;24872:166::-;25012:18;25008:1;25000:6;24996:14;24989:42;24872:166;:::o;25044:169::-;25184:21;25180:1;25172:6;25168:14;25161:45;25044:169;:::o;25219:225::-;25359:34;25355:1;25347:6;25343:14;25336:58;25428:8;25423:2;25415:6;25411:15;25404:33;25219:225;:::o;25450:178::-;25590:30;25586:1;25578:6;25574:14;25567:54;25450:178;:::o;25634:158::-;25774:10;25770:1;25762:6;25758:14;25751:34;25634:158;:::o;25798:155::-;25938:7;25934:1;25926:6;25922:14;25915:31;25798:155;:::o;25959:167::-;26099:19;26095:1;26087:6;26083:14;26076:43;25959:167;:::o;26132:182::-;26272:34;26268:1;26260:6;26256:14;26249:58;26132:182;:::o;26320:234::-;26460:34;26456:1;26448:6;26444:14;26437:58;26529:17;26524:2;26516:6;26512:15;26505:42;26320:234;:::o;26560:170::-;26700:22;26696:1;26688:6;26684:14;26677:46;26560:170;:::o;26736:122::-;26809:24;26827:5;26809:24;:::i;:::-;26802:5;26799:35;26789:63;;26848:1;26845;26838:12;26789:63;26736:122;:::o;26864:116::-;26934:21;26949:5;26934:21;:::i;:::-;26927:5;26924:32;26914:60;;26970:1;26967;26960:12;26914:60;26864:116;:::o;26986:120::-;27058:23;27075:5;27058:23;:::i;:::-;27051:5;27048:34;27038:62;;27096:1;27093;27086:12;27038:62;26986:120;:::o;27112:122::-;27185:24;27203:5;27185:24;:::i;:::-;27178:5;27175:35;27165:63;;27224:1;27221;27214:12;27165:63;27112:122;:::o
Swarm Source
ipfs://4c7c5b7df9fb6e51d27dd4b0ba740c070a9cc490bb873a60183f4878511482b2
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.