Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 50 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint | 16326438 | 1156 days ago | IN | 0 ETH | 0.00316367 | ||||
| Mint | 16326431 | 1156 days ago | IN | 0 ETH | 0.00346823 | ||||
| Mint | 16326421 | 1156 days ago | IN | 0 ETH | 0.00348152 | ||||
| Mint | 16318009 | 1157 days ago | IN | 0 ETH | 0.00326389 | ||||
| Mint | 16302984 | 1159 days ago | IN | 0 ETH | 0.00317736 | ||||
| Transfer From | 16298756 | 1160 days ago | IN | 0 ETH | 0.00105052 | ||||
| Mint | 16297954 | 1160 days ago | IN | 0 ETH | 0.0033888 | ||||
| Mint | 16297522 | 1160 days ago | IN | 0 ETH | 0.00171667 | ||||
| Mint | 16297192 | 1160 days ago | IN | 0 ETH | 0.00297197 | ||||
| Mint | 16297131 | 1160 days ago | IN | 0 ETH | 0.00312994 | ||||
| Mint | 16289953 | 1161 days ago | IN | 0 ETH | 0.00320299 | ||||
| Mint | 16286845 | 1162 days ago | IN | 0 ETH | 0.0010265 | ||||
| Mint | 16286818 | 1162 days ago | IN | 0 ETH | 0.0016667 | ||||
| Mint | 16285426 | 1162 days ago | IN | 0 ETH | 0.00484147 | ||||
| Mint | 16285352 | 1162 days ago | IN | 0 ETH | 0.00470178 | ||||
| Mint | 16285308 | 1162 days ago | IN | 0 ETH | 0.00316871 | ||||
| Mint | 16273319 | 1164 days ago | IN | 0 ETH | 0.00139591 | ||||
| Mint | 16272792 | 1164 days ago | IN | 0 ETH | 0.00394058 | ||||
| Mint | 16272777 | 1164 days ago | IN | 0 ETH | 0.00386797 | ||||
| Mint | 16272726 | 1164 days ago | IN | 0 ETH | 0.0032066 | ||||
| Mint | 16272686 | 1164 days ago | IN | 0 ETH | 0.00046341 | ||||
| Mint | 16271719 | 1164 days ago | IN | 0 ETH | 0.00283643 | ||||
| Mint | 16271441 | 1164 days ago | IN | 0 ETH | 0.00260154 | ||||
| Mint | 16263674 | 1165 days ago | IN | 0 ETH | 0.00238651 | ||||
| Mint | 16260004 | 1165 days ago | IN | 0 ETH | 0.0025587 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Morrisers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-21
*/
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// 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: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256, /* firstTokenId */
uint256 batchSize
) internal virtual {
if (batchSize > 1) {
if (from != address(0)) {
_balances[from] -= batchSize;
}
if (to != address(0)) {
_balances[to] += batchSize;
}
}
}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
}
// File: morrisersnft.sol
pragma solidity >= 0.7.0 < 0.9.0;
contract Morrisers is ERC721, Ownable {
using Strings for uint256;
using Counters for Counters.Counter;
Counters.Counter private supply;
string public uriPrefix = "ipfs://QmbZ8frtto5a6CZZsyrneGmEq1p4UokgCDt58kcXbRMFZY/";
string public uriSuffix = ".json";
string public hiddenMetadataUri;
uint256 public presaleCost = 0.015 ether;
uint256 public publicsaleCost = 0.023 ether;
uint256 public maxSupply = 3777;
uint256 public freeMint = 777;
uint256 public nftPerAddressLimit = 100;
uint256 public nftPresalePerAddressLimit = 100;
uint256 public maxMintAmountPerTx = 50;
bool public paused = false;
bool public presale = true;
bool public revealed = false;
bool public onlyWhitelisted = false;
mapping(address => bool) public whitelistedAddressesList;
mapping(address => uint256) public addressMintedBalance;
constructor() ERC721("Morrisers", "MRS") {
setHiddenMetadataUri("ipfs://QmY6jMU521TURMHd7rHfWWKTZXH2pKJDpHUsj9hvgLJKgx/");
}
// Mint Compliance
modifier mintCompliance(uint256 _mintAmount) {
if(supply.current() > freeMint){
if(presale == true ) {
uint256 ownerMintedCount = addressMintedBalance[msg.sender];
require(ownerMintedCount + _mintAmount <= nftPresalePerAddressLimit, "Max NFT per address exceeded");
}else {
uint256 ownerMintedCount = addressMintedBalance[msg.sender];
require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Max NFT per address exceeded");
}
require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
}
else{
uint256 ownerMintedCount = addressMintedBalance[msg.sender];
require(ownerMintedCount + _mintAmount <= 5, "Free Mint Limit Exit!");
require(_mintAmount > 0 && _mintAmount <= 5, "Invalid mint amount!");
}
require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
_;
}
// Total Supply
function totalSupply() public view returns (uint256) {
return supply.current();
}
// Mint
function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
require(!paused, "The contract is paused!");
if(supply.current() > freeMint){
if(supply.current() < 3777){
if(presale == true) {
require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!");
} else {
require(msg.value >= publicsaleCost * _mintAmount, "Insufficient funds!");
}
}
}else{
require(_mintAmount > 0 && _mintAmount <= 5 , "Invalid mint amount!");
}
mintLoop(msg.sender, _mintAmount);
}
function ownerMint(uint256 _mintAmount) public onlyOwner {
require(!paused, "The contract is paused!");
mintLoop(msg.sender, _mintAmount);
}
function ownerMintSpecific(uint256 _tokenId) public onlyOwner {
require(!paused, "The contract is paused!");
_safeMint(msg.sender, _tokenId);
}
// Mint For Address
function mintForAddress(uint256 mintAmount, address receiver) public mintCompliance(mintAmount) onlyOwner {
mintLoop(receiver, mintAmount);
}
function mintTo( address to, uint256 _count) external payable {
address crossmint_eth = 0xdAb1a1854214684acE522439684a145E62505233;
require(
msg.sender == crossmint_eth, // Optional Restriction
"This function can be called by the Crossmint address only." // Error message
);
mintLoop(to, _count);
}
// Wallet Of Owner
function walletOfOwner(address _owner) public view returns (uint256[] memory) {
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = 1;
uint256 ownedTokenIndex = 0;
while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
address currentTokenOwner = ownerOf(currentTokenId);
if (currentTokenOwner == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
currentTokenId++;
}
return ownedTokenIds;
}
// Token URI
function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
if (revealed == false) {
return hiddenMetadataUri;
}
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : "";
}
// Presale Cost
function setPresaleCost(uint256 _cost) public onlyOwner {
presaleCost = _cost;
}
// Free Sale Supply
function setFreeSaleLimit(uint256 _cost) public onlyOwner {
freeMint = _cost;
}
// Publicsale Cost
function setPublicsaleCost(uint256 _cost) public onlyOwner {
publicsaleCost = _cost;
}
// Set NFT Per Address Limit
function setNFTPerAddressLimit(uint256 _cost) public onlyOwner {
nftPerAddressLimit = _cost;
}
// Set NFT Presale Per Address Limit
function setNFTPresalePerAddressLimit(uint256 _cost) public onlyOwner {
nftPresalePerAddressLimit = _cost;
}
// Set URI Prefix
function setUriPrefix(string memory _uriPrefix) public onlyOwner {
uriPrefix = _uriPrefix;
}
// Set URI Suffix
function setUriSuffix(string memory _uriSuffix) public onlyOwner {
uriSuffix = _uriSuffix;
}
// Set Paused
function setPaused(bool _state) public onlyOwner {
paused = _state;
}
// Set Hidden Metadata URI
function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
hiddenMetadataUri = _hiddenMetadataUri;
}
// Set Presale
function setPresale(bool _state) public onlyOwner {
presale = _state;
}
// Set Revealed
function setRevealed(bool _state) public onlyOwner {
revealed = _state;
}
// Mint Loop
function mintLoop(address receiver, uint256 _mintAmount) internal {
for (uint256 i = 0; i < _mintAmount; i++) {
supply.increment();
_safeMint(receiver, supply.current());
addressMintedBalance[msg.sender]++;
}
}
// Base URI
function _baseURI() internal view virtual override returns (string memory) {
return uriPrefix;
}
// Set Only Whitelisted
function setOnlyWhitelisted(bool _state) public onlyOwner {
onlyWhitelisted = _state;
}
// Whitelist Users
function addToWhiteList(address _addr) public onlyOwner {
whitelistedAddressesList[_addr] = true;
}
function addArrayToWhiteList(address[] memory _addrs) public onlyOwner {
for (uint256 i = 0;i< _addrs.length; i++) {
whitelistedAddressesList[_addrs[i]] = true;
}
}
function removeFromWhiteList(address _addr) public onlyOwner {
whitelistedAddressesList[_addr] = false;
}
function isInWhiteList(address _addr) public view returns (bool) {
return whitelistedAddressesList[_addr] || _addr == owner();
}
function withdraw() public payable onlyOwner {
// =============================================================================
(bool os, ) = payable(owner()).call{value: address(this).balance}("");
require(os);
// =============================================================================
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"_addrs","type":"address[]"}],"name":"addArrayToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isInWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","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":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPresalePerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerMintSpecific","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setFreeSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setNFTPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setNFTPresalePerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicsaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddressesList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60e0604052603660808181529062002f3360a039805162000029916008916020909101906200022c565b5060408051808201909152600580825264173539b7b760d91b602090920191825262000058916009916200022c565b5066354a6ba7a18000600b556651b660cdd58000600c55610ec1600d55610309600e556064600f81905560105560326011556012805463ffffffff1916610100179055348015620000a857600080fd5b5060408051808201825260098152684d6f7272697365727360b81b6020808301918252835180850190945260038452624d525360e81b908401528151919291620000f5916000916200022c565b5080516200010b9060019060208401906200022c565b50505062000128620001226200015260201b60201c565b62000156565b6200014c60405180606001604052806036815260200162002f6960369139620001a8565b6200030f565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001b2620001cb565b8051620001c790600a9060208401906200022c565b5050565b6006546001600160a01b031633146200022a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b8280546200023a90620002d2565b90600052602060002090601f0160209004810192826200025e5760008555620002a9565b82601f106200027957805160ff1916838001178555620002a9565b82800160010185558215620002a9579182015b82811115620002a95782518255916020019190600101906200028c565b50620002b7929150620002bb565b5090565b5b80821115620002b75760008155600101620002bc565b600181811c90821680620002e757607f821691505b602082108114156200030957634e487b7160e01b600052602260045260246000fd5b50919050565b612c14806200031f6000396000f3fe60806040526004361061036b5760003560e01c8063715018a6116101c6578063c243c6c1116100f7578063e9058c3711610095578063f19e75d41161006f578063f19e75d4146109b1578063f2fde38b146109d1578063fa65b592146109f1578063fdea8e0b14610a2157600080fd5b8063e9058c3714610928578063e985e9c514610948578063efbd73f41461099157600080fd5b8063d004d240116100d1578063d004d240146108b2578063d5abeb01146108d2578063e08823c5146108e8578063e0a808531461090857600080fd5b8063c243c6c114610852578063c54e73e314610872578063c87b56dd1461089257600080fd5b806396bfc22911610164578063a22cb4651161013e578063a22cb465146107e7578063a45ba8e714610807578063b88d4fde1461081c578063ba7d2c761461083c57600080fd5b806396bfc229146107935780639c70b512146107b3578063a0712d68146107d457600080fd5b80638fdcf942116101a05780638fdcf9421461073257806392829d741461075257806394354fd01461076857806395d89b411461077e57600080fd5b8063715018a6146106df5780637ec4a659146106f45780638da5cb5b1461071457600080fd5b8063438b6300116102a05780635c975abb1161023e5780636905b184116102185780636905b184146106695780636d47bcab146106895780636f636e8b146106a957806370a08231146106bf57600080fd5b80635c975abb1461061a57806362b99ad4146106345780636352211e1461064957600080fd5b80634fdd43cb1161027a5780634fdd43cb146105af57806351830227146105cf5780635503a0e8146105ef5780635b70ea9f1461060457600080fd5b8063438b63001461054f578063449a52f81461057c57806347ee03941461058f57600080fd5b806318160ddd1161030d5780632a23d07d116102e75780632a23d07d146104f15780633c952764146105075780633ccfd60b1461052757806342842e0e1461052f57600080fd5b806318160ddd1461048157806318cae269146104a457806323b872dd146104d157600080fd5b8063081812fc11610349578063081812fc146103e9578063095ea7b31461042157806316ba10e01461044157806316c38b3c1461046157600080fd5b806301bf66481461037057806301ffc9a71461039257806306fdde03146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004612499565b610a40565b005b34801561039e57600080fd5b506103b26103ad3660046126c2565b610a69565b60405190151581526020015b60405180910390f35b3480156103d357600080fd5b506103dc610abb565b6040516103be91906128f2565b3480156103f557600080fd5b50610409610404366004612745565b610b4d565b6040516001600160a01b0390911681526020016103be565b34801561042d57600080fd5b5061039061043c3660046125c9565b610b74565b34801561044d57600080fd5b5061039061045c3660046126fc565b610c8f565b34801561046d57600080fd5b5061039061047c3660046126a7565b610cae565b34801561048d57600080fd5b50610496610cc9565b6040519081526020016103be565b3480156104b057600080fd5b506104966104bf366004612499565b60146020526000908152604090205481565b3480156104dd57600080fd5b506103906104ec3660046124e7565b610cd9565b3480156104fd57600080fd5b50610496600b5481565b34801561051357600080fd5b506103906105223660046126a7565b610d0a565b610390610d30565b34801561053b57600080fd5b5061039061054a3660046124e7565b610dac565b34801561055b57600080fd5b5061056f61056a366004612499565b610dc7565b6040516103be91906128ae565b61039061058a3660046125c9565b610ea8565b34801561059b57600080fd5b506103906105aa366004612499565b610f3c565b3480156105bb57600080fd5b506103906105ca3660046126fc565b610f68565b3480156105db57600080fd5b506012546103b29062010000900460ff1681565b3480156105fb57600080fd5b506103dc610f83565b34801561061057600080fd5b50610496600e5481565b34801561062657600080fd5b506012546103b29060ff1681565b34801561064057600080fd5b506103dc611011565b34801561065557600080fd5b50610409610664366004612745565b61101e565b34801561067557600080fd5b50610390610684366004612745565b61107e565b34801561069557600080fd5b506103906106a4366004612745565b61108b565b3480156106b557600080fd5b5061049660105481565b3480156106cb57600080fd5b506104966106da366004612499565b611098565b3480156106eb57600080fd5b5061039061111e565b34801561070057600080fd5b5061039061070f3660046126fc565b611132565b34801561072057600080fd5b506006546001600160a01b0316610409565b34801561073e57600080fd5b5061039061074d366004612745565b61114d565b34801561075e57600080fd5b50610496600c5481565b34801561077457600080fd5b5061049660115481565b34801561078a57600080fd5b506103dc61115a565b34801561079f57600080fd5b506103b26107ae366004612499565b611169565b3480156107bf57600080fd5b506012546103b2906301000000900460ff1681565b6103906107e2366004612745565b6111a0565b3480156107f357600080fd5b5061039061080236600461259f565b61145b565b34801561081357600080fd5b506103dc611466565b34801561082857600080fd5b50610390610837366004612523565b611473565b34801561084857600080fd5b50610496600f5481565b34801561085e57600080fd5b5061039061086d3660046125f3565b6114ab565b34801561087e57600080fd5b5061039061088d3660046126a7565b61151b565b34801561089e57600080fd5b506103dc6108ad366004612745565b61153d565b3480156108be57600080fd5b506103906108cd366004612745565b6116bd565b3480156108de57600080fd5b50610496600d5481565b3480156108f457600080fd5b50610390610903366004612745565b6116ca565b34801561091457600080fd5b506103906109233660046126a7565b6116ff565b34801561093457600080fd5b50610390610943366004612745565b611723565b34801561095457600080fd5b506103b26109633660046124b4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561099d57600080fd5b506103906109ac36600461275e565b611730565b3480156109bd57600080fd5b506103906109cc366004612745565b611909565b3480156109dd57600080fd5b506103906109ec366004612499565b61193e565b3480156109fd57600080fd5b506103b2610a0c366004612499565b60136020526000908152604090205460ff1681565b348015610a2d57600080fd5b506012546103b290610100900460ff1681565b610a486119b4565b6001600160a01b03166000908152601360205260409020805460ff19169055565b60006001600160e01b031982166380ac58cd60e01b1480610a9a57506001600160e01b03198216635b5e139f60e01b145b80610ab557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610aca90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690612b30565b8015610b435780601f10610b1857610100808354040283529160200191610b43565b820191906000526020600020905b815481529060010190602001808311610b2657829003601f168201915b5050505050905090565b6000610b5882611a0e565b506000908152600460205260409020546001600160a01b031690565b6000610b7f8261101e565b9050806001600160a01b0316836001600160a01b03161415610bf25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c0e5750610c0e8133610963565b610c805760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610be9565b610c8a8383611a6d565b505050565b610c976119b4565b8051610caa90600990602084019061237c565b5050565b610cb66119b4565b6012805460ff1916911515919091179055565b6000610cd460075490565b905090565b610ce33382611adb565b610cff5760405162461bcd60e51b8152600401610be990612905565b610c8a838383611b5a565b610d126119b4565b6012805491151563010000000263ff00000019909216919091179055565b610d386119b4565b6000610d4c6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d96576040519150601f19603f3d011682016040523d82523d6000602084013e610d9b565b606091505b5050905080610da957600080fd5b50565b610c8a83838360405180602001604052806000815250611473565b60606000610dd483611098565b905060008167ffffffffffffffff811115610df157610df1612bb2565b604051908082528060200260200182016040528015610e1a578160200160208202803683370190505b509050600160005b8381108015610e335750600d548211155b15610e9e576000610e438361101e565b9050866001600160a01b0316816001600160a01b03161415610e8b5782848381518110610e7257610e72612b9c565b602090810291909101015281610e8781612b6b565b9250505b82610e9581612b6b565b93505050610e22565b5090949350505050565b73dab1a1854214684ace522439684a145e62505233338114610f325760405162461bcd60e51b815260206004820152603a60248201527f546869732066756e6374696f6e2063616e2062652063616c6c6564206279207460448201527f68652043726f73736d696e742061646472657373206f6e6c792e0000000000006064820152608401610be9565b610c8a8383611ccb565b610f446119b4565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b610f706119b4565b8051610caa90600a90602084019061237c565b60098054610f9090612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbc90612b30565b80156110095780601f10610fde57610100808354040283529160200191611009565b820191906000526020600020905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b60088054610f9090612b30565b6000818152600260205260408120546001600160a01b031680610ab55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610be9565b6110866119b4565b600c55565b6110936119b4565b600f55565b60006001600160a01b0382166111025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610be9565b506001600160a01b031660009081526003602052604090205490565b6111266119b4565b6111306000611d29565b565b61113a6119b4565b8051610caa90600890602084019061237c565b6111556119b4565b600b55565b606060018054610aca90612b30565b6001600160a01b03811660009081526013602052604081205460ff1680610ab55750506006546001600160a01b0391821691161490565b80600e546111ad60075490565b111561127a5760125460ff6101009091041615156001141561120a57336000908152601460205260409020546010546111e68383612ab6565b11156112045760405162461bcd60e51b8152600401610be990612a4e565b50611247565b33600090815260146020526040902054600f546112278383612ab6565b11156112455760405162461bcd60e51b8152600401610be990612a4e565b505b60008111801561125957506011548111155b6112755760405162461bcd60e51b8152600401610be9906129e9565b61130b565b3360009081526014602052604090205460056112968383612ab6565b11156112dc5760405162461bcd60e51b815260206004820152601560248201527446726565204d696e74204c696d697420457869742160581b6044820152606401610be9565b6000821180156112ed575060058211155b6113095760405162461bcd60e51b8152600401610be9906129e9565b505b600d548161131860075490565b6113229190612ab6565b11156113675760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610be9565b60125460ff161561138a5760405162461bcd60e51b8152600401610be990612a17565b600e54600754111561142457610ec16113a260075490565b10156114115760125460ff610100909104161515600114156114165781600b546113cc9190612ace565b3410156114115760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610be9565b611451565b81600c546113cc9190612ace565b600082118015611435575060058211155b6114515760405162461bcd60e51b8152600401610be9906129e9565b610caa3383611ccb565b610caa338383611d7b565b600a8054610f9090612b30565b61147d3383611adb565b6114995760405162461bcd60e51b8152600401610be990612905565b6114a584848484611e4a565b50505050565b6114b36119b4565b60005b8151811015610caa576001601360008484815181106114d7576114d7612b9c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061151381612b6b565b9150506114b6565b6115236119b4565b601280549115156101000261ff0019909216919091179055565b6000818152600260205260409020546060906001600160a01b03166115bc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610be9565b60125462010000900460ff1661165e57600a80546115d990612b30565b80601f016020809104026020016040519081016040528092919081815260200182805461160590612b30565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b50505050509050919050565b6000611668611e7d565b9050600081511161168857604051806020016040528060008152506116b6565b8061169284611e8c565b60096040516020016116a6939291906127ad565b6040516020818303038152906040525b9392505050565b6116c56119b4565b600e55565b6116d26119b4565b60125460ff16156116f55760405162461bcd60e51b8152600401610be990612a17565b610da93382611f29565b6117076119b4565b60128054911515620100000262ff000019909216919091179055565b61172b6119b4565b601055565b81600e5461173d60075490565b111561180a5760125460ff6101009091041615156001141561179a57336000908152601460205260409020546010546117768383612ab6565b11156117945760405162461bcd60e51b8152600401610be990612a4e565b506117d7565b33600090815260146020526040902054600f546117b78383612ab6565b11156117d55760405162461bcd60e51b8152600401610be990612a4e565b505b6000811180156117e957506011548111155b6118055760405162461bcd60e51b8152600401610be9906129e9565b61189b565b3360009081526014602052604090205460056118268383612ab6565b111561186c5760405162461bcd60e51b815260206004820152601560248201527446726565204d696e74204c696d697420457869742160581b6044820152606401610be9565b60008211801561187d575060058211155b6118995760405162461bcd60e51b8152600401610be9906129e9565b505b600d54816118a860075490565b6118b29190612ab6565b11156118f75760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610be9565b6118ff6119b4565b610c8a8284611ccb565b6119116119b4565b60125460ff16156119345760405162461bcd60e51b8152600401610be990612a17565b610da93382611ccb565b6119466119b4565b6001600160a01b0381166119ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610be9565b610da981611d29565b6006546001600160a01b031633146111305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610be9565b6000818152600260205260409020546001600160a01b0316610da95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610be9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611aa28261101e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ae78361101e565b9050806001600160a01b0316846001600160a01b03161480611b2e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b525750836001600160a01b0316611b4784610b4d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b6d8261101e565b6001600160a01b031614611b935760405162461bcd60e51b8152600401610be9906129a4565b6001600160a01b038216611bf55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610be9565b611c028383836001611f43565b826001600160a01b0316611c158261101e565b6001600160a01b031614611c3b5760405162461bcd60e51b8152600401610be9906129a4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610c8a57611ce4600780546001019055565b611cf683611cf160075490565b611f29565b336000908152601460205260408120805491611d1183612b6b565b91905055508080611d2190612b6b565b915050611cce565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ddd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610be9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611e55848484611b5a565b611e6184848484611fcb565b6114a55760405162461bcd60e51b8152600401610be990612952565b606060088054610aca90612b30565b60606000611e99836120d8565b600101905060008167ffffffffffffffff811115611eb957611eb9612bb2565b6040519080825280601f01601f191660200182016040528015611ee3576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611f1c57611f21565b611eed565b509392505050565b610caa8282604051806020016040528060008152506121b0565b60018111156114a5576001600160a01b03841615611f89576001600160a01b03841660009081526003602052604081208054839290611f83908490612aed565b90915550505b6001600160a01b038316156114a5576001600160a01b03831660009081526003602052604081208054839290611fc0908490612ab6565b909155505050505050565b60006001600160a01b0384163b156120cd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061200f903390899088908890600401612871565b602060405180830381600087803b15801561202957600080fd5b505af1925050508015612059575060408051601f3d908101601f19168201909252612056918101906126df565b60015b6120b3573d808015612087576040519150601f19603f3d011682016040523d82523d6000602084013e61208c565b606091505b5080516120ab5760405162461bcd60e51b8152600401610be990612952565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b52565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121175772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612143576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061216157662386f26fc10000830492506010015b6305f5e1008310612179576305f5e100830492506008015b612710831061218d57612710830492506004015b6064831061219f576064830492506002015b600a8310610ab55760010192915050565b6121ba83836121e3565b6121c76000848484611fcb565b610c8a5760405162461bcd60e51b8152600401610be990612952565b6001600160a01b0382166122395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610be9565b6000818152600260205260409020546001600160a01b03161561229e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be9565b6122ac600083836001611f43565b6000818152600260205260409020546001600160a01b0316156123115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be9565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461238890612b30565b90600052602060002090601f0160209004810192826123aa57600085556123f0565b82601f106123c357805160ff19168380011785556123f0565b828001600101855582156123f0579182015b828111156123f05782518255916020019190600101906123d5565b506123fc929150612400565b5090565b5b808211156123fc5760008155600101612401565b600067ffffffffffffffff83111561242f5761242f612bb2565b612442601f8401601f1916602001612a85565b905082815283838301111561245657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461248457600080fd5b919050565b8035801515811461248457600080fd5b6000602082840312156124ab57600080fd5b6116b68261246d565b600080604083850312156124c757600080fd5b6124d08361246d565b91506124de6020840161246d565b90509250929050565b6000806000606084860312156124fc57600080fd5b6125058461246d565b92506125136020850161246d565b9150604084013590509250925092565b6000806000806080858703121561253957600080fd5b6125428561246d565b93506125506020860161246d565b925060408501359150606085013567ffffffffffffffff81111561257357600080fd5b8501601f8101871361258457600080fd5b61259387823560208401612415565b91505092959194509250565b600080604083850312156125b257600080fd5b6125bb8361246d565b91506124de60208401612489565b600080604083850312156125dc57600080fd5b6125e58361246d565b946020939093013593505050565b6000602080838503121561260657600080fd5b823567ffffffffffffffff8082111561261e57600080fd5b818501915085601f83011261263257600080fd5b81358181111561264457612644612bb2565b8060051b9150612655848301612a85565b8181528481019084860184860187018a101561267057600080fd5b600095505b8386101561269a576126868161246d565b835260019590950194918601918601612675565b5098975050505050505050565b6000602082840312156126b957600080fd5b6116b682612489565b6000602082840312156126d457600080fd5b81356116b681612bc8565b6000602082840312156126f157600080fd5b81516116b681612bc8565b60006020828403121561270e57600080fd5b813567ffffffffffffffff81111561272557600080fd5b8201601f8101841361273657600080fd5b611b5284823560208401612415565b60006020828403121561275757600080fd5b5035919050565b6000806040838503121561277157600080fd5b823591506124de6020840161246d565b60008151808452612799816020860160208601612b04565b601f01601f19169290920160200192915050565b6000845160206127c08285838a01612b04565b8551918401916127d38184848a01612b04565b8554920191600090600181811c90808316806127f057607f831692505b85831081141561280e57634e487b7160e01b85526022600452602485fd5b808015612822576001811461283357612860565b60ff19851688528388019550612860565b60008b81526020902060005b858110156128585781548a82015290840190880161283f565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128a490830184612781565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128e6578351835292840192918401916001016128ca565b50909695505050505050565b6020815260006116b66020830184612781565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601c908201527f4d6178204e465420706572206164647265737320657863656564656400000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612aae57612aae612bb2565b604052919050565b60008219821115612ac957612ac9612b86565b500190565b6000816000190483118215151615612ae857612ae8612b86565b500290565b600082821015612aff57612aff612b86565b500390565b60005b83811015612b1f578181015183820152602001612b07565b838111156114a55750506000910152565b600181811c90821680612b4457607f821691505b60208210811415612b6557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b7f57612b7f612b86565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610da957600080fdfea2646970667358221220af0f47ea85636ad874f5c5fabd9427b561057d98ea80db47b07e9fa75b60574564736f6c63430008070033697066733a2f2f516d625a38667274746f356136435a5a7379726e65476d4571317034556f6b6743447435386b635862524d465a592f697066733a2f2f516d59366a4d553532315455524d48643772486657574b545a584832704b4a44704855736a396876674c4a4b67782f
Deployed Bytecode
0x60806040526004361061036b5760003560e01c8063715018a6116101c6578063c243c6c1116100f7578063e9058c3711610095578063f19e75d41161006f578063f19e75d4146109b1578063f2fde38b146109d1578063fa65b592146109f1578063fdea8e0b14610a2157600080fd5b8063e9058c3714610928578063e985e9c514610948578063efbd73f41461099157600080fd5b8063d004d240116100d1578063d004d240146108b2578063d5abeb01146108d2578063e08823c5146108e8578063e0a808531461090857600080fd5b8063c243c6c114610852578063c54e73e314610872578063c87b56dd1461089257600080fd5b806396bfc22911610164578063a22cb4651161013e578063a22cb465146107e7578063a45ba8e714610807578063b88d4fde1461081c578063ba7d2c761461083c57600080fd5b806396bfc229146107935780639c70b512146107b3578063a0712d68146107d457600080fd5b80638fdcf942116101a05780638fdcf9421461073257806392829d741461075257806394354fd01461076857806395d89b411461077e57600080fd5b8063715018a6146106df5780637ec4a659146106f45780638da5cb5b1461071457600080fd5b8063438b6300116102a05780635c975abb1161023e5780636905b184116102185780636905b184146106695780636d47bcab146106895780636f636e8b146106a957806370a08231146106bf57600080fd5b80635c975abb1461061a57806362b99ad4146106345780636352211e1461064957600080fd5b80634fdd43cb1161027a5780634fdd43cb146105af57806351830227146105cf5780635503a0e8146105ef5780635b70ea9f1461060457600080fd5b8063438b63001461054f578063449a52f81461057c57806347ee03941461058f57600080fd5b806318160ddd1161030d5780632a23d07d116102e75780632a23d07d146104f15780633c952764146105075780633ccfd60b1461052757806342842e0e1461052f57600080fd5b806318160ddd1461048157806318cae269146104a457806323b872dd146104d157600080fd5b8063081812fc11610349578063081812fc146103e9578063095ea7b31461042157806316ba10e01461044157806316c38b3c1461046157600080fd5b806301bf66481461037057806301ffc9a71461039257806306fdde03146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004612499565b610a40565b005b34801561039e57600080fd5b506103b26103ad3660046126c2565b610a69565b60405190151581526020015b60405180910390f35b3480156103d357600080fd5b506103dc610abb565b6040516103be91906128f2565b3480156103f557600080fd5b50610409610404366004612745565b610b4d565b6040516001600160a01b0390911681526020016103be565b34801561042d57600080fd5b5061039061043c3660046125c9565b610b74565b34801561044d57600080fd5b5061039061045c3660046126fc565b610c8f565b34801561046d57600080fd5b5061039061047c3660046126a7565b610cae565b34801561048d57600080fd5b50610496610cc9565b6040519081526020016103be565b3480156104b057600080fd5b506104966104bf366004612499565b60146020526000908152604090205481565b3480156104dd57600080fd5b506103906104ec3660046124e7565b610cd9565b3480156104fd57600080fd5b50610496600b5481565b34801561051357600080fd5b506103906105223660046126a7565b610d0a565b610390610d30565b34801561053b57600080fd5b5061039061054a3660046124e7565b610dac565b34801561055b57600080fd5b5061056f61056a366004612499565b610dc7565b6040516103be91906128ae565b61039061058a3660046125c9565b610ea8565b34801561059b57600080fd5b506103906105aa366004612499565b610f3c565b3480156105bb57600080fd5b506103906105ca3660046126fc565b610f68565b3480156105db57600080fd5b506012546103b29062010000900460ff1681565b3480156105fb57600080fd5b506103dc610f83565b34801561061057600080fd5b50610496600e5481565b34801561062657600080fd5b506012546103b29060ff1681565b34801561064057600080fd5b506103dc611011565b34801561065557600080fd5b50610409610664366004612745565b61101e565b34801561067557600080fd5b50610390610684366004612745565b61107e565b34801561069557600080fd5b506103906106a4366004612745565b61108b565b3480156106b557600080fd5b5061049660105481565b3480156106cb57600080fd5b506104966106da366004612499565b611098565b3480156106eb57600080fd5b5061039061111e565b34801561070057600080fd5b5061039061070f3660046126fc565b611132565b34801561072057600080fd5b506006546001600160a01b0316610409565b34801561073e57600080fd5b5061039061074d366004612745565b61114d565b34801561075e57600080fd5b50610496600c5481565b34801561077457600080fd5b5061049660115481565b34801561078a57600080fd5b506103dc61115a565b34801561079f57600080fd5b506103b26107ae366004612499565b611169565b3480156107bf57600080fd5b506012546103b2906301000000900460ff1681565b6103906107e2366004612745565b6111a0565b3480156107f357600080fd5b5061039061080236600461259f565b61145b565b34801561081357600080fd5b506103dc611466565b34801561082857600080fd5b50610390610837366004612523565b611473565b34801561084857600080fd5b50610496600f5481565b34801561085e57600080fd5b5061039061086d3660046125f3565b6114ab565b34801561087e57600080fd5b5061039061088d3660046126a7565b61151b565b34801561089e57600080fd5b506103dc6108ad366004612745565b61153d565b3480156108be57600080fd5b506103906108cd366004612745565b6116bd565b3480156108de57600080fd5b50610496600d5481565b3480156108f457600080fd5b50610390610903366004612745565b6116ca565b34801561091457600080fd5b506103906109233660046126a7565b6116ff565b34801561093457600080fd5b50610390610943366004612745565b611723565b34801561095457600080fd5b506103b26109633660046124b4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561099d57600080fd5b506103906109ac36600461275e565b611730565b3480156109bd57600080fd5b506103906109cc366004612745565b611909565b3480156109dd57600080fd5b506103906109ec366004612499565b61193e565b3480156109fd57600080fd5b506103b2610a0c366004612499565b60136020526000908152604090205460ff1681565b348015610a2d57600080fd5b506012546103b290610100900460ff1681565b610a486119b4565b6001600160a01b03166000908152601360205260409020805460ff19169055565b60006001600160e01b031982166380ac58cd60e01b1480610a9a57506001600160e01b03198216635b5e139f60e01b145b80610ab557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610aca90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610af690612b30565b8015610b435780601f10610b1857610100808354040283529160200191610b43565b820191906000526020600020905b815481529060010190602001808311610b2657829003601f168201915b5050505050905090565b6000610b5882611a0e565b506000908152600460205260409020546001600160a01b031690565b6000610b7f8261101e565b9050806001600160a01b0316836001600160a01b03161415610bf25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c0e5750610c0e8133610963565b610c805760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610be9565b610c8a8383611a6d565b505050565b610c976119b4565b8051610caa90600990602084019061237c565b5050565b610cb66119b4565b6012805460ff1916911515919091179055565b6000610cd460075490565b905090565b610ce33382611adb565b610cff5760405162461bcd60e51b8152600401610be990612905565b610c8a838383611b5a565b610d126119b4565b6012805491151563010000000263ff00000019909216919091179055565b610d386119b4565b6000610d4c6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610d96576040519150601f19603f3d011682016040523d82523d6000602084013e610d9b565b606091505b5050905080610da957600080fd5b50565b610c8a83838360405180602001604052806000815250611473565b60606000610dd483611098565b905060008167ffffffffffffffff811115610df157610df1612bb2565b604051908082528060200260200182016040528015610e1a578160200160208202803683370190505b509050600160005b8381108015610e335750600d548211155b15610e9e576000610e438361101e565b9050866001600160a01b0316816001600160a01b03161415610e8b5782848381518110610e7257610e72612b9c565b602090810291909101015281610e8781612b6b565b9250505b82610e9581612b6b565b93505050610e22565b5090949350505050565b73dab1a1854214684ace522439684a145e62505233338114610f325760405162461bcd60e51b815260206004820152603a60248201527f546869732066756e6374696f6e2063616e2062652063616c6c6564206279207460448201527f68652043726f73736d696e742061646472657373206f6e6c792e0000000000006064820152608401610be9565b610c8a8383611ccb565b610f446119b4565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b610f706119b4565b8051610caa90600a90602084019061237c565b60098054610f9090612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbc90612b30565b80156110095780601f10610fde57610100808354040283529160200191611009565b820191906000526020600020905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b60088054610f9090612b30565b6000818152600260205260408120546001600160a01b031680610ab55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610be9565b6110866119b4565b600c55565b6110936119b4565b600f55565b60006001600160a01b0382166111025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610be9565b506001600160a01b031660009081526003602052604090205490565b6111266119b4565b6111306000611d29565b565b61113a6119b4565b8051610caa90600890602084019061237c565b6111556119b4565b600b55565b606060018054610aca90612b30565b6001600160a01b03811660009081526013602052604081205460ff1680610ab55750506006546001600160a01b0391821691161490565b80600e546111ad60075490565b111561127a5760125460ff6101009091041615156001141561120a57336000908152601460205260409020546010546111e68383612ab6565b11156112045760405162461bcd60e51b8152600401610be990612a4e565b50611247565b33600090815260146020526040902054600f546112278383612ab6565b11156112455760405162461bcd60e51b8152600401610be990612a4e565b505b60008111801561125957506011548111155b6112755760405162461bcd60e51b8152600401610be9906129e9565b61130b565b3360009081526014602052604090205460056112968383612ab6565b11156112dc5760405162461bcd60e51b815260206004820152601560248201527446726565204d696e74204c696d697420457869742160581b6044820152606401610be9565b6000821180156112ed575060058211155b6113095760405162461bcd60e51b8152600401610be9906129e9565b505b600d548161131860075490565b6113229190612ab6565b11156113675760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610be9565b60125460ff161561138a5760405162461bcd60e51b8152600401610be990612a17565b600e54600754111561142457610ec16113a260075490565b10156114115760125460ff610100909104161515600114156114165781600b546113cc9190612ace565b3410156114115760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610be9565b611451565b81600c546113cc9190612ace565b600082118015611435575060058211155b6114515760405162461bcd60e51b8152600401610be9906129e9565b610caa3383611ccb565b610caa338383611d7b565b600a8054610f9090612b30565b61147d3383611adb565b6114995760405162461bcd60e51b8152600401610be990612905565b6114a584848484611e4a565b50505050565b6114b36119b4565b60005b8151811015610caa576001601360008484815181106114d7576114d7612b9c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061151381612b6b565b9150506114b6565b6115236119b4565b601280549115156101000261ff0019909216919091179055565b6000818152600260205260409020546060906001600160a01b03166115bc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610be9565b60125462010000900460ff1661165e57600a80546115d990612b30565b80601f016020809104026020016040519081016040528092919081815260200182805461160590612b30565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b50505050509050919050565b6000611668611e7d565b9050600081511161168857604051806020016040528060008152506116b6565b8061169284611e8c565b60096040516020016116a6939291906127ad565b6040516020818303038152906040525b9392505050565b6116c56119b4565b600e55565b6116d26119b4565b60125460ff16156116f55760405162461bcd60e51b8152600401610be990612a17565b610da93382611f29565b6117076119b4565b60128054911515620100000262ff000019909216919091179055565b61172b6119b4565b601055565b81600e5461173d60075490565b111561180a5760125460ff6101009091041615156001141561179a57336000908152601460205260409020546010546117768383612ab6565b11156117945760405162461bcd60e51b8152600401610be990612a4e565b506117d7565b33600090815260146020526040902054600f546117b78383612ab6565b11156117d55760405162461bcd60e51b8152600401610be990612a4e565b505b6000811180156117e957506011548111155b6118055760405162461bcd60e51b8152600401610be9906129e9565b61189b565b3360009081526014602052604090205460056118268383612ab6565b111561186c5760405162461bcd60e51b815260206004820152601560248201527446726565204d696e74204c696d697420457869742160581b6044820152606401610be9565b60008211801561187d575060058211155b6118995760405162461bcd60e51b8152600401610be9906129e9565b505b600d54816118a860075490565b6118b29190612ab6565b11156118f75760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610be9565b6118ff6119b4565b610c8a8284611ccb565b6119116119b4565b60125460ff16156119345760405162461bcd60e51b8152600401610be990612a17565b610da93382611ccb565b6119466119b4565b6001600160a01b0381166119ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610be9565b610da981611d29565b6006546001600160a01b031633146111305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610be9565b6000818152600260205260409020546001600160a01b0316610da95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610be9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611aa28261101e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ae78361101e565b9050806001600160a01b0316846001600160a01b03161480611b2e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b525750836001600160a01b0316611b4784610b4d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b6d8261101e565b6001600160a01b031614611b935760405162461bcd60e51b8152600401610be9906129a4565b6001600160a01b038216611bf55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610be9565b611c028383836001611f43565b826001600160a01b0316611c158261101e565b6001600160a01b031614611c3b5760405162461bcd60e51b8152600401610be9906129a4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610c8a57611ce4600780546001019055565b611cf683611cf160075490565b611f29565b336000908152601460205260408120805491611d1183612b6b565b91905055508080611d2190612b6b565b915050611cce565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611ddd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610be9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611e55848484611b5a565b611e6184848484611fcb565b6114a55760405162461bcd60e51b8152600401610be990612952565b606060088054610aca90612b30565b60606000611e99836120d8565b600101905060008167ffffffffffffffff811115611eb957611eb9612bb2565b6040519080825280601f01601f191660200182016040528015611ee3576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611f1c57611f21565b611eed565b509392505050565b610caa8282604051806020016040528060008152506121b0565b60018111156114a5576001600160a01b03841615611f89576001600160a01b03841660009081526003602052604081208054839290611f83908490612aed565b90915550505b6001600160a01b038316156114a5576001600160a01b03831660009081526003602052604081208054839290611fc0908490612ab6565b909155505050505050565b60006001600160a01b0384163b156120cd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061200f903390899088908890600401612871565b602060405180830381600087803b15801561202957600080fd5b505af1925050508015612059575060408051601f3d908101601f19168201909252612056918101906126df565b60015b6120b3573d808015612087576040519150601f19603f3d011682016040523d82523d6000602084013e61208c565b606091505b5080516120ab5760405162461bcd60e51b8152600401610be990612952565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b52565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121175772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612143576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061216157662386f26fc10000830492506010015b6305f5e1008310612179576305f5e100830492506008015b612710831061218d57612710830492506004015b6064831061219f576064830492506002015b600a8310610ab55760010192915050565b6121ba83836121e3565b6121c76000848484611fcb565b610c8a5760405162461bcd60e51b8152600401610be990612952565b6001600160a01b0382166122395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610be9565b6000818152600260205260409020546001600160a01b03161561229e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be9565b6122ac600083836001611f43565b6000818152600260205260409020546001600160a01b0316156123115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be9565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461238890612b30565b90600052602060002090601f0160209004810192826123aa57600085556123f0565b82601f106123c357805160ff19168380011785556123f0565b828001600101855582156123f0579182015b828111156123f05782518255916020019190600101906123d5565b506123fc929150612400565b5090565b5b808211156123fc5760008155600101612401565b600067ffffffffffffffff83111561242f5761242f612bb2565b612442601f8401601f1916602001612a85565b905082815283838301111561245657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461248457600080fd5b919050565b8035801515811461248457600080fd5b6000602082840312156124ab57600080fd5b6116b68261246d565b600080604083850312156124c757600080fd5b6124d08361246d565b91506124de6020840161246d565b90509250929050565b6000806000606084860312156124fc57600080fd5b6125058461246d565b92506125136020850161246d565b9150604084013590509250925092565b6000806000806080858703121561253957600080fd5b6125428561246d565b93506125506020860161246d565b925060408501359150606085013567ffffffffffffffff81111561257357600080fd5b8501601f8101871361258457600080fd5b61259387823560208401612415565b91505092959194509250565b600080604083850312156125b257600080fd5b6125bb8361246d565b91506124de60208401612489565b600080604083850312156125dc57600080fd5b6125e58361246d565b946020939093013593505050565b6000602080838503121561260657600080fd5b823567ffffffffffffffff8082111561261e57600080fd5b818501915085601f83011261263257600080fd5b81358181111561264457612644612bb2565b8060051b9150612655848301612a85565b8181528481019084860184860187018a101561267057600080fd5b600095505b8386101561269a576126868161246d565b835260019590950194918601918601612675565b5098975050505050505050565b6000602082840312156126b957600080fd5b6116b682612489565b6000602082840312156126d457600080fd5b81356116b681612bc8565b6000602082840312156126f157600080fd5b81516116b681612bc8565b60006020828403121561270e57600080fd5b813567ffffffffffffffff81111561272557600080fd5b8201601f8101841361273657600080fd5b611b5284823560208401612415565b60006020828403121561275757600080fd5b5035919050565b6000806040838503121561277157600080fd5b823591506124de6020840161246d565b60008151808452612799816020860160208601612b04565b601f01601f19169290920160200192915050565b6000845160206127c08285838a01612b04565b8551918401916127d38184848a01612b04565b8554920191600090600181811c90808316806127f057607f831692505b85831081141561280e57634e487b7160e01b85526022600452602485fd5b808015612822576001811461283357612860565b60ff19851688528388019550612860565b60008b81526020902060005b858110156128585781548a82015290840190880161283f565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128a490830184612781565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156128e6578351835292840192918401916001016128ca565b50909695505050505050565b6020815260006116b66020830184612781565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601c908201527f4d6178204e465420706572206164647265737320657863656564656400000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612aae57612aae612bb2565b604052919050565b60008219821115612ac957612ac9612b86565b500190565b6000816000190483118215151615612ae857612ae8612b86565b500290565b600082821015612aff57612aff612b86565b500390565b60005b83811015612b1f578181015183820152602001612b07565b838111156114a55750506000910152565b600181811c90821680612b4457607f821691505b60208210811415612b6557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b7f57612b7f612b86565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610da957600080fdfea2646970667358221220af0f47ea85636ad874f5c5fabd9427b561057d98ea80db47b07e9fa75b60574564736f6c63430008070033
Deployed Bytecode Sourcemap
55923:8214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63541:119;;;;;;;;;;-1:-1:-1;63541:119:0;;;;;:::i;:::-;;:::i;:::-;;40009:305;;;;;;;;;;-1:-1:-1;40009:305:0;;;;;:::i;:::-;;:::i;:::-;;;8809:14:1;;8802:22;8784:41;;8772:2;8757:18;40009:305:0;;;;;;;;40937:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42449:171::-;;;;;;;;;;-1:-1:-1;42449:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7470:32:1;;;7452:51;;7440:2;7425:18;42449:171:0;7306:203:1;41967:416:0;;;;;;;;;;-1:-1:-1;41967:416:0;;;;;:::i;:::-;;:::i;61969:106::-;;;;;;;;;;-1:-1:-1;61969:106:0;;;;;:::i;:::-;;:::i;62102:83::-;;;;;;;;;;-1:-1:-1;62102:83:0;;;;;:::i;:::-;;:::i;58166:95::-;;;;;;;;;;;;;:::i;:::-;;;17233:25:1;;;17221:2;17206:18;58166:95:0;17087:177:1;56792:55:0;;;;;;;;;;-1:-1:-1;56792:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;43149:335;;;;;;;;;;-1:-1:-1;43149:335:0;;;;;:::i;:::-;;:::i;56257:40::-;;;;;;;;;;;;;;;;63074:101;;;;;;;;;;-1:-1:-1;63074:101:0;;;;;:::i;:::-;;:::i;63817:317::-;;;:::i;43555:185::-;;;;;;;;;;-1:-1:-1;43555:185:0;;;;;:::i;:::-;;:::i;59932:685::-;;;;;;;;;;-1:-1:-1;59932:685:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59545:357::-;;;;;;:::i;:::-;;:::i;63211:113::-;;;;;;;;;;-1:-1:-1;63211:113:0;;;;;:::i;:::-;;:::i;62225:138::-;;;;;;;;;;-1:-1:-1;62225:138:0;;;;;:::i;:::-;;:::i;56650:28::-;;;;;;;;;;-1:-1:-1;56650:28:0;;;;;;;;;;;56173:33;;;;;;;;;;;;;:::i;56394:29::-;;;;;;;;;;;;;;;;56584:26;;;;;;;;;;-1:-1:-1;56584:26:0;;;;;;;;56084:82;;;;;;;;;;;;;:::i;40647:223::-;;;;;;;;;;-1:-1:-1;40647:223:0;;;;;:::i;:::-;;:::i;61379:100::-;;;;;;;;;;-1:-1:-1;61379:100:0;;;;;:::i;:::-;;:::i;61521:108::-;;;;;;;;;;-1:-1:-1;61521:108:0;;;;;:::i;:::-;;:::i;56484:46::-;;;;;;;;;;;;;;;;40378:207;;;;;;;;;;-1:-1:-1;40378:207:0;;;;;:::i;:::-;;:::i;19440:103::-;;;;;;;;;;;;;:::i;61832:106::-;;;;;;;;;;-1:-1:-1;61832:106:0;;;;;:::i;:::-;;:::i;18792:87::-;;;;;;;;;;-1:-1:-1;18865:6:0;;-1:-1:-1;;;;;18865:6:0;18792:87;;61127:94;;;;;;;;;;-1:-1:-1;61127:94:0;;;;;:::i;:::-;;:::i;56304:43::-;;;;;;;;;;;;;;;;56537:38;;;;;;;;;;;;;;;;41106:104;;;;;;;;;;;;;:::i;63668:143::-;;;;;;;;;;-1:-1:-1;63668:143:0;;;;;:::i;:::-;;:::i;56685:35::-;;;;;;;;;;-1:-1:-1;56685:35:0;;;;;;;;;;;58282:715;;;;;;:::i;:::-;;:::i;42692:155::-;;;;;;;;;;-1:-1:-1;42692:155:0;;;;;:::i;:::-;;:::i;56213:31::-;;;;;;;;;;;;;:::i;43811:322::-;;;;;;;;;;-1:-1:-1;43811:322:0;;;;;:::i;:::-;;:::i;56438:39::-;;;;;;;;;;;;;;;;63332:201;;;;;;;;;;-1:-1:-1;63332:201:0;;;;;:::i;:::-;;:::i;62391:85::-;;;;;;;;;;-1:-1:-1;62391:85:0;;;;;:::i;:::-;;:::i;60643:455::-;;;;;;;;;;-1:-1:-1;60643:455:0;;;;;:::i;:::-;;:::i;61254:93::-;;;;;;;;;;-1:-1:-1;61254:93:0;;;;;:::i;:::-;;:::i;56356:31::-;;;;;;;;;;;;;;;;59178:168;;;;;;;;;;-1:-1:-1;59178:168:0;;;;;:::i;:::-;;:::i;62505:87::-;;;;;;;;;;-1:-1:-1;62505:87:0;;;;;:::i;:::-;;:::i;61679:122::-;;;;;;;;;;-1:-1:-1;61679:122:0;;;;;:::i;:::-;;:::i;42918:164::-;;;;;;;;;;-1:-1:-1;42918:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43039:25:0;;;43015:4;43039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42918:164;59381:155;;;;;;;;;;-1:-1:-1;59381:155:0;;;;;:::i;:::-;;:::i;59005:165::-;;;;;;;;;;-1:-1:-1;59005:165:0;;;;;:::i;:::-;;:::i;19698:201::-;;;;;;;;;;-1:-1:-1;19698:201:0;;;;;:::i;:::-;;:::i;56727:56::-;;;;;;;;;;-1:-1:-1;56727:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56617:26;;;;;;;;;;-1:-1:-1;56617:26:0;;;;;;;;;;;63541:119;18678:13;:11;:13::i;:::-;-1:-1:-1;;;;;63613:31:0::1;63647:5;63613:31:::0;;;:24:::1;:31;::::0;;;;:39;;-1:-1:-1;;63613:39:0::1;::::0;;63541:119::o;40009:305::-;40111:4;-1:-1:-1;;;;;;40148:40:0;;-1:-1:-1;;;40148:40:0;;:105;;-1:-1:-1;;;;;;;40205:48:0;;-1:-1:-1;;;40205:48:0;40148:105;:158;;;-1:-1:-1;;;;;;;;;;32630:40:0;;;40270:36;40128:178;40009:305;-1:-1:-1;;40009:305:0:o;40937:100::-;40991:13;41024:5;41017:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40937:100;:::o;42449:171::-;42525:7;42545:23;42560:7;42545:14;:23::i;:::-;-1:-1:-1;42588:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42588:24:0;;42449:171::o;41967:416::-;42048:13;42064:23;42079:7;42064:14;:23::i;:::-;42048:39;;42112:5;-1:-1:-1;;;;;42106:11:0;:2;-1:-1:-1;;;;;42106:11:0;;;42098:57;;;;-1:-1:-1;;;42098:57:0;;15760:2:1;42098:57:0;;;15742:21:1;15799:2;15779:18;;;15772:30;15838:34;15818:18;;;15811:62;-1:-1:-1;;;15889:18:1;;;15882:31;15930:19;;42098:57:0;;;;;;;;;17423:10;-1:-1:-1;;;;;42190:21:0;;;;:62;;-1:-1:-1;42215:37:0;42232:5;17423:10;42918:164;:::i;42215:37::-;42168:173;;;;-1:-1:-1;;;42168:173:0;;16511:2:1;42168:173:0;;;16493:21:1;16550:2;16530:18;;;16523:30;16589:34;16569:18;;;16562:62;16660:31;16640:18;;;16633:59;16709:19;;42168:173:0;16309:425:1;42168:173:0;42354:21;42363:2;42367:7;42354:8;:21::i;:::-;42037:346;41967:416;;:::o;61969:106::-;18678:13;:11;:13::i;:::-;62045:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;61969:106:::0;:::o;62102:83::-;18678:13;:11;:13::i;:::-;62162:6:::1;:15:::0;;-1:-1:-1;;62162:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62102:83::o;58166:95::-;58210:7;58237:16;:6;964:14;;872:114;58237:16;58230:23;;58166:95;:::o;43149:335::-;43344:41;17423:10;43377:7;43344:18;:41::i;:::-;43336:99;;;;-1:-1:-1;;;43336:99:0;;;;;;;:::i;:::-;43448:28;43458:4;43464:2;43468:7;43448:9;:28::i;63074:101::-;18678:13;:11;:13::i;:::-;63143:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63143:24:0;;::::1;::::0;;;::::1;::::0;;63074:101::o;63817:317::-;18678:13;:11;:13::i;:::-;63956:7:::1;63977;18865:6:::0;;-1:-1:-1;;;;;18865:6:0;;18792:87;63977:7:::1;-1:-1:-1::0;;;;;63969:21:0::1;63998;63969:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63955:69;;;64039:2;64031:11;;;::::0;::::1;;63862:272;63817:317::o:0;43555:185::-;43693:39;43710:4;43716:2;43720:7;43693:39;;;;;;;;;;;;:16;:39::i;59932:685::-;59992:16;60021:23;60047:17;60057:6;60047:9;:17::i;:::-;60021:43;;60075:30;60122:15;60108:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60108:30:0;-1:-1:-1;60075:63:0;-1:-1:-1;60174:1:0;60149:22;60226:351;60251:15;60233;:33;:64;;;;;60288:9;;60270:14;:27;;60233:64;60226:351;;;60314:25;60342:23;60350:14;60342:7;:23::i;:::-;60314:51;;60407:6;-1:-1:-1;;;;;60386:27:0;:17;-1:-1:-1;;;;;60386:27:0;;60382:151;;;60467:14;60434:13;60448:15;60434:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;60500:17;;;;:::i;:::-;;;;60382:151;60549:16;;;;:::i;:::-;;;;60299:278;60226:351;;;-1:-1:-1;60596:13:0;;59932:685;-1:-1:-1;;;;59932:685:0:o;59545:357::-;59642:42;59713:10;:27;;59695:168;;;;-1:-1:-1;;;59695:168:0;;14980:2:1;59695:168:0;;;14962:21:1;15019:2;14999:18;;;14992:30;15058:34;15038:18;;;15031:62;15129:28;15109:18;;;15102:56;15175:19;;59695:168:0;14778:422:1;59695:168:0;59874:20;59883:2;59887:6;59874:8;:20::i;63211:113::-;18678:13;:11;:13::i;:::-;-1:-1:-1;;;;;63278:31:0::1;;::::0;;;:24:::1;:31;::::0;;;;:38;;-1:-1:-1;;63278:38:0::1;63312:4;63278:38;::::0;;63211:113::o;62225:138::-;18678:13;:11;:13::i;:::-;62317:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;56173:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56084:82::-;;;;;;;:::i;40647:223::-;40719:7;45534:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45534:16:0;;40783:56;;;;-1:-1:-1;;;40783:56:0;;15407:2:1;40783:56:0;;;15389:21:1;15446:2;15426:18;;;15419:30;-1:-1:-1;;;15465:18:1;;;15458:54;15529:18;;40783:56:0;15205:348:1;61379:100:0;18678:13;:11;:13::i;:::-;61449:14:::1;:22:::0;61379:100::o;61521:108::-;18678:13;:11;:13::i;:::-;61595:18:::1;:26:::0;61521:108::o;40378:207::-;40450:7;-1:-1:-1;;;;;40478:19:0;;40470:73;;;;-1:-1:-1;;;40470:73:0;;12373:2:1;40470:73:0;;;12355:21:1;12412:2;12392:18;;;12385:30;12451:34;12431:18;;;12424:62;-1:-1:-1;;;12502:18:1;;;12495:39;12551:19;;40470:73:0;12171:405:1;40470:73:0;-1:-1:-1;;;;;;40561:16:0;;;;;:9;:16;;;;;;;40378:207::o;19440:103::-;18678:13;:11;:13::i;:::-;19505:30:::1;19532:1;19505:18;:30::i;:::-;19440:103::o:0;61832:106::-;18678:13;:11;:13::i;:::-;61908:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;61127:94::-:0;18678:13;:11;:13::i;:::-;61194:11:::1;:19:::0;61127:94::o;41106:104::-;41162:13;41195:7;41188:14;;;;;:::i;63668:143::-;-1:-1:-1;;;;;63751:31:0;;63727:4;63751:31;;;:24;:31;;;;;;;;;:52;;-1:-1:-1;;18865:6:0;;-1:-1:-1;;;;;63787:16:0;;;18865:6;;63787:16;;63668:143::o;58282:715::-;58347:11;57108:8;;57089:16;:6;964:14;;872:114;57089:16;:27;57086:945;;;57143:7;;;;;;;;:15;;:7;:15;57140:483;;;57236:10;57188:24;57215:32;;;:20;:32;;;;;;57316:25;;57282:30;57301:11;57215:32;57282:30;:::i;:::-;:59;;57274:100;;;;-1:-1:-1;;;57274:100:0;;;;;;;:::i;:::-;57161:237;57140:483;;;57474:10;57426:24;57453:32;;;:20;:32;;;;;;57550:18;;57516:30;57535:11;57453:32;57516:30;:::i;:::-;:52;;57508:93;;;;-1:-1:-1;;;57508:93:0;;;;;;;:::i;:::-;57403:220;57140:483;57665:1;57651:11;:15;:52;;;;;57685:18;;57670:11;:33;;57651:52;57643:85;;;;-1:-1:-1;;;57643:85:0;;;;;;;:::i;:::-;57086:945;;;57829:10;57781:24;57808:32;;;:20;:32;;;;;;57901:1;57867:30;57886:11;57808:32;57867:30;:::i;:::-;:35;;57859:69;;;;-1:-1:-1;;;57859:69:0;;12783:2:1;57859:69:0;;;12765:21:1;12822:2;12802:18;;;12795:30;-1:-1:-1;;;12841:18:1;;;12834:51;12902:18;;57859:69:0;12581:345:1;57859:69:0;57969:1;57955:11;:15;:35;;;;;57989:1;57974:11;:16;;57955:35;57947:68;;;;-1:-1:-1;;;57947:68:0;;;;;;;:::i;:::-;57762:269;57086:945;58083:9;;58068:11;58049:16;:6;964:14;;872:114;58049:16;:30;;;;:::i;:::-;:43;;58041:76;;;;-1:-1:-1;;;58041:76:0;;16162:2:1;58041:76:0;;;16144:21:1;16201:2;16181:18;;;16174:30;-1:-1:-1;;;16220:18:1;;;16213:50;16280:18;;58041:76:0;15960:344:1;58041:76:0;58380:6:::1;::::0;::::1;;58379:7;58371:43;;;;-1:-1:-1::0;;;58371:43:0::1;;;;;;;:::i;:::-;58453:8;::::0;58434:6:::1;964:14:::0;58434:27:::1;58431:513;;;58503:4;58484:16;:6;964:14:::0;;872:114;58484:16:::1;:23;58481:340;;;58534:7;::::0;::::1;;::::0;;::::1;;:15;;:7;:15;58531:271;;;58613:11;58599;;:25;;;;:::i;:::-;58586:9;:38;;58578:70;;;::::0;-1:-1:-1;;;58578:70:0;;16941:2:1;58578:70:0::1;::::0;::::1;16923:21:1::0;16980:2;16960:18;;;16953:30;-1:-1:-1;;;16999:18:1;;;16992:49;17058:18;;58578:70:0::1;16739:343:1::0;58578:70:0::1;58431:513;;58531:271;58743:11;58726:14;;:28;;;;:::i;58431:513::-;58881:1;58867:11;:15;:35;;;;;58901:1;58886:11;:16;;58867:35;58859:69;;;;-1:-1:-1::0;;;58859:69:0::1;;;;;;;:::i;:::-;58956:33;58965:10;58977:11;58956:8;:33::i;42692:155::-:0;42787:52;17423:10;42820:8;42830;42787:18;:52::i;56213:31::-;;;;;;;:::i;43811:322::-;43985:41;17423:10;44018:7;43985:18;:41::i;:::-;43977:99;;;;-1:-1:-1;;;43977:99:0;;;;;;;:::i;:::-;44087:38;44101:4;44107:2;44111:7;44120:4;44087:13;:38::i;:::-;43811:322;;;;:::o;63332:201::-;18678:13;:11;:13::i;:::-;63419:9:::1;63414:112;63436:6;:13;63433:1;:16;63414:112;;;63509:4;63471:24;:35;63496:6;63503:1;63496:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;63471:35:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;63471:35:0;:42;;-1:-1:-1;;63471:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63451:3;::::1;::::0;::::1;:::i;:::-;;;;63414:112;;62391:85:::0;18678:13;:11;:13::i;:::-;62452:7:::1;:16:::0;;;::::1;;;;-1:-1:-1::0;;62452:16:0;;::::1;::::0;;;::::1;::::0;;62391:85::o;60643:455::-;45936:4;45534:16;;;:7;:16;;;;;;60717:13;;-1:-1:-1;;;;;45534:16:0;60743:77;;;;-1:-1:-1;;;60743:77:0;;14207:2:1;60743:77:0;;;14189:21:1;14246:2;14226:18;;;14219:30;14285:34;14265:18;;;14258:62;-1:-1:-1;;;14336:18:1;;;14329:45;14391:19;;60743:77:0;14005:411:1;60743:77:0;60837:8;;;;;;;60833:74;;60878:17;60871:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60643:455;;;:::o;60833:74::-;60919:28;60950:10;:8;:10::i;:::-;60919:41;;61009:1;60984:14;60978:28;:32;:112;;;;;;;;;;;;;;;;;61037:14;61053:19;:8;:17;:19::i;:::-;61074:9;61020:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60978:112;60971:119;60643:455;-1:-1:-1;;;60643:455:0:o;61254:93::-;18678:13;:11;:13::i;:::-;61323:8:::1;:16:::0;61254:93::o;59178:168::-;18678:13;:11;:13::i;:::-;59260:6:::1;::::0;::::1;;59259:7;59251:43;;;;-1:-1:-1::0;;;59251:43:0::1;;;;;;;:::i;:::-;59307:31;59317:10;59329:8;59307:9;:31::i;62505:87::-:0;18678:13;:11;:13::i;:::-;62567:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62567:17:0;;::::1;::::0;;;::::1;::::0;;62505:87::o;61679:122::-;18678:13;:11;:13::i;:::-;61760:25:::1;:33:::0;61679:122::o;59381:155::-;59465:10;57108:8;;57089:16;:6;964:14;;872:114;57089:16;:27;57086:945;;;57143:7;;;;;;;;:15;;:7;:15;57140:483;;;57236:10;57188:24;57215:32;;;:20;:32;;;;;;57316:25;;57282:30;57301:11;57215:32;57282:30;:::i;:::-;:59;;57274:100;;;;-1:-1:-1;;;57274:100:0;;;;;;;:::i;:::-;57161:237;57140:483;;;57474:10;57426:24;57453:32;;;:20;:32;;;;;;57550:18;;57516:30;57535:11;57453:32;57516:30;:::i;:::-;:52;;57508:93;;;;-1:-1:-1;;;57508:93:0;;;;;;;:::i;:::-;57403:220;57140:483;57665:1;57651:11;:15;:52;;;;;57685:18;;57670:11;:33;;57651:52;57643:85;;;;-1:-1:-1;;;57643:85:0;;;;;;;:::i;:::-;57086:945;;;57829:10;57781:24;57808:32;;;:20;:32;;;;;;57901:1;57867:30;57886:11;57808:32;57867:30;:::i;:::-;:35;;57859:69;;;;-1:-1:-1;;;57859:69:0;;12783:2:1;57859:69:0;;;12765:21:1;12822:2;12802:18;;;12795:30;-1:-1:-1;;;12841:18:1;;;12834:51;12902:18;;57859:69:0;12581:345:1;57859:69:0;57969:1;57955:11;:15;:35;;;;;57989:1;57974:11;:16;;57955:35;57947:68;;;;-1:-1:-1;;;57947:68:0;;;;;;;:::i;:::-;57762:269;57086:945;58083:9;;58068:11;58049:16;:6;964:14;;872:114;58049:16;:30;;;;:::i;:::-;:43;;58041:76;;;;-1:-1:-1;;;58041:76:0;;16162:2:1;58041:76:0;;;16144:21:1;16201:2;16181:18;;;16174:30;-1:-1:-1;;;16220:18:1;;;16213:50;16280:18;;58041:76:0;15960:344:1;58041:76:0;18678:13:::1;:11;:13::i;:::-;59498:30:::2;59507:8;59517:10;59498:8;:30::i;59005:165::-:0;18678:13;:11;:13::i;:::-;59082:6:::1;::::0;::::1;;59081:7;59073:43;;;;-1:-1:-1::0;;;59073:43:0::1;;;;;;;:::i;:::-;59129:33;59138:10;59150:11;59129:8;:33::i;19698:201::-:0;18678:13;:11;:13::i;:::-;-1:-1:-1;;;;;19787:22:0;::::1;19779:73;;;::::0;-1:-1:-1;;;19779:73:0;;10095:2:1;19779:73:0::1;::::0;::::1;10077:21:1::0;10134:2;10114:18;;;10107:30;10173:34;10153:18;;;10146:62;-1:-1:-1;;;10224:18:1;;;10217:36;10270:19;;19779:73:0::1;9893:402:1::0;19779:73:0::1;19863:28;19882:8;19863:18;:28::i;18957:132::-:0;18865:6;;-1:-1:-1;;;;;18865:6:0;17423:10;19021:23;19013:68;;;;-1:-1:-1;;;19013:68:0;;13494:2:1;19013:68:0;;;13476:21:1;;;13513:18;;;13506:30;13572:34;13552:18;;;13545:62;13624:18;;19013:68:0;13292:356:1;52268:135:0;45936:4;45534:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45534:16:0;52342:53;;;;-1:-1:-1;;;52342:53:0;;15407:2:1;52342:53:0;;;15389:21:1;15446:2;15426:18;;;15419:30;-1:-1:-1;;;15465:18:1;;;15458:54;15529:18;;52342:53:0;15205:348:1;51547:174:0;51622:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51622:29:0;-1:-1:-1;;;;;51622:29:0;;;;;;;;:24;;51676:23;51622:24;51676:14;:23::i;:::-;-1:-1:-1;;;;;51667:46:0;;;;;;;;;;;51547:174;;:::o;46166:264::-;46259:4;46276:13;46292:23;46307:7;46292:14;:23::i;:::-;46276:39;;46345:5;-1:-1:-1;;;;;46334:16:0;:7;-1:-1:-1;;;;;46334:16:0;;:52;;;-1:-1:-1;;;;;;43039:25:0;;;43015:4;43039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46354:32;46334:87;;;;46414:7;-1:-1:-1;;;;;46390:31:0;:20;46402:7;46390:11;:20::i;:::-;-1:-1:-1;;;;;46390:31:0;;46334:87;46326:96;46166:264;-1:-1:-1;;;;46166:264:0:o;50165:1263::-;50324:4;-1:-1:-1;;;;;50297:31:0;:23;50312:7;50297:14;:23::i;:::-;-1:-1:-1;;;;;50297:31:0;;50289:81;;;;-1:-1:-1;;;50289:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50389:16:0;;50381:65;;;;-1:-1:-1;;;50381:65:0;;11614:2:1;50381:65:0;;;11596:21:1;11653:2;11633:18;;;11626:30;11692:34;11672:18;;;11665:62;-1:-1:-1;;;11743:18:1;;;11736:34;11787:19;;50381:65:0;11412:400:1;50381:65:0;50459:42;50480:4;50486:2;50490:7;50499:1;50459:20;:42::i;:::-;50631:4;-1:-1:-1;;;;;50604:31:0;:23;50619:7;50604:14;:23::i;:::-;-1:-1:-1;;;;;50604:31:0;;50596:81;;;;-1:-1:-1;;;50596:81:0;;;;;;;:::i;:::-;50749:24;;;;:15;:24;;;;;;;;50742:31;;-1:-1:-1;;;;;;50742:31:0;;;;;;-1:-1:-1;;;;;51225:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;51225:20:0;;;51260:13;;;;;;;;;:18;;50742:31;51260:18;;;51300:16;;;:7;:16;;;;;;:21;;;;;;;;;;51339:27;;50765:7;;51339:27;;;42037:346;41967:416;;:::o;62618:284::-;62700:9;62695:200;62719:11;62715:1;:15;62695:200;;;62752:18;:6;1083:19;;1101:1;1083:19;;;994:127;62752:18;62795:37;62805:8;62815:16;:6;964:14;;872:114;62815:16;62795:9;:37::i;:::-;62870:10;62849:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;;;62732:3;;;;;:::i;:::-;;;;62695:200;;20059:191;20152:6;;;-1:-1:-1;;;;;20169:17:0;;;-1:-1:-1;;;;;;20169:17:0;;;;;;;20202:40;;20152:6;;;20169:17;20152:6;;20202:40;;20133:16;;20202:40;20122:128;20059:191;:::o;51864:315::-;52019:8;-1:-1:-1;;;;;52010:17:0;:5;-1:-1:-1;;;;;52010:17:0;;;52002:55;;;;-1:-1:-1;;;52002:55:0;;12019:2:1;52002:55:0;;;12001:21:1;12058:2;12038:18;;;12031:30;12097:27;12077:18;;;12070:55;12142:18;;52002:55:0;11817:349:1;52002:55:0;-1:-1:-1;;;;;52068:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52068:46:0;;;;;;;;;;52130:41;;8784::1;;;52130::0;;8757:18:1;52130:41:0;;;;;;;51864:315;;;:::o;45014:313::-;45170:28;45180:4;45186:2;45190:7;45170:9;:28::i;:::-;45217:47;45240:4;45246:2;45250:7;45259:4;45217:22;:47::i;:::-;45209:110;;;;-1:-1:-1;;;45209:110:0;;;;;;;:::i;62927:::-;62987:13;63020:9;63013:16;;;;;:::i;14770:716::-;14826:13;14877:14;14894:17;14905:5;14894:10;:17::i;:::-;14914:1;14894:21;14877:38;;14930:20;14964:6;14953:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14953:18:0;-1:-1:-1;14930:41:0;-1:-1:-1;15095:28:0;;;15111:2;15095:28;15152:288;-1:-1:-1;;15184:5:0;-1:-1:-1;;;15321:2:0;15310:14;;15305:30;15184:5;15292:44;15382:2;15373:11;;;-1:-1:-1;15407:10:0;15403:21;;15419:5;;15403:21;15152:288;;;-1:-1:-1;15461:6:0;14770:716;-1:-1:-1;;;14770:716:0:o;46772:110::-;46848:26;46858:2;46862:7;46848:26;;;;;;;;;;;;:9;:26::i;54552:410::-;54742:1;54730:9;:13;54726:229;;;-1:-1:-1;;;;;54764:18:0;;;54760:87;;-1:-1:-1;;;;;54803:15:0;;;;;;:9;:15;;;;;:28;;54822:9;;54803:15;:28;;54822:9;;54803:28;:::i;:::-;;;;-1:-1:-1;;54760:87:0;-1:-1:-1;;;;;54865:16:0;;;54861:83;;-1:-1:-1;;;;;54902:13:0;;;;;;:9;:13;;;;;:26;;54919:9;;54902:13;:26;;54919:9;;54902:26;:::i;:::-;;;;-1:-1:-1;;54552:410:0;;;;:::o;52967:853::-;53121:4;-1:-1:-1;;;;;53142:13:0;;21785:19;:23;53138:675;;53178:71;;-1:-1:-1;;;53178:71:0;;-1:-1:-1;;;;;53178:36:0;;;;;:71;;17423:10;;53229:4;;53235:7;;53244:4;;53178:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53178:71:0;;;;;;;;-1:-1:-1;;53178:71:0;;;;;;;;;;;;:::i;:::-;;;53174:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53419:13:0;;53415:328;;53462:60;;-1:-1:-1;;;53462:60:0;;;;;;;:::i;53415:328::-;53693:6;53687:13;53678:6;53674:2;53670:15;53663:38;53174:584;-1:-1:-1;;;;;;53300:51:0;-1:-1:-1;;;53300:51:0;;-1:-1:-1;53293:58:0;;53138:675;-1:-1:-1;53797:4:0;52967:853;;;;;;:::o;11636:922::-;11689:7;;-1:-1:-1;;;11767:15:0;;11763:102;;-1:-1:-1;;;11803:15:0;;;-1:-1:-1;11847:2:0;11837:12;11763:102;11892:6;11883:5;:15;11879:102;;11928:6;11919:15;;;-1:-1:-1;11963:2:0;11953:12;11879:102;12008:6;11999:5;:15;11995:102;;12044:6;12035:15;;;-1:-1:-1;12079:2:0;12069:12;11995:102;12124:5;12115;:14;12111:99;;12159:5;12150:14;;;-1:-1:-1;12193:1:0;12183:11;12111:99;12237:5;12228;:14;12224:99;;12272:5;12263:14;;;-1:-1:-1;12306:1:0;12296:11;12224:99;12350:5;12341;:14;12337:99;;12385:5;12376:14;;;-1:-1:-1;12419:1:0;12409:11;12337:99;12463:5;12454;:14;12450:66;;12499:1;12489:11;12544:6;11636:922;-1:-1:-1;;11636:922:0:o;47109:319::-;47238:18;47244:2;47248:7;47238:5;:18::i;:::-;47289:53;47320:1;47324:2;47328:7;47337:4;47289:22;:53::i;:::-;47267:153;;;;-1:-1:-1;;;47267:153:0;;;;;;;:::i;47764:942::-;-1:-1:-1;;;;;47844:16:0;;47836:61;;;;-1:-1:-1;;;47836:61:0;;13133:2:1;47836:61:0;;;13115:21:1;;;13152:18;;;13145:30;13211:34;13191:18;;;13184:62;13263:18;;47836:61:0;12931:356:1;47836:61:0;45936:4;45534:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45534:16:0;45960:31;47908:58;;;;-1:-1:-1;;;47908:58:0;;10908:2:1;47908:58:0;;;10890:21:1;10947:2;10927:18;;;10920:30;10986;10966:18;;;10959:58;11034:18;;47908:58:0;10706:352:1;47908:58:0;47979:48;48008:1;48012:2;48016:7;48025:1;47979:20;:48::i;:::-;45936:4;45534:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45534:16:0;45960:31;48117:58;;;;-1:-1:-1;;;48117:58:0;;10908:2:1;48117:58:0;;;10890:21:1;10947:2;10927:18;;;10920:30;10986;10966:18;;;10959:58;11034:18;;48117:58:0;10706:352:1;48117:58:0;-1:-1:-1;;;;;48524:13:0;;;;;;:9;:13;;;;;;;;:18;;48541:1;48524:18;;;48566:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48566:21:0;;;;;48605:33;48574:7;;48524:13;;48605:33;;48524:13;;48605:33;62045:22:::1;61969:106:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:963::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2989:18;3030:2;3022:6;3019:14;3016:34;;;3046:1;3043;3036:12;3016:34;3084:6;3073:9;3069:22;3059:32;;3129:7;3122:4;3118:2;3114:13;3110:27;3100:55;;3151:1;3148;3141:12;3100:55;3187:2;3174:16;3209:2;3205;3202:10;3199:36;;;3215:18;;:::i;:::-;3261:2;3258:1;3254:10;3244:20;;3284:28;3308:2;3304;3300:11;3284:28;:::i;:::-;3346:15;;;3377:12;;;;3409:11;;;3439;;;3435:20;;3432:33;-1:-1:-1;3429:53:1;;;3478:1;3475;3468:12;3429:53;3500:1;3491:10;;3510:169;3524:2;3521:1;3518:9;3510:169;;;3581:23;3600:3;3581:23;:::i;:::-;3569:36;;3542:1;3535:9;;;;;3625:12;;;;3657;;3510:169;;;-1:-1:-1;3698:5:1;2746:963;-1:-1:-1;;;;;;;;2746:963:1:o;3714:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3862:26;3878:9;3862:26;:::i;3899:245::-;3957:6;4010:2;3998:9;3989:7;3985:23;3981:32;3978:52;;;4026:1;4023;4016:12;3978:52;4065:9;4052:23;4084:30;4108:5;4084:30;:::i;4149:249::-;4218:6;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4319:9;4313:16;4338:30;4362:5;4338:30;:::i;4403:450::-;4472:6;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4581:9;4568:23;4614:18;4606:6;4603:30;4600:50;;;4646:1;4643;4636:12;4600:50;4669:22;;4722:4;4714:13;;4710:27;-1:-1:-1;4700:55:1;;4751:1;4748;4741:12;4700:55;4774:73;4839:7;4834:2;4821:16;4816:2;4812;4808:11;4774:73;:::i;4858:180::-;4917:6;4970:2;4958:9;4949:7;4945:23;4941:32;4938:52;;;4986:1;4983;4976:12;4938:52;-1:-1:-1;5009:23:1;;4858:180;-1:-1:-1;4858:180:1:o;5043:254::-;5111:6;5119;5172:2;5160:9;5151:7;5147:23;5143:32;5140:52;;;5188:1;5185;5178:12;5140:52;5224:9;5211:23;5201:33;;5253:38;5287:2;5276:9;5272:18;5253:38;:::i;5302:257::-;5343:3;5381:5;5375:12;5408:6;5403:3;5396:19;5424:63;5480:6;5473:4;5468:3;5464:14;5457:4;5450:5;5446:16;5424:63;:::i;:::-;5541:2;5520:15;-1:-1:-1;;5516:29:1;5507:39;;;;5548:4;5503:50;;5302:257;-1:-1:-1;;5302:257:1:o;5564:1527::-;5788:3;5826:6;5820:13;5852:4;5865:51;5909:6;5904:3;5899:2;5891:6;5887:15;5865:51;:::i;:::-;5979:13;;5938:16;;;;6001:55;5979:13;5938:16;6023:15;;;6001:55;:::i;:::-;6145:13;;6078:20;;;6118:1;;6205;6227:18;;;;6280;;;;6307:93;;6385:4;6375:8;6371:19;6359:31;;6307:93;6448:2;6438:8;6435:16;6415:18;6412:40;6409:167;;;-1:-1:-1;;;6475:33:1;;6531:4;6528:1;6521:15;6561:4;6482:3;6549:17;6409:167;6592:18;6619:110;;;;6743:1;6738:328;;;;6585:481;;6619:110;-1:-1:-1;;6654:24:1;;6640:39;;6699:20;;;;-1:-1:-1;6619:110:1;;6738:328;17622:1;17615:14;;;17659:4;17646:18;;6833:1;6847:169;6861:8;6858:1;6855:15;6847:169;;;6943:14;;6928:13;;;6921:37;6986:16;;;;6878:10;;6847:169;;;6851:3;;7047:8;7040:5;7036:20;7029:27;;6585:481;-1:-1:-1;7082:3:1;;5564:1527;-1:-1:-1;;;;;;;;;;;5564:1527:1:o;7514:488::-;-1:-1:-1;;;;;7783:15:1;;;7765:34;;7835:15;;7830:2;7815:18;;7808:43;7882:2;7867:18;;7860:34;;;7930:3;7925:2;7910:18;;7903:31;;;7708:4;;7951:45;;7976:19;;7968:6;7951:45;:::i;:::-;7943:53;7514:488;-1:-1:-1;;;;;;7514:488:1:o;8007:632::-;8178:2;8230:21;;;8300:13;;8203:18;;;8322:22;;;8149:4;;8178:2;8401:15;;;;8375:2;8360:18;;;8149:4;8444:169;8458:6;8455:1;8452:13;8444:169;;;8519:13;;8507:26;;8588:15;;;;8553:12;;;;8480:1;8473:9;8444:169;;;-1:-1:-1;8630:3:1;;8007:632;-1:-1:-1;;;;;;8007:632:1:o;8836:219::-;8985:2;8974:9;8967:21;8948:4;9005:44;9045:2;9034:9;9030:18;9022:6;9005:44;:::i;9060:409::-;9262:2;9244:21;;;9301:2;9281:18;;;9274:30;9340:34;9335:2;9320:18;;9313:62;-1:-1:-1;;;9406:2:1;9391:18;;9384:43;9459:3;9444:19;;9060:409::o;9474:414::-;9676:2;9658:21;;;9715:2;9695:18;;;9688:30;9754:34;9749:2;9734:18;;9727:62;-1:-1:-1;;;9820:2:1;9805:18;;9798:48;9878:3;9863:19;;9474:414::o;10300:401::-;10502:2;10484:21;;;10541:2;10521:18;;;10514:30;10580:34;10575:2;10560:18;;10553:62;-1:-1:-1;;;10646:2:1;10631:18;;10624:35;10691:3;10676:19;;10300:401::o;11063:344::-;11265:2;11247:21;;;11304:2;11284:18;;;11277:30;-1:-1:-1;;;11338:2:1;11323:18;;11316:50;11398:2;11383:18;;11063:344::o;13653:347::-;13855:2;13837:21;;;13894:2;13874:18;;;13867:30;13933:25;13928:2;13913:18;;13906:53;13991:2;13976:18;;13653:347::o;14421:352::-;14623:2;14605:21;;;14662:2;14642:18;;;14635:30;14701;14696:2;14681:18;;14674:58;14764:2;14749:18;;14421:352::o;17269:275::-;17340:2;17334:9;17405:2;17386:13;;-1:-1:-1;;17382:27:1;17370:40;;17440:18;17425:34;;17461:22;;;17422:62;17419:88;;;17487:18;;:::i;:::-;17523:2;17516:22;17269:275;;-1:-1:-1;17269:275:1:o;17675:128::-;17715:3;17746:1;17742:6;17739:1;17736:13;17733:39;;;17752:18;;:::i;:::-;-1:-1:-1;17788:9:1;;17675:128::o;17808:168::-;17848:7;17914:1;17910;17906:6;17902:14;17899:1;17896:21;17891:1;17884:9;17877:17;17873:45;17870:71;;;17921:18;;:::i;:::-;-1:-1:-1;17961:9:1;;17808:168::o;17981:125::-;18021:4;18049:1;18046;18043:8;18040:34;;;18054:18;;:::i;:::-;-1:-1:-1;18091:9:1;;17981:125::o;18111:258::-;18183:1;18193:113;18207:6;18204:1;18201:13;18193:113;;;18283:11;;;18277:18;18264:11;;;18257:39;18229:2;18222:10;18193:113;;;18324:6;18321:1;18318:13;18315:48;;;-1:-1:-1;;18359:1:1;18341:16;;18334:27;18111:258::o;18374:380::-;18453:1;18449:12;;;;18496;;;18517:61;;18571:4;18563:6;18559:17;18549:27;;18517:61;18624:2;18616:6;18613:14;18593:18;18590:38;18587:161;;;18670:10;18665:3;18661:20;18658:1;18651:31;18705:4;18702:1;18695:15;18733:4;18730:1;18723:15;18587:161;;18374:380;;;:::o;18759:135::-;18798:3;-1:-1:-1;;18819:17:1;;18816:43;;;18839:18;;:::i;:::-;-1:-1:-1;18886:1:1;18875:13;;18759:135::o;18899:127::-;18960:10;18955:3;18951:20;18948:1;18941:31;18991:4;18988:1;18981:15;19015:4;19012:1;19005:15;19163:127;19224:10;19219:3;19215:20;19212:1;19205:31;19255:4;19252:1;19245:15;19279:4;19276:1;19269:15;19295:127;19356:10;19351:3;19347:20;19344:1;19337:31;19387:4;19384:1;19377:15;19411:4;19408:1;19401:15;19427:131;-1:-1:-1;;;;;;19501:32:1;;19491:43;;19481:71;;19548:1;19545;19538:12
Swarm Source
ipfs://af0f47ea85636ad874f5c5fabd9427b561057d98ea80db47b07e9fa75b605745
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.