ERC-721
Overview
Max Total Supply
2 OA
Holders
1
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
OnchainApePunks
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-09 */ // SPDX-License-Identifier: MIT // File: Punk Mint Contract/Extras.sol pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: Extra/StringUtils.sol pragma solidity ^0.8.0; /** * Strings Library * * In summary this is a simple library of string functions which make simple * string operations less tedious in solidity. * * Please be aware these functions can be quite gas heavy so use them only when * necessary not to clog the blockchain with expensive transactions. * * @author James Lockhart <[email protected]> */ library StringUtils { /** * Concat (High gas cost) * * Appends two strings together and returns a new value * * @param _base When being used for a data type this is the extended object * otherwise this is the string which will be the concatenated * prefix * @param _value The value to be the concatenated suffix * @return string The resulting string from combinging the base and value */ function concat(string memory _base, string memory _value) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length > 0); string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); bytes memory _newValue = bytes(_tmpValue); uint i; uint j; for (i = 0; i < _baseBytes.length; i++) { _newValue[j++] = _baseBytes[i]; } for (i = 0; i < _valueBytes.length; i++) { _newValue[j++] = _valueBytes[i]; } return string(_newValue); } /** * Index Of * * Locates and returns the position of a character within a string * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function indexOf(string memory _base, string memory _value) internal pure returns (int) { return _indexOf(_base, _value, 0); } /** * Index Of * * Locates and returns the position of a character within a string starting * from a defined offset * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @param _offset The starting point to start searching from which can start * from 0, but must not exceed the length of the string * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function _indexOf(string memory _base, string memory _value, uint _offset) internal pure returns (int) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length == 1); for (uint i = _offset; i < _baseBytes.length; i++) { if (_baseBytes[i] == _valueBytes[0]) { return int(i); } } return -1; } /** * Length * * Returns the length of the specified string * * @param _base When being used for a data type this is the extended object * otherwise this is the string to be measured * @return uint The length of the passed string */ function length(string memory _base) internal pure returns (uint) { bytes memory _baseBytes = bytes(_base); return _baseBytes.length; } /** * Sub String * * Extracts the beginning part of a string based on the desired length * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @return string The extracted sub string */ function substring(string memory _base, int _length) internal pure returns (string memory) { return _substring(_base, _length, 0); } /** * Sub String * * Extracts the part of a string based on the desired length and offset. The * offset and length must not exceed the lenth of the base string. * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @param _offset The starting point to extract the sub string from * @return string The extracted sub string */ function _substring(string memory _base, int _length, int _offset) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); assert(uint(_offset + _length) <= _baseBytes.length); string memory _tmp = new string(uint(_length)); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = uint(_offset); i < uint(_offset + _length); i++) { _tmpBytes[j++] = _baseBytes[i]; } return string(_tmpBytes); } function split(string memory _base, string memory _value) internal pure returns (string[] memory splitArr) { bytes memory _baseBytes = bytes(_base); uint _offset = 0; uint _splitsCount = 1; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == -1) break; else { _splitsCount++; _offset = uint(_limit) + 1; } } splitArr = new string[](_splitsCount); _offset = 0; _splitsCount = 0; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == - 1) { _limit = int(_baseBytes.length); } string memory _tmp = new string(uint(_limit) - _offset); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = _offset; i < uint(_limit); i++) { _tmpBytes[j++] = _baseBytes[i]; } _offset = uint(_limit) + 1; splitArr[_splitsCount++] = string(_tmpBytes); } return splitArr; } /** * Compare To * * Compares the characters of two strings, to ensure that they have an * identical footprint * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent */ function compareTo(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i]) { return false; } } return true; } /** * Compare To Ignore Case (High gas cost) * * Compares the characters of two strings, converting them to the same case * where applicable to alphabetic characters to distinguish if the values * match. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent value * discarding case */ function compareToIgnoreCase(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i] && _upper(_baseBytes[i]) != _upper(_valueBytes[i])) { return false; } } return true; } /** * Upper * * Converts all the values of a string to their corresponding upper case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to upper case * @return string */ function upper(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _upper(_baseBytes[i]); } return string(_baseBytes); } /** * Lower * * Converts all the values of a string to their corresponding lower case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to lower case * @return string */ function lower(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _lower(_baseBytes[i]); } return string(_baseBytes); } /** * Upper * * Convert an alphabetic character to upper case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to upper case * @return bytes1 The converted value if the passed value was alphabetic * and in a lower case otherwise returns the original value */ function _upper(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x61 && _b1 <= 0x7A) { return bytes1(uint8(_b1) - 32); } return _b1; } /** * Lower * * Convert an alphabetic character to lower case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to lower case * @return bytes1 The converted value if the passed value was alphabetic * and in a upper case otherwise returns the original value */ function _lower(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x41 && _b1 <= 0x5A) { return bytes1(uint8(_b1) + 32); } return _b1; } } // File: Extra/DynamicBuffer.sol // Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier) pragma solidity >=0.8.0; /// @title DynamicBuffer /// @author David Huber (@cxkoda) and Simon Fremaux (@dievardump). See also /// https://raw.githubusercontent.com/dievardump/solidity-dynamic-buffer /// @notice This library is used to allocate a big amount of container memory // which will be subsequently filled without needing to reallocate /// memory. /// @dev First, allocate memory. /// Then use `buffer.appendUnchecked(theBytes)` or `appendSafe()` if /// bounds checking is required. library DynamicBuffer { /// @notice Allocates container space for the DynamicBuffer /// @param capacity The intended max amount of bytes in the buffer /// @return buffer The memory location of the buffer /// @dev Allocates `capacity + 0x60` bytes of space /// The buffer array starts at the first container data position, /// (i.e. `buffer = container + 0x20`) function allocate(uint256 capacity) internal pure returns (bytes memory buffer) { assembly { // Get next-free memory address let container := mload(0x40) // Allocate memory by setting a new next-free address { // Add 2 x 32 bytes in size for the two length fields // Add 32 bytes safety space for 32B chunked copy let size := add(capacity, 0x60) let newNextFree := add(container, size) mstore(0x40, newNextFree) } // Set the correct container length { let length := add(capacity, 0x40) mstore(container, length) } // The buffer starts at idx 1 in the container (0 is length) buffer := add(container, 0x20) // Init content with length 0 mstore(buffer, 0) } return buffer; } /// @notice Appends data to buffer, and update buffer length /// @param buffer the buffer to append the data to /// @param data the data to append /// @dev Does not perform out-of-bound checks (container capacity) /// for efficiency. function appendUnchecked(bytes memory buffer, bytes memory data) internal pure { assembly { let length := mload(data) for { data := add(data, 0x20) let dataEnd := add(data, length) let copyTo := add(buffer, add(mload(buffer), 0x20)) } lt(data, dataEnd) { data := add(data, 0x20) copyTo := add(copyTo, 0x20) } { // Copy 32B chunks from data to buffer. // This may read over data array boundaries and copy invalid // bytes, which doesn't matter in the end since we will // later set the correct buffer length, and have allocated an // additional word to avoid buffer overflow. mstore(copyTo, mload(data)) } // Update buffer length mstore(buffer, add(mload(buffer), length)) } } /// @notice Appends data to buffer, and update buffer length /// @param buffer the buffer to append the data to /// @param data the data to append /// @dev Performs out-of-bound checks and calls `appendUnchecked`. function appendSafe(bytes memory buffer, bytes memory data) internal pure { uint256 capacity; uint256 length; assembly { capacity := sub(mload(sub(buffer, 0x20)), 0x40) length := mload(buffer) } require( length + data.length <= capacity, "DynamicBuffer: Appending out of bounds." ); appendUnchecked(buffer, data); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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: /Contracts/ERC721R.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. This does random batch minting. */ contract ERC721r is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint => uint) private _availableTokens; uint256 private _numAvailableTokens; uint256 immutable _maxSupply; // 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_, uint maxSupply_) { _name = name_; _symbol = symbol_; _maxSupply = maxSupply_; _numAvailableTokens = maxSupply_; } /** * @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); } function totalSupply() public view virtual returns (uint256) { return _maxSupply - _numAvailableTokens; } function maxSupply() public view virtual returns (uint256) { return _maxSupply; } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); 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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 = ERC721r.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); 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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721r.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private { _beforeTokenTransfer(address(0), to, tokenId); _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } function _mintRandom(address to, uint _numToMint) internal virtual { require(_msgSender() == tx.origin, "Contracts cannot mint"); require(to != address(0), "ERC721: mint to the zero address"); require(_numToMint > 0, "ERC721r: need to mint at least one token"); // TODO: Probably don't need this as it will underflow and revert automatically in this case require(_numAvailableTokens >= _numToMint, "ERC721r: minting more tokens than available"); uint updatedNumAvailableTokens = _numAvailableTokens; for (uint256 i; i < _numToMint; ++i) { // Do this ++ unchecked? uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens); _mintIdWithoutBalanceUpdate(to, tokenId); --updatedNumAvailableTokens; } _numAvailableTokens = updatedNumAvailableTokens; _balances[to] += _numToMint; } function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens) internal returns (uint256) { uint256 randomNum = uint256( keccak256( abi.encode( to, // tx.gasprice, // block.number, // block.timestamp, // block.difficulty, // blockhash(block.number - 1), address(this), updatedNumAvailableTokens ) ) ); uint256 randomIndex = randomNum % updatedNumAvailableTokens; return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens); } // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2 function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens) internal returns (uint256) { uint256 valAtIndex = _availableTokens[indexToUse]; uint256 result; if (valAtIndex == 0) { // This means the index itself is still an available token result = indexToUse; } else { // This means the index itself is not an available token, but the val at that index is. result = valAtIndex; } uint256 lastIndex = updatedNumAvailableTokens - 1; uint256 lastValInArray = _availableTokens[lastIndex]; if (indexToUse != lastIndex) { // Replace the value at indexToUse, now that it's been used. // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards. if (lastValInArray == 0) { // This means the index itself is still an available token _availableTokens[indexToUse] = lastIndex; } else { // This means the index itself is not an available token, but the val at that index is. _availableTokens[indexToUse] = lastValInArray; } } if (lastValInArray != 0) { // Gas refund courtsey of @dievardump delete _availableTokens[lastIndex]; } return result; } // Not as good as minting a specific tokenId, but will behave the same at the start // allowing you to explicitly mint some tokens at launch. function _mintAtIndex(address to, uint index) internal virtual { require(_msgSender() == tx.origin, "Contracts cannot mint"); require(to != address(0), "ERC721: mint to the zero address"); require(_numAvailableTokens >= 1, "ERC721r: minting more tokens than available"); uint tokenId = getAvailableTokenAtIndex(index, _numAvailableTokens); --_numAvailableTokens; _mintIdWithoutBalanceUpdate(to, tokenId); _balances[to] += 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(ERC721r.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721r.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 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 { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: Mint Contract/ArbiPunksOnChain.sol pragma solidity ^0.8.17; interface PunkDataInterface { function punkImage(uint16 index) external view returns (bytes memory); function punkAttributes(uint16 index) external view returns (string memory); } interface ExtendedPunkDataInterface { enum PunkAttributeType {SEX, HAIR, EYES, BEARD, EARS, LIPS, MOUTH, FACE, EMOTION, NECK, NOSE, CHEEKS, TEETH} enum PunkAttributeValue { NONE, ALIEN, APE, BANDANA, BEANIE, BIG_BEARD, BIG_SHADES, BLACK_LIPSTICK, BLONDE_BOB, BLONDE_SHORT, BLUE_EYE_SHADOW, BUCK_TEETH, CAP, CAP_FORWARD, CHINSTRAP, CHOKER, CIGARETTE, CLASSIC_SHADES, CLOWN_EYES_BLUE, CLOWN_EYES_GREEN, CLOWN_HAIR_GREEN, CLOWN_NOSE, COWBOY_HAT, CRAZY_HAIR, DARK_HAIR, DO_RAG, EARRING, EYE_MASK, EYE_PATCH, FEDORA, FEMALE, FRONT_BEARD, FRONT_BEARD_DARK, FROWN, FRUMPY_HAIR, GOAT, GOLD_CHAIN, GREEN_EYE_SHADOW, HALF_SHAVED, HANDLEBARS, HEADBAND, HOODIE, HORNED_RIM_GLASSES, HOT_LIPSTICK, KNITTED_CAP, LUXURIOUS_BEARD, MALE, MEDICAL_MASK, MESSY_HAIR, MOHAWK, MOHAWK_DARK, MOHAWK_THIN, MOLE, MUSTACHE, MUTTONCHOPS, NERD_GLASSES, NORMAL_BEARD, NORMAL_BEARD_BLACK, ORANGE_SIDE, PEAK_SPIKE, PIGTAILS, PILOT_HELMET, PINK_WITH_HAT, PIPE, POLICE_CAP, PURPLE_EYE_SHADOW, PURPLE_HAIR, PURPLE_LIPSTICK, RED_MOHAWK, REGULAR_SHADES, ROSY_CHEEKS, SHADOW_BEARD, SHAVED_HEAD, SILVER_CHAIN, SMALL_SHADES, SMILE, SPOTS, STRAIGHT_HAIR, STRAIGHT_HAIR_BLONDE, STRAIGHT_HAIR_DARK, STRINGY_HAIR, TASSLE_HAT, THREE_D_GLASSES, TIARA, TOP_HAT, VAMPIRE_HAIR, VAPE, VR, WELDING_GOGGLES, WILD_BLONDE, WILD_HAIR, WILD_WHITE_HAIR, ZOMBIE } function attrStringToEnumMapping(string memory) external view returns (ExtendedPunkDataInterface.PunkAttributeValue); function attrEnumToStringMapping(PunkAttributeValue) external view returns (string memory); function attrValueToTypeEnumMapping(PunkAttributeValue) external view returns (ExtendedPunkDataInterface.PunkAttributeType); } // File: Punk Mint Contract/OnchainApePunks.sol pragma solidity ^0.8.0; contract OnchainApePunks is ERC721r, Ownable, ReentrancyGuard { enum PunkAttributeType {SEX, HAIR, EYES, BEARD, EARS, LIPS, MOUTH, FACE, EMOTION, NECK, NOSE, CHEEKS, TEETH} enum PunkAttributeValue { NONE, ALIEN, APE, BANDANA, BEANIE, BIG_BEARD, BIG_SHADES, BLACK_LIPSTICK, BLONDE_BOB, BLONDE_SHORT, BLUE_EYE_SHADOW, BUCK_TEETH, CAP, CAP_FORWARD, CHINSTRAP, CHOKER, CIGARETTE, CLASSIC_SHADES, CLOWN_EYES_BLUE, CLOWN_EYES_GREEN, CLOWN_HAIR_GREEN, CLOWN_NOSE, COWBOY_HAT, CRAZY_HAIR, DARK_HAIR, DO_RAG, EARRING, EYE_MASK, EYE_PATCH, FEDORA, FEMALE, FRONT_BEARD, FRONT_BEARD_DARK, FROWN, FRUMPY_HAIR, GOAT, GOLD_CHAIN, GREEN_EYE_SHADOW, HALF_SHAVED, HANDLEBARS, HEADBAND, HOODIE, HORNED_RIM_GLASSES, HOT_LIPSTICK, KNITTED_CAP, LUXURIOUS_BEARD, MALE, MEDICAL_MASK, MESSY_HAIR, MOHAWK, MOHAWK_DARK, MOHAWK_THIN, MOLE, MUSTACHE, MUTTONCHOPS, NERD_GLASSES, NORMAL_BEARD, NORMAL_BEARD_BLACK, ORANGE_SIDE, PEAK_SPIKE, PIGTAILS, PILOT_HELMET, PINK_WITH_HAT, PIPE, POLICE_CAP, PURPLE_EYE_SHADOW, PURPLE_HAIR, PURPLE_LIPSTICK, RED_MOHAWK, REGULAR_SHADES, ROSY_CHEEKS, SHADOW_BEARD, SHAVED_HEAD, SILVER_CHAIN, SMALL_SHADES, SMILE, SPOTS, STRAIGHT_HAIR, STRAIGHT_HAIR_BLONDE, STRAIGHT_HAIR_DARK, STRINGY_HAIR, TASSLE_HAT, THREE_D_GLASSES, TIARA, TOP_HAT, VAMPIRE_HAIR, VAPE, VR, WELDING_GOGGLES, WILD_BLONDE, WILD_HAIR, WILD_WHITE_HAIR, ZOMBIE } struct Punk { uint16 id; PunkAttributeValue sex; PunkAttributeValue hair; PunkAttributeValue eyes; PunkAttributeValue beard; PunkAttributeValue ears; PunkAttributeValue lips; PunkAttributeValue mouth; PunkAttributeValue face; PunkAttributeValue emotion; PunkAttributeValue neck; PunkAttributeValue nose; PunkAttributeValue cheeks; PunkAttributeValue teeth; } using StringUtils for string; using Address for address; using DynamicBuffer for bytes; using Strings for uint256; using Strings for uint16; using Strings for uint8; bytes private constant tokenDescription = "First PFP collection on ApeChain."; PunkDataInterface private immutable punkDataContract; ExtendedPunkDataInterface private immutable extendedPunkDataContract; uint public mintPrice = 2 ether; uint public freeAmount = 250; uint public freeCount = 0; bool public mintEnabled = false; address public deployer; mapping(address => bool) public FreeAddresses; modifier onlyDeployer() { require(msg.sender == deployer, "Only deployer."); _; } constructor(address punkDataContractAddress, address extendedPunkDataContractAddress) ERC721r("Onchain ApePunks", "OA", 10000) { punkDataContract = PunkDataInterface(punkDataContractAddress); extendedPunkDataContract = ExtendedPunkDataInterface(extendedPunkDataContractAddress); deployer = payable(msg.sender); } function mint(uint256 count) external payable { uint256 cost = mintPrice; require(mintEnabled, "Mint not ready yet"); require(totalSupply() + count <= maxSupply(), "Sold Out!"); require(msg.value >= count * cost, "Please send the exact ETH amount"); require(msg.sender == tx.origin, "The minter is another contract"); _mintRandom(msg.sender, count); } function free_mint() external { uint256 count = 1; require(FreeAddresses[msg.sender] == false, "Free Mint already claimed"); require(freeCount < freeAmount, "Free sold out - Mint a paid!"); require(mintEnabled, "Mint is not live yet"); require(totalSupply() + count <= maxSupply(), "Sold Out!"); require(msg.sender == tx.origin, "The minter is another contract"); freeCount = freeCount + 1; FreeAddresses[msg.sender] = true; _mintRandom(msg.sender, count); } function set_Price(uint _price) public onlyOwner { mintPrice = _price; } function set_freeAmount(uint _freeAmount) public onlyOwner { freeAmount = _freeAmount; } function toggle_Minting() external onlyOwner { mintEnabled = !mintEnabled; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function team_mint() external onlyOwner nonReentrant { _mintRandom(msg.sender, 250); } function airdrop_Punk(address sendTo) external onlyOwner { uint256 count = 1; require(totalSupply() + count <= maxSupply(), "Sold Out!"); require(msg.sender == tx.origin, "The minter is another contract"); _mintRandom(sendTo, count); } function airdrop_Punks(address[] memory recipients) external onlyOwner { uint256 count = 1; for (uint256 i = 0; i < recipients.length; i++) { _mintRandom(recipients[i], count); } } function exists(uint tokenId) external view returns (bool) { return _exists(tokenId); } function tokenURI(uint256 id) public view override returns (string memory) { require(_exists(id), "Token does not exist"); return constructTokenURI(uint16(id)); } function constructTokenURI(uint16 tokenId) private view returns (string memory) { bytes memory svg = bytes(tokenImage(tokenId)); bytes memory title = abi.encodePacked("Onchain ApePunks #", tokenId.toString()); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{', '"name":"', title, '",' '"description":"', tokenDescription, '",' '"background_color":"004BFF",' '"image_data":"data:image/svg+xml;base64,', Base64.encode(svg), '",' '"attributes": ', punkAttributesAsJSON(tokenId), '}' ) ) ) ) ); } function initializePunk(uint16 punkId) private view returns (Punk memory) { Punk memory punk = Punk({ id: punkId, sex: PunkAttributeValue.NONE, hair: PunkAttributeValue.NONE, eyes: PunkAttributeValue.NONE, beard: PunkAttributeValue.NONE, ears: PunkAttributeValue.NONE, lips: PunkAttributeValue.NONE, mouth: PunkAttributeValue.NONE, face: PunkAttributeValue.NONE, emotion: PunkAttributeValue.NONE, neck: PunkAttributeValue.NONE, nose: PunkAttributeValue.NONE, cheeks: PunkAttributeValue.NONE, teeth: PunkAttributeValue.NONE }); punk.id = punkId; string memory attributes = punkDataContract.punkAttributes(punk.id); string[] memory attributeArray = attributes.split(","); for (uint i = 0; i < attributeArray.length; i++) { string memory untrimmedAttribute = attributeArray[i]; string memory trimmedAttribute; if (i < 1) { trimmedAttribute = untrimmedAttribute.split(' ')[0]; } else { trimmedAttribute = untrimmedAttribute._substring(int(bytes(untrimmedAttribute).length - 1), 1); } PunkAttributeValue attrValue = PunkAttributeValue(uint(extendedPunkDataContract.attrStringToEnumMapping(trimmedAttribute))); PunkAttributeType attrType = PunkAttributeType(uint(extendedPunkDataContract.attrValueToTypeEnumMapping(ExtendedPunkDataInterface.PunkAttributeValue(uint(attrValue))))); if (attrType == PunkAttributeType.SEX) { punk.sex = attrValue; } else if (attrType == PunkAttributeType.HAIR) { punk.hair = attrValue; } else if (attrType == PunkAttributeType.EYES) { punk.eyes = attrValue; } else if (attrType == PunkAttributeType.BEARD) { punk.beard = attrValue; } else if (attrType == PunkAttributeType.EARS) { punk.ears = attrValue; } else if (attrType == PunkAttributeType.LIPS) { punk.lips = attrValue; } else if (attrType == PunkAttributeType.MOUTH) { punk.mouth = attrValue; } else if (attrType == PunkAttributeType.FACE) { punk.face = attrValue; } else if (attrType == PunkAttributeType.EMOTION) { punk.emotion = attrValue; } else if (attrType == PunkAttributeType.NECK) { punk.neck = attrValue; } else if (attrType == PunkAttributeType.NOSE) { punk.nose = attrValue; } else if (attrType == PunkAttributeType.CHEEKS) { punk.cheeks = attrValue; } else if (attrType == PunkAttributeType.TEETH) { punk.teeth = attrValue; } } return punk; } bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function tokenImage(uint16 tokenId) public view returns (string memory) { bytes memory pixels = punkDataContract.punkImage(uint16(tokenId)); bytes memory svgBytes = DynamicBuffer.allocate(1024 * 128); svgBytes.appendSafe('<svg width="1200" height="1200" shape-rendering="crispEdges" xmlns="http://www.w3.org/2000/svg" version="1.2" viewBox="0 0 24 24"><style>rect{width:1px;height:1px}</style><rect x="0" y="0" style="width:100%;height:100%" fill="#004BFF" /><g style="transform: translate(calc(50% - 12px), calc(50% - 12px))">'); bytes memory buffer = new bytes(8); for (uint256 y = 0; y < 24; y++) { for (uint256 x = 0; x < 24; x++) { uint256 p = (y * 24 + x) * 4; if (uint8(pixels[p + 3]) > 0) { for (uint256 i = 0; i < 4; i++) { uint8 value = uint8(pixels[p + i]); buffer[i * 2 + 1] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; buffer[i * 2] = _HEX_SYMBOLS[value & 0xf]; } string memory oldColor = string(buffer); svgBytes.appendSafe( abi.encodePacked( '<rect x="', x.toString(), '" y="', y.toString(), '" fill="#', oldColor, '"/>' ) ); } } } svgBytes.appendSafe('</g></svg>'); return string(svgBytes); } function punkAttributeCount(Punk memory punk) private pure returns (uint totalCount) { PunkAttributeValue[13] memory attrArray = [ punk.sex, punk.hair, punk.eyes, punk.beard, punk.ears, punk.lips, punk.mouth, punk.face, punk.emotion, punk.neck, punk.nose, punk.cheeks, punk.teeth ]; for (uint i = 0; i < 13; ++i) { if (attrArray[i] != PunkAttributeValue.NONE) { totalCount++; } } // Don't count sex as an attribute totalCount--; } function punkAttributesAsJSON(uint16 punkId) public view returns (string memory json) { Punk memory punk = initializePunk(punkId); PunkAttributeValue none = PunkAttributeValue.NONE; bytes memory output = "["; PunkAttributeValue[13] memory attrArray = [ punk.sex, punk.hair, punk.eyes, punk.beard, punk.ears, punk.lips, punk.mouth, punk.face, punk.emotion, punk.neck, punk.nose, punk.cheeks, punk.teeth ]; uint attrCount = punkAttributeCount(punk); uint count = 0; for (uint i = 0; i < 13; ++i) { PunkAttributeValue attrVal = attrArray[i]; if (attrVal != none) { output = abi.encodePacked(output, punkAttributeAsJSON(attrVal)); if (count < attrCount) { output.appendSafe(","); ++count; } } } return string(abi.encodePacked(output, "]")); } function punkAttributeAsJSON(PunkAttributeValue attribute) internal view returns (string memory json) { require(attribute != PunkAttributeValue.NONE); string memory attributeAsString = extendedPunkDataContract.attrEnumToStringMapping(ExtendedPunkDataInterface.PunkAttributeValue(uint(attribute))); string memory attributeTypeAsString; PunkAttributeType attrType = PunkAttributeType(uint(extendedPunkDataContract.attrValueToTypeEnumMapping(ExtendedPunkDataInterface.PunkAttributeValue(uint(attribute))))); if (attrType == PunkAttributeType.SEX) { attributeTypeAsString = "Sex"; } else if (attrType == PunkAttributeType.HAIR) { attributeTypeAsString = "Hair"; } else if (attrType == PunkAttributeType.EYES) { attributeTypeAsString = "Eyes"; } else if (attrType == PunkAttributeType.BEARD) { attributeTypeAsString = "Beard"; } else if (attrType == PunkAttributeType.EARS) { attributeTypeAsString = "Ears"; } else if (attrType == PunkAttributeType.LIPS) { attributeTypeAsString = "Lips"; } else if (attrType == PunkAttributeType.MOUTH) { attributeTypeAsString = "Mouth"; } else if (attrType == PunkAttributeType.FACE) { attributeTypeAsString = "Face"; } else if (attrType == PunkAttributeType.EMOTION) { attributeTypeAsString = "Emotion"; } else if (attrType == PunkAttributeType.NECK) { attributeTypeAsString = "Neck"; } else if (attrType == PunkAttributeType.NOSE) { attributeTypeAsString = "Nose"; } else if (attrType == PunkAttributeType.CHEEKS) { attributeTypeAsString = "Cheeks"; } else if (attrType == PunkAttributeType.TEETH) { attributeTypeAsString = "Teeth"; } return string(abi.encodePacked('{"trait_type":"', attributeTypeAsString, '", "value":"', attributeAsString, '"}')); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"punkDataContractAddress","type":"address"},{"internalType":"address","name":"extendedPunkDataContractAddress","type":"address"}],"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":"","type":"address"}],"name":"FreeAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sendTo","type":"address"}],"name":"airdrop_Punk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop_Punks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"free_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"punkId","type":"uint16"}],"name":"punkAttributesAsJSON","outputs":[{"internalType":"string","name":"json","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"set_Price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeAmount","type":"uint256"}],"name":"set_freeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_Minting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"tokenImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052671bc16d674ec80000600a5560fa600b556000600c55600d805460ff191690553480156200003157600080fd5b50604051620045e1380380620045e1833981016040819052620000549162000175565b6040518060400160405280601081526020016f4f6e636861696e2041706550756e6b7360801b815250604051806040016040528060028152602001614f4160f01b8152506127108260009081620000ac919062000252565b506001620000bb838262000252565b50608081905260035550620000d290503362000106565b60016009556001600160a01b0391821660a0521660c052600d8054610100600160a81b03191633610100021790556200031e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200017057600080fd5b919050565b600080604083850312156200018957600080fd5b620001948362000158565b9150620001a46020840162000158565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001d857607f821691505b602082108103620001f957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024d57600081815260208120601f850160051c81016020861015620002285750805b601f850160051c820191505b81811015620002495782815560010162000234565b5050505b505050565b81516001600160401b038111156200026e576200026e620001ad565b62000286816200027f8454620001c3565b84620001ff565b602080601f831160018114620002be5760008415620002a55750858301515b600019600386901b1c1916600185901b17855562000249565b600085815260208120601f198616915b82811015620002ef57888601518255948401946001909101908401620002ce565b50858210156200030e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05161425b62000386600039600081816119ae01528181611a4c015281816120b90152612172015260008181610f3e015261185501526000818161058201528181610c9201528181611297015281816114790152611623015261425b6000f3fe60806040526004361061020f5760003560e01c80639896ed1111610118578063d1239730116100a0578063d9685a301161006f578063d9685a30146105cb578063db482312146105eb578063e985e9c51461060b578063ed29b76d1461062b578063f2fde38b1461065b57600080fd5b8063d123973014610539578063d23bf56914610553578063d5abeb0114610573578063d5f39488146105a657600080fd5b8063a4c19a9f116100e7578063a4c19a9f146104ae578063a6f48c90146104c3578063b638aabc146104d9578063b88d4fde146104f9578063c87b56dd1461051957600080fd5b80639896ed11146104465780639dc823b514610466578063a0712d681461047b578063a22cb4651461048e57600080fd5b806342842e0e1161019b5780636817c76c1161016a5780636817c76c146103c857806370a08231146103de578063715018a6146103fe5780638da5cb5b1461041357806395d89b411461043157600080fd5b806342842e0e146103535780634f423a9d146103735780634f558e79146103885780636352211e146103a857600080fd5b8063081812fc116101e2578063081812fc146102af578063095ea7b3146102e757806318160ddd1461030957806323b872dd1461031e5780633ccfd60b1461033e57600080fd5b806301ffc9a714610214578063023abe2b146102495780630451a9f11461027657806306fdde031461029a575b600080fd5b34801561022057600080fd5b5061023461022f36600461365a565b61067b565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004613677565b6106cd565b60405161024091906136eb565b34801561028257600080fd5b5061028c600b5481565b604051908152602001610240565b3480156102a657600080fd5b50610269610a4a565b3480156102bb57600080fd5b506102cf6102ca3660046136fe565b610adc565b6040516001600160a01b039091168152602001610240565b3480156102f357600080fd5b50610307610302366004613733565b610b76565b005b34801561031557600080fd5b5061028c610c8b565b34801561032a57600080fd5b5061030761033936600461375d565b610cc0565b34801561034a57600080fd5b50610307610cf1565b34801561035f57600080fd5b5061030761036e36600461375d565b610d99565b34801561037f57600080fd5b50610307610db4565b34801561039457600080fd5b506102346103a33660046136fe565b610dd9565b3480156103b457600080fd5b506102cf6103c33660046136fe565b610df8565b3480156103d457600080fd5b5061028c600a5481565b3480156103ea57600080fd5b5061028c6103f9366004613799565b610e6f565b34801561040a57600080fd5b50610307610ef6565b34801561041f57600080fd5b506008546001600160a01b03166102cf565b34801561043d57600080fd5b50610269610f08565b34801561045257600080fd5b50610269610461366004613677565b610f17565b34801561047257600080fd5b5061030761122f565b6103076104893660046136fe565b61124b565b34801561049a57600080fd5b506103076104a93660046137b4565b61136d565b3480156104ba57600080fd5b50610307611378565b3480156104cf57600080fd5b5061028c600c5481565b3480156104e557600080fd5b506103076104f4366004613837565b611520565b34801561050557600080fd5b5061030761051436600461390c565b61156b565b34801561052557600080fd5b506102696105343660046136fe565b6115a3565b34801561054557600080fd5b50600d546102349060ff1681565b34801561055f57600080fd5b5061030761056e3660046136fe565b61160a565b34801561057f57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061028c565b3480156105b257600080fd5b50600d546102cf9061010090046001600160a01b031681565b3480156105d757600080fd5b506103076105e6366004613799565b611617565b3480156105f757600080fd5b506103076106063660046136fe565b61169c565b34801561061757600080fd5b506102346106263660046139b7565b6116a9565b34801561063757600080fd5b50610234610646366004613799565b600e6020526000908152604090205460ff1681565b34801561066757600080fd5b50610307610676366004613799565b6116d7565b60006001600160e01b031982166380ac58cd60e01b14806106ac57506001600160e01b03198216635b5e139f60e01b145b806106c757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006106da8361174d565b9050600080604051806040016040528060018152602001605b60f81b81525090506000604051806101a001604052808560200151605c81111561071f5761071f6139ea565b605c811115610730576107306139ea565b81526020018560400151605c81111561074b5761074b6139ea565b605c81111561075c5761075c6139ea565b81526020018560600151605c811115610777576107776139ea565b605c811115610788576107886139ea565b81526020018560800151605c8111156107a3576107a36139ea565b605c8111156107b4576107b46139ea565b81526020018560a00151605c8111156107cf576107cf6139ea565b605c8111156107e0576107e06139ea565b81526020018560c00151605c8111156107fb576107fb6139ea565b605c81111561080c5761080c6139ea565b81526020018560e00151605c811115610827576108276139ea565b605c811115610838576108386139ea565b8152602001856101000151605c811115610854576108546139ea565b605c811115610865576108656139ea565b8152602001856101200151605c811115610881576108816139ea565b605c811115610892576108926139ea565b8152602001856101400151605c8111156108ae576108ae6139ea565b605c8111156108bf576108bf6139ea565b8152602001856101600151605c8111156108db576108db6139ea565b605c8111156108ec576108ec6139ea565b8152602001856101800151605c811115610908576109086139ea565b605c811115610919576109196139ea565b8152602001856101a00151605c811115610935576109356139ea565b605c811115610946576109466139ea565b90529050600061095585611dd9565b90506000805b600d811015610a1c5760008482600d811061097857610978613a00565b6020020151905086605c811115610991576109916139ea565b81605c8111156109a3576109a36139ea565b14610a0b57856109b282612095565b6040516020016109c3929190613a32565b604051602081830303815290604052955083831015610a0b576040805180820190915260018152600b60fa1b60208201526109ff90879061258b565b610a0883613a77565b92505b50610a1581613a77565b905061095b565b5083604051602001610a2e9190613a90565b6040516020818303038152906040529650505050505050919050565b606060008054610a5990613ab5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8590613ab5565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b0316610b5a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b8182610df8565b9050806001600160a01b0316836001600160a01b031603610bee5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b51565b336001600160a01b0382161480610c0a5750610c0a81336116a9565b610c7c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b51565b610c868383612610565b505050565b60006003547f0000000000000000000000000000000000000000000000000000000000000000610cbb9190613aef565b905090565b610cca338261267e565b610ce65760405162461bcd60e51b8152600401610b5190613b02565b610c8683838361274d565b610cf96128e9565b610d01612943565b604051600090339047908381818185875af1925050503d8060008114610d43576040519150601f19603f3d011682016040523d82523d6000602084013e610d48565b606091505b5050905080610d8c5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b51565b50610d976001600955565b565b610c868383836040518060200160405280600081525061156b565b610dbc6128e9565b610dc4612943565b610dcf3360fa61299c565b610d976001600955565b6000818152600460205260408120546001600160a01b031615156106c7565b6000818152600460205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b51565b60006001600160a01b038216610eda5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b51565b506001600160a01b031660009081526005602052604090205490565b610efe6128e9565b610d976000612b7b565b606060018054610a5990613ab5565b604051631f2f054b60e11b815261ffff821660048201526060906000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633e5e0a9690602401600060405180830381865afa158015610f85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fad9190810190613b83565b604080516202006081019091526202004081526000602090910181815291925050610ff460405180610160016040528061013181526020016140b56101319139829061258b565b60408051600880825281830190925260009160208201818036833701905050905060005b60188110156111fa5760005b60188110156111e75760008161103b846018613bcc565b6110459190613be3565b611050906004613bcc565b9050600086611060836003613be3565b8151811061107057611070613a00565b016020015160f81c11156111d45760005b6004811015611191576000876110978385613be3565b815181106110a7576110a7613a00565b016020015160f81c90506f181899199a1a9b1b9c1cb0b131b232b360811b600f8216601081106110d9576110d9613a00565b1a60f81b866110e9846002613bcc565b6110f4906001613be3565b8151811061110457611104613a00565b60200101906001600160f81b031916908160001a90535060041c600f166f181899199a1a9b1b9c1cb0b131b232b360811b816010811061114657611146613a00565b1a60f81b86611156846002613bcc565b8151811061116657611166613a00565b60200101906001600160f81b031916908160001a90535050808061118990613a77565b915050611081565b50836111d261119f84612bcd565b6111a886612bcd565b836040516020016111bb93929190613bf6565b60408051601f19818403018152919052879061258b565b505b50806111df81613a77565b915050611024565b50806111f281613a77565b915050611018565b5060408051808201909152600a8152691e17b39f1e17b9bb339f60b11b602082015261122790839061258b565b509392505050565b6112376128e9565b600d805460ff19811660ff90911615179055565b600a54600d5460ff166112955760405162461bcd60e51b8152602060048201526012602482015271135a5b9d081b9bdd081c9958591e481e595d60721b6044820152606401610b51565b7f0000000000000000000000000000000000000000000000000000000000000000826112bf610c8b565b6112c99190613be3565b11156112e75760405162461bcd60e51b8152600401610b5190613c87565b6112f18183613bcc565b3410156113405760405162461bcd60e51b815260206004820181905260248201527f506c656173652073656e64207468652065786163742045544820616d6f756e746044820152606401610b51565b33321461135f5760405162461bcd60e51b8152600401610b5190613caa565b611369338361299c565b5050565b611369338383612c5e565b336000908152600e602052604090205460019060ff16156113db5760405162461bcd60e51b815260206004820152601960248201527f46726565204d696e7420616c726561647920636c61696d6564000000000000006044820152606401610b51565b600b54600c541061142e5760405162461bcd60e51b815260206004820152601c60248201527f4672656520736f6c64206f7574202d204d696e742061207061696421000000006044820152606401610b51565b600d5460ff166114775760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610b51565b7f0000000000000000000000000000000000000000000000000000000000000000816114a1610c8b565b6114ab9190613be3565b11156114c95760405162461bcd60e51b8152600401610b5190613c87565b3332146114e85760405162461bcd60e51b8152600401610b5190613caa565b600c546114f6906001613be3565b600c55336000818152600e60205260409020805460ff1916600117905561151d908261299c565b50565b6115286128e9565b600160005b8251811015610c865761155983828151811061154b5761154b613a00565b60200260200101518361299c565b8061156381613a77565b91505061152d565b611575338361267e565b6115915760405162461bcd60e51b8152600401610b5190613b02565b61159d84848484612d2c565b50505050565b6000818152600460205260409020546060906001600160a01b03166116015760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b51565b6106c782612d5f565b6116126128e9565b600b55565b61161f6128e9565b60017f00000000000000000000000000000000000000000000000000000000000000008161164b610c8b565b6116559190613be3565b11156116735760405162461bcd60e51b8152600401610b5190613c87565b3332146116925760405162461bcd60e51b8152600401610b5190613caa565b611369828261299c565b6116a46128e9565b600a55565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6116df6128e9565b6001600160a01b0381166117445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b51565b61151d81612b7b565b6117bf604080516101c0810190915260008082526020820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101c0810190915261ffff831681526000906020810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905261ffff84168082526040516376dfe29760e01b815260048101919091529091506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906376dfe29790602401600060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118cc9190810190613b83565b905060006118fc604051806040016040528060018152602001600b60fa1b81525083612e1890919063ffffffff16565b905060005b8151811015611dcf57600082828151811061191e5761191e613a00565b6020026020010151905060606001831015611977576040805180820190915260018152600160fd1b6020820152611956908390612e18565b60008151811061196857611968613a00565b60200260200101519050611994565b611991600183516119889190613aef565b83906001613005565b90505b604051631a2d891b60e31b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d16c48d8906119e39085906004016136eb565b602060405180830381865afa158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a249190613ce1565b605c811115611a3557611a356139ea565b605c811115611a4657611a466139ea565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663683375c483605c811115611a8b57611a8b6139ea565b605c811115611a9c57611a9c6139ea565b6040518263ffffffff1660e01b8152600401611ab89190613d02565b602060405180830381865afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af99190613d2a565b600c811115611b0a57611b0a6139ea565b600c811115611b1b57611b1b6139ea565b9050600081600c811115611b3157611b316139ea565b03611b67576020880182605c811115611b4c57611b4c6139ea565b9081605c811115611b5f57611b5f6139ea565b905250611db8565b600181600c811115611b7b57611b7b6139ea565b03611b96576040880182605c811115611b4c57611b4c6139ea565b600281600c811115611baa57611baa6139ea565b03611bc5576060880182605c811115611b4c57611b4c6139ea565b600381600c811115611bd957611bd96139ea565b03611bf4576080880182605c811115611b4c57611b4c6139ea565b600481600c811115611c0857611c086139ea565b03611c235760a0880182605c811115611b4c57611b4c6139ea565b600581600c811115611c3757611c376139ea565b03611c525760c0880182605c811115611b4c57611b4c6139ea565b600681600c811115611c6657611c666139ea565b03611c815760e0880182605c811115611b4c57611b4c6139ea565b600781600c811115611c9557611c956139ea565b03611cb157610100880182605c811115611b4c57611b4c6139ea565b600881600c811115611cc557611cc56139ea565b03611ce157610120880182605c811115611b4c57611b4c6139ea565b600981600c811115611cf557611cf56139ea565b03611d1157610140880182605c811115611b4c57611b4c6139ea565b600a81600c811115611d2557611d256139ea565b03611d4157610160880182605c811115611b4c57611b4c6139ea565b600b81600c811115611d5557611d556139ea565b03611d7157610180880182605c811115611b4c57611b4c6139ea565b600c81600c811115611d8557611d856139ea565b03611db8576101a0880182605c811115611da157611da16139ea565b9081605c811115611db457611db46139ea565b9052505b505050508080611dc790613a77565b915050611901565b5091949350505050565b600080604051806101a001604052808460200151605c811115611dfe57611dfe6139ea565b605c811115611e0f57611e0f6139ea565b81526020018460400151605c811115611e2a57611e2a6139ea565b605c811115611e3b57611e3b6139ea565b81526020018460600151605c811115611e5657611e566139ea565b605c811115611e6757611e676139ea565b81526020018460800151605c811115611e8257611e826139ea565b605c811115611e9357611e936139ea565b81526020018460a00151605c811115611eae57611eae6139ea565b605c811115611ebf57611ebf6139ea565b81526020018460c00151605c811115611eda57611eda6139ea565b605c811115611eeb57611eeb6139ea565b81526020018460e00151605c811115611f0657611f066139ea565b605c811115611f1757611f176139ea565b8152602001846101000151605c811115611f3357611f336139ea565b605c811115611f4457611f446139ea565b8152602001846101200151605c811115611f6057611f606139ea565b605c811115611f7157611f716139ea565b8152602001846101400151605c811115611f8d57611f8d6139ea565b605c811115611f9e57611f9e6139ea565b8152602001846101600151605c811115611fba57611fba6139ea565b605c811115611fcb57611fcb6139ea565b8152602001846101800151605c811115611fe757611fe76139ea565b605c811115611ff857611ff86139ea565b8152602001846101a00151605c811115612014576120146139ea565b605c811115612025576120256139ea565b9052905060005b600d8110156120825760008282600d811061204957612049613a00565b6020020151605c81111561205f5761205f6139ea565b14612072578261206e81613a77565b9350505b61207b81613a77565b905061202c565b508161208d81613d4b565b949350505050565b6060600082605c8111156120ab576120ab6139ea565b036120b557600080fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc9faca584605c8111156120f8576120f86139ea565b605c811115612109576121096139ea565b6040518263ffffffff1660e01b81526004016121259190613d02565b600060405180830381865afa158015612142573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261216a9190810190613b83565b9050606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663683375c486605c8111156121b1576121b16139ea565b605c8111156121c2576121c26139ea565b6040518263ffffffff1660e01b81526004016121de9190613d02565b602060405180830381865afa1580156121fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221f9190613d2a565b600c811115612230576122306139ea565b600c811115612241576122416139ea565b9050600081600c811115612257576122576139ea565b0361227f57604051806040016040528060038152602001620a6caf60eb1b815250915061255f565b600181600c811115612293576122936139ea565b036122bc57604051806040016040528060048152602001632430b4b960e11b815250915061255f565b600281600c8111156122d0576122d06139ea565b036122f957604051806040016040528060048152602001634579657360e01b815250915061255f565b600381600c81111561230d5761230d6139ea565b0361233757604051806040016040528060058152602001641099585c9960da1b815250915061255f565b600481600c81111561234b5761234b6139ea565b0361237457604051806040016040528060048152602001634561727360e01b815250915061255f565b600581600c811115612388576123886139ea565b036123b157604051806040016040528060048152602001634c69707360e01b815250915061255f565b600681600c8111156123c5576123c56139ea565b036123ef576040518060400160405280600581526020016409adeeae8d60db1b815250915061255f565b600781600c811115612403576124036139ea565b0361242c57604051806040016040528060048152602001634661636560e01b815250915061255f565b600881600c811115612440576124406139ea565b0361246c576040518060400160405280600781526020016622b6b7ba34b7b760c91b815250915061255f565b600981600c811115612480576124806139ea565b036124a957604051806040016040528060048152602001634e65636b60e01b815250915061255f565b600a81600c8111156124bd576124bd6139ea565b036124e657604051806040016040528060048152602001634e6f736560e01b815250915061255f565b600b81600c8111156124fa576124fa6139ea565b036125255760405180604001604052806006815260200165436865656b7360d01b815250915061255f565b600c81600c811115612539576125396139ea565b0361255f57604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001612572929190613d62565b6040516020818303038152906040529350505050919050565b601f1982015182518251603f199092019182906125a89083613be3565b11156126065760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b6064820152608401610b51565b61159d84846130f8565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061264582610df8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166126f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b51565b600061270283610df8565b9050806001600160a01b0316846001600160a01b0316148061273d5750836001600160a01b031661273284610adc565b6001600160a01b0316145b8061208d575061208d81856116a9565b826001600160a01b031661276082610df8565b6001600160a01b0316146127c45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b51565b6001600160a01b0382166128265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b51565b612831600082612610565b6001600160a01b038316600090815260056020526040812080546001929061285a908490613aef565b90915550506001600160a01b0382166000908152600560205260408120805460019290612888908490613be3565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6008546001600160a01b03163314610d975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b51565b6002600954036129955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b51565b6002600955565b3332146129e35760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc818d85b9b9bdd081b5a5b9d605a1b6044820152606401610b51565b6001600160a01b038216612a395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b51565b60008111612a9a5760405162461bcd60e51b815260206004820152602860248201527f455243373231723a206e65656420746f206d696e74206174206c65617374206f6044820152673732903a37b5b2b760c11b6064820152608401610b51565b806003541015612b005760405162461bcd60e51b815260206004820152602b60248201527f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160448201526a6e20617661696c61626c6560a81b6064820152608401610b51565b60035460005b82811015612b43576000612b1a858461312e565b9050612b26858261318c565b612b2f83613d4b565b92505080612b3c90613a77565b9050612b06565b5060038190556001600160a01b03831660009081526005602052604081208054849290612b71908490613be3565b9091555050505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000612bda836131e5565b600101905060008167ffffffffffffffff811115612bfa57612bfa6137f0565b6040519080825280601f01601f191660200182016040528015612c24576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450841561122757612c2e565b816001600160a01b0316836001600160a01b031603612cbf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b51565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d3784848461274d565b612d43848484846132bd565b61159d5760405162461bcd60e51b8152600401610b5190613dea565b60606000612d6c83610f17565b90506000612d7d8461ffff16612bcd565b604051602001612d8d9190613e3c565b60408051601f19818403018152606083019091526021808352909250612df09183916140946020830139612dc0856133be565b612dc9886106cd565b604051602001612ddc9493929190613e76565b6040516020818303038152906040526133be565b604051602001612e009190613f8e565b60405160208183030381529060405292505050919050565b606082600060015b60018351612e2e9190613aef565b821015612e71576000612e42878785613511565b90508019612e505750612e71565b81612e5a81613a77565b9250612e699050816001613be3565b925050612e20565b8067ffffffffffffffff811115612e8a57612e8a6137f0565b604051908082528060200260200182016040528015612ebd57816020015b6060815260200190600190039081612ea85790505b50935060009150600090505b60018351612ed79190613aef565b821015612ffc576000612eeb878785613511565b90508019612ef7575082515b6000612f038483613aef565b67ffffffffffffffff811115612f1b57612f1b6137f0565b6040519080825280601f01601f191660200182016040528015612f45576020820181803683370190505b509050806000855b84811015612fbc57878181518110612f6757612f67613a00565b01602001516001600160f81b0319168383612f8181613a77565b945081518110612f9357612f93613a00565b60200101906001600160f81b031916908160001a90535080612fb481613a77565b915050612f4d565b50612fc8846001613be3565b9550818886612fd681613a77565b975081518110612fe857612fe8613a00565b602002602001018190525050505050612ec9565b50505092915050565b825160609084906130168585613fd3565b111561302457613024613ffb565b60008467ffffffffffffffff81111561303f5761303f6137f0565b6040519080825280601f01601f191660200182016040528015613069576020820181803683370190505b509050806000855b61307b8888613fd3565b8110156130e95784818151811061309457613094613a00565b01602001516001600160f81b03191683836130ae81613a77565b9450815181106130c0576130c0613a00565b60200101906001600160f81b031916908160001a905350806130e181613a77565b915050613071565b509093505050505b9392505050565b8051602082019150808201602084510184015b8184101561312357835181526020938401930161310b565b505082510190915250565b604080516001600160a01b038416602080830191909152308284015260608083018590528351808403909101815260809092019092528051910120600090816131778483614011565b905061318381856135ac565b95945050505050565b60008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106132245772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613250576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061326e57662386f26fc10000830492506010015b6305f5e1008310613286576305f5e100830492506008015b612710831061329a57612710830492506004015b606483106132ac576064830492506002015b600a83106106c75760010192915050565b60006001600160a01b0384163b156133b357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613301903390899088908890600401614025565b6020604051808303816000875af192505050801561333c575060408051601f3d908101601f1916820190925261333991810190614062565b60015b613399573d80801561336a576040519150601f19603f3d011682016040523d82523d6000602084013e61336f565b606091505b5080516000036133915760405162461bcd60e51b8152600401610b5190613dea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061208d565b506001949350505050565b606081516000036133dd57505060408051602081019091526000815290565b60006040518060600160405280604081526020016141e6604091399050600060038451600261340c9190613be3565b613416919061407f565b613421906004613bcc565b67ffffffffffffffff811115613439576134396137f0565b6040519080825280601f01601f191660200182016040528015613463576020820181803683370190505b509050600182016020820185865187015b808210156134cf576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613474565b50506003865106600181146134eb57600281146134fe57613506565b603d6001830353603d6002830353613506565b603d60018303535b509195945050505050565b81516000908490849060011461352957613529613ffb565b835b825181101561359e578160008151811061354757613547613a00565b602001015160f81c60f81b6001600160f81b03191683828151811061356e5761356e613a00565b01602001516001600160f81b0319160361358c5792506130f1915050565b8061359681613a77565b91505061352b565b506000199695505050505050565b600082815260026020526040812054818181036135ca5750836135cd565b50805b60006135da600186613aef565b6000818152600260205260409020549091508682146136235780600003613611576000878152600260205260409020829055613623565b60008781526002602052604090208190555b8015613639576000828152600260205260408120555b509095945050505050565b6001600160e01b03198116811461151d57600080fd5b60006020828403121561366c57600080fd5b81356130f181613644565b60006020828403121561368957600080fd5b813561ffff811681146130f157600080fd5b60005b838110156136b657818101518382015260200161369e565b50506000910152565b600081518084526136d781602086016020860161369b565b601f01601f19169290920160200192915050565b6020815260006130f160208301846136bf565b60006020828403121561371057600080fd5b5035919050565b80356001600160a01b038116811461372e57600080fd5b919050565b6000806040838503121561374657600080fd5b61374f83613717565b946020939093013593505050565b60008060006060848603121561377257600080fd5b61377b84613717565b925061378960208501613717565b9150604084013590509250925092565b6000602082840312156137ab57600080fd5b6130f182613717565b600080604083850312156137c757600080fd5b6137d083613717565b9150602083013580151581146137e557600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561382f5761382f6137f0565b604052919050565b6000602080838503121561384a57600080fd5b823567ffffffffffffffff8082111561386257600080fd5b818501915085601f83011261387657600080fd5b813581811115613888576138886137f0565b8060051b9150613899848301613806565b81815291830184019184810190888411156138b357600080fd5b938501935b838510156138d8576138c985613717565b825293850193908501906138b8565b98975050505050505050565b600067ffffffffffffffff8211156138fe576138fe6137f0565b50601f01601f191660200190565b6000806000806080858703121561392257600080fd5b61392b85613717565b935061393960208601613717565b925060408501359150606085013567ffffffffffffffff81111561395c57600080fd5b8501601f8101871361396d57600080fd5b803561398061397b826138e4565b613806565b81815288602083850101111561399557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156139ca57600080fd5b6139d383613717565b91506139e160208401613717565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008151613a2881856020860161369b565b9290920192915050565b60008351613a4481846020880161369b565b835190830190613a5881836020880161369b565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613a8957613a89613a61565b5060010190565b60008251613aa281846020870161369b565b605d60f81b920191825250600101919050565b600181811c90821680613ac957607f821691505b602082108103613ae957634e487b7160e01b600052602260045260246000fd5b50919050565b818103818111156106c7576106c7613a61565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000613b6161397b846138e4565b9050828152838383011115613b7557600080fd5b6130f183602083018461369b565b600060208284031215613b9557600080fd5b815167ffffffffffffffff811115613bac57600080fd5b8201601f81018413613bbd57600080fd5b61208d84825160208401613b53565b80820281158282048414176106c7576106c7613a61565b808201808211156106c7576106c7613a61565b681e3932b1ba103c1e9160b91b81528351600090613c1b81600985016020890161369b565b6411103c9e9160d91b6009918401918201528451613c4081600e84016020890161369b565b68222066696c6c3d222360b81b600e92909101918201528351613c6a81601784016020880161369b565b6211179f60e91b60179290910191820152601a0195945050505050565b602080825260099082015268536f6c64204f75742160b81b604082015260600190565b6020808252601e908201527f546865206d696e74657220697320616e6f7468657220636f6e74726163740000604082015260600190565b600060208284031215613cf357600080fd5b8151605d81106130f157600080fd5b60208101605d8310613d2457634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215613d3c57600080fd5b8151600d81106130f157600080fd5b600081613d5a57613d5a613a61565b506000190190565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613d8d81600f85016020880161369b565b6b111610113b30b63ab2911d1160a11b600f918401918201528351613db981601b84016020880161369b565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b714f6e636861696e2041706550756e6b73202360701b815260008251613e6981601285016020870161369b565b9190910160120192915050565b607b60f81b815267113730b6b2911d1160c11b60018201528451600090613ea4816009850160208a0161369b565b701116113232b9b1b934b83a34b7b7111d1160791b6009918401918201528551613ed581601a840160208a0161369b565b7f222c226261636b67726f756e645f636f6c6f72223a22303034424646222c2269601a92909101918201527f6d6167655f64617461223a22646174613a696d6167652f7376672b786d6c3b62603a82015265185cd94d8d0b60d21b605a8201528451613f4881606084016020890161369b565b6f011161130ba3a3934b13aba32b9911d160851b60609290910191820152613f83613f766070830186613a16565b607d60f81b815260010190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613fc681601d85016020870161369b565b91909101601d0192915050565b8082018281126000831280158216821582161715613ff357613ff3613a61565b505092915050565b634e487b7160e01b600052600160045260246000fd5b60008261402057614020613dd4565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614058908301846136bf565b9695505050505050565b60006020828403121561407457600080fd5b81516130f181613644565b60008261408e5761408e613dd4565b50049056fe46697273742050465020636f6c6c656374696f6e206f6e20417065436861696e2e3c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d22302030203234203234223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c7265637420783d22302220793d223022207374796c653d2277696474683a313030253b6865696768743a31303025222066696c6c3d222330303442464622202f3e3c67207374796c653d227472616e73666f726d3a207472616e736c6174652863616c6328353025202d2031327078292c2063616c6328353025202d20313270782929223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b9b081c8ee60324533eb1ec7d2ff350212961b3b54e67d4b2fde12f02ddc418a64736f6c634300081200330000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80639896ed1111610118578063d1239730116100a0578063d9685a301161006f578063d9685a30146105cb578063db482312146105eb578063e985e9c51461060b578063ed29b76d1461062b578063f2fde38b1461065b57600080fd5b8063d123973014610539578063d23bf56914610553578063d5abeb0114610573578063d5f39488146105a657600080fd5b8063a4c19a9f116100e7578063a4c19a9f146104ae578063a6f48c90146104c3578063b638aabc146104d9578063b88d4fde146104f9578063c87b56dd1461051957600080fd5b80639896ed11146104465780639dc823b514610466578063a0712d681461047b578063a22cb4651461048e57600080fd5b806342842e0e1161019b5780636817c76c1161016a5780636817c76c146103c857806370a08231146103de578063715018a6146103fe5780638da5cb5b1461041357806395d89b411461043157600080fd5b806342842e0e146103535780634f423a9d146103735780634f558e79146103885780636352211e146103a857600080fd5b8063081812fc116101e2578063081812fc146102af578063095ea7b3146102e757806318160ddd1461030957806323b872dd1461031e5780633ccfd60b1461033e57600080fd5b806301ffc9a714610214578063023abe2b146102495780630451a9f11461027657806306fdde031461029a575b600080fd5b34801561022057600080fd5b5061023461022f36600461365a565b61067b565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004613677565b6106cd565b60405161024091906136eb565b34801561028257600080fd5b5061028c600b5481565b604051908152602001610240565b3480156102a657600080fd5b50610269610a4a565b3480156102bb57600080fd5b506102cf6102ca3660046136fe565b610adc565b6040516001600160a01b039091168152602001610240565b3480156102f357600080fd5b50610307610302366004613733565b610b76565b005b34801561031557600080fd5b5061028c610c8b565b34801561032a57600080fd5b5061030761033936600461375d565b610cc0565b34801561034a57600080fd5b50610307610cf1565b34801561035f57600080fd5b5061030761036e36600461375d565b610d99565b34801561037f57600080fd5b50610307610db4565b34801561039457600080fd5b506102346103a33660046136fe565b610dd9565b3480156103b457600080fd5b506102cf6103c33660046136fe565b610df8565b3480156103d457600080fd5b5061028c600a5481565b3480156103ea57600080fd5b5061028c6103f9366004613799565b610e6f565b34801561040a57600080fd5b50610307610ef6565b34801561041f57600080fd5b506008546001600160a01b03166102cf565b34801561043d57600080fd5b50610269610f08565b34801561045257600080fd5b50610269610461366004613677565b610f17565b34801561047257600080fd5b5061030761122f565b6103076104893660046136fe565b61124b565b34801561049a57600080fd5b506103076104a93660046137b4565b61136d565b3480156104ba57600080fd5b50610307611378565b3480156104cf57600080fd5b5061028c600c5481565b3480156104e557600080fd5b506103076104f4366004613837565b611520565b34801561050557600080fd5b5061030761051436600461390c565b61156b565b34801561052557600080fd5b506102696105343660046136fe565b6115a3565b34801561054557600080fd5b50600d546102349060ff1681565b34801561055f57600080fd5b5061030761056e3660046136fe565b61160a565b34801561057f57600080fd5b507f000000000000000000000000000000000000000000000000000000000000271061028c565b3480156105b257600080fd5b50600d546102cf9061010090046001600160a01b031681565b3480156105d757600080fd5b506103076105e6366004613799565b611617565b3480156105f757600080fd5b506103076106063660046136fe565b61169c565b34801561061757600080fd5b506102346106263660046139b7565b6116a9565b34801561063757600080fd5b50610234610646366004613799565b600e6020526000908152604090205460ff1681565b34801561066757600080fd5b50610307610676366004613799565b6116d7565b60006001600160e01b031982166380ac58cd60e01b14806106ac57506001600160e01b03198216635b5e139f60e01b145b806106c757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006106da8361174d565b9050600080604051806040016040528060018152602001605b60f81b81525090506000604051806101a001604052808560200151605c81111561071f5761071f6139ea565b605c811115610730576107306139ea565b81526020018560400151605c81111561074b5761074b6139ea565b605c81111561075c5761075c6139ea565b81526020018560600151605c811115610777576107776139ea565b605c811115610788576107886139ea565b81526020018560800151605c8111156107a3576107a36139ea565b605c8111156107b4576107b46139ea565b81526020018560a00151605c8111156107cf576107cf6139ea565b605c8111156107e0576107e06139ea565b81526020018560c00151605c8111156107fb576107fb6139ea565b605c81111561080c5761080c6139ea565b81526020018560e00151605c811115610827576108276139ea565b605c811115610838576108386139ea565b8152602001856101000151605c811115610854576108546139ea565b605c811115610865576108656139ea565b8152602001856101200151605c811115610881576108816139ea565b605c811115610892576108926139ea565b8152602001856101400151605c8111156108ae576108ae6139ea565b605c8111156108bf576108bf6139ea565b8152602001856101600151605c8111156108db576108db6139ea565b605c8111156108ec576108ec6139ea565b8152602001856101800151605c811115610908576109086139ea565b605c811115610919576109196139ea565b8152602001856101a00151605c811115610935576109356139ea565b605c811115610946576109466139ea565b90529050600061095585611dd9565b90506000805b600d811015610a1c5760008482600d811061097857610978613a00565b6020020151905086605c811115610991576109916139ea565b81605c8111156109a3576109a36139ea565b14610a0b57856109b282612095565b6040516020016109c3929190613a32565b604051602081830303815290604052955083831015610a0b576040805180820190915260018152600b60fa1b60208201526109ff90879061258b565b610a0883613a77565b92505b50610a1581613a77565b905061095b565b5083604051602001610a2e9190613a90565b6040516020818303038152906040529650505050505050919050565b606060008054610a5990613ab5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8590613ab5565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b0316610b5a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b8182610df8565b9050806001600160a01b0316836001600160a01b031603610bee5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b51565b336001600160a01b0382161480610c0a5750610c0a81336116a9565b610c7c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b51565b610c868383612610565b505050565b60006003547f0000000000000000000000000000000000000000000000000000000000002710610cbb9190613aef565b905090565b610cca338261267e565b610ce65760405162461bcd60e51b8152600401610b5190613b02565b610c8683838361274d565b610cf96128e9565b610d01612943565b604051600090339047908381818185875af1925050503d8060008114610d43576040519150601f19603f3d011682016040523d82523d6000602084013e610d48565b606091505b5050905080610d8c5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b51565b50610d976001600955565b565b610c868383836040518060200160405280600081525061156b565b610dbc6128e9565b610dc4612943565b610dcf3360fa61299c565b610d976001600955565b6000818152600460205260408120546001600160a01b031615156106c7565b6000818152600460205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b51565b60006001600160a01b038216610eda5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b51565b506001600160a01b031660009081526005602052604090205490565b610efe6128e9565b610d976000612b7b565b606060018054610a5990613ab5565b604051631f2f054b60e11b815261ffff821660048201526060906000906001600160a01b037f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc1690633e5e0a9690602401600060405180830381865afa158015610f85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fad9190810190613b83565b604080516202006081019091526202004081526000602090910181815291925050610ff460405180610160016040528061013181526020016140b56101319139829061258b565b60408051600880825281830190925260009160208201818036833701905050905060005b60188110156111fa5760005b60188110156111e75760008161103b846018613bcc565b6110459190613be3565b611050906004613bcc565b9050600086611060836003613be3565b8151811061107057611070613a00565b016020015160f81c11156111d45760005b6004811015611191576000876110978385613be3565b815181106110a7576110a7613a00565b016020015160f81c90506f181899199a1a9b1b9c1cb0b131b232b360811b600f8216601081106110d9576110d9613a00565b1a60f81b866110e9846002613bcc565b6110f4906001613be3565b8151811061110457611104613a00565b60200101906001600160f81b031916908160001a90535060041c600f166f181899199a1a9b1b9c1cb0b131b232b360811b816010811061114657611146613a00565b1a60f81b86611156846002613bcc565b8151811061116657611166613a00565b60200101906001600160f81b031916908160001a90535050808061118990613a77565b915050611081565b50836111d261119f84612bcd565b6111a886612bcd565b836040516020016111bb93929190613bf6565b60408051601f19818403018152919052879061258b565b505b50806111df81613a77565b915050611024565b50806111f281613a77565b915050611018565b5060408051808201909152600a8152691e17b39f1e17b9bb339f60b11b602082015261122790839061258b565b509392505050565b6112376128e9565b600d805460ff19811660ff90911615179055565b600a54600d5460ff166112955760405162461bcd60e51b8152602060048201526012602482015271135a5b9d081b9bdd081c9958591e481e595d60721b6044820152606401610b51565b7f0000000000000000000000000000000000000000000000000000000000002710826112bf610c8b565b6112c99190613be3565b11156112e75760405162461bcd60e51b8152600401610b5190613c87565b6112f18183613bcc565b3410156113405760405162461bcd60e51b815260206004820181905260248201527f506c656173652073656e64207468652065786163742045544820616d6f756e746044820152606401610b51565b33321461135f5760405162461bcd60e51b8152600401610b5190613caa565b611369338361299c565b5050565b611369338383612c5e565b336000908152600e602052604090205460019060ff16156113db5760405162461bcd60e51b815260206004820152601960248201527f46726565204d696e7420616c726561647920636c61696d6564000000000000006044820152606401610b51565b600b54600c541061142e5760405162461bcd60e51b815260206004820152601c60248201527f4672656520736f6c64206f7574202d204d696e742061207061696421000000006044820152606401610b51565b600d5460ff166114775760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610b51565b7f0000000000000000000000000000000000000000000000000000000000002710816114a1610c8b565b6114ab9190613be3565b11156114c95760405162461bcd60e51b8152600401610b5190613c87565b3332146114e85760405162461bcd60e51b8152600401610b5190613caa565b600c546114f6906001613be3565b600c55336000818152600e60205260409020805460ff1916600117905561151d908261299c565b50565b6115286128e9565b600160005b8251811015610c865761155983828151811061154b5761154b613a00565b60200260200101518361299c565b8061156381613a77565b91505061152d565b611575338361267e565b6115915760405162461bcd60e51b8152600401610b5190613b02565b61159d84848484612d2c565b50505050565b6000818152600460205260409020546060906001600160a01b03166116015760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610b51565b6106c782612d5f565b6116126128e9565b600b55565b61161f6128e9565b60017f00000000000000000000000000000000000000000000000000000000000027108161164b610c8b565b6116559190613be3565b11156116735760405162461bcd60e51b8152600401610b5190613c87565b3332146116925760405162461bcd60e51b8152600401610b5190613caa565b611369828261299c565b6116a46128e9565b600a55565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6116df6128e9565b6001600160a01b0381166117445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b51565b61151d81612b7b565b6117bf604080516101c0810190915260008082526020820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101c0810190915261ffff831681526000906020810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905261ffff84168082526040516376dfe29760e01b815260048101919091529091506000907f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc6001600160a01b0316906376dfe29790602401600060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118cc9190810190613b83565b905060006118fc604051806040016040528060018152602001600b60fa1b81525083612e1890919063ffffffff16565b905060005b8151811015611dcf57600082828151811061191e5761191e613a00565b6020026020010151905060606001831015611977576040805180820190915260018152600160fd1b6020820152611956908390612e18565b60008151811061196857611968613a00565b60200260200101519050611994565b611991600183516119889190613aef565b83906001613005565b90505b604051631a2d891b60e31b81526000906001600160a01b037f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc169063d16c48d8906119e39085906004016136eb565b602060405180830381865afa158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a249190613ce1565b605c811115611a3557611a356139ea565b605c811115611a4657611a466139ea565b905060007f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc6001600160a01b031663683375c483605c811115611a8b57611a8b6139ea565b605c811115611a9c57611a9c6139ea565b6040518263ffffffff1660e01b8152600401611ab89190613d02565b602060405180830381865afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af99190613d2a565b600c811115611b0a57611b0a6139ea565b600c811115611b1b57611b1b6139ea565b9050600081600c811115611b3157611b316139ea565b03611b67576020880182605c811115611b4c57611b4c6139ea565b9081605c811115611b5f57611b5f6139ea565b905250611db8565b600181600c811115611b7b57611b7b6139ea565b03611b96576040880182605c811115611b4c57611b4c6139ea565b600281600c811115611baa57611baa6139ea565b03611bc5576060880182605c811115611b4c57611b4c6139ea565b600381600c811115611bd957611bd96139ea565b03611bf4576080880182605c811115611b4c57611b4c6139ea565b600481600c811115611c0857611c086139ea565b03611c235760a0880182605c811115611b4c57611b4c6139ea565b600581600c811115611c3757611c376139ea565b03611c525760c0880182605c811115611b4c57611b4c6139ea565b600681600c811115611c6657611c666139ea565b03611c815760e0880182605c811115611b4c57611b4c6139ea565b600781600c811115611c9557611c956139ea565b03611cb157610100880182605c811115611b4c57611b4c6139ea565b600881600c811115611cc557611cc56139ea565b03611ce157610120880182605c811115611b4c57611b4c6139ea565b600981600c811115611cf557611cf56139ea565b03611d1157610140880182605c811115611b4c57611b4c6139ea565b600a81600c811115611d2557611d256139ea565b03611d4157610160880182605c811115611b4c57611b4c6139ea565b600b81600c811115611d5557611d556139ea565b03611d7157610180880182605c811115611b4c57611b4c6139ea565b600c81600c811115611d8557611d856139ea565b03611db8576101a0880182605c811115611da157611da16139ea565b9081605c811115611db457611db46139ea565b9052505b505050508080611dc790613a77565b915050611901565b5091949350505050565b600080604051806101a001604052808460200151605c811115611dfe57611dfe6139ea565b605c811115611e0f57611e0f6139ea565b81526020018460400151605c811115611e2a57611e2a6139ea565b605c811115611e3b57611e3b6139ea565b81526020018460600151605c811115611e5657611e566139ea565b605c811115611e6757611e676139ea565b81526020018460800151605c811115611e8257611e826139ea565b605c811115611e9357611e936139ea565b81526020018460a00151605c811115611eae57611eae6139ea565b605c811115611ebf57611ebf6139ea565b81526020018460c00151605c811115611eda57611eda6139ea565b605c811115611eeb57611eeb6139ea565b81526020018460e00151605c811115611f0657611f066139ea565b605c811115611f1757611f176139ea565b8152602001846101000151605c811115611f3357611f336139ea565b605c811115611f4457611f446139ea565b8152602001846101200151605c811115611f6057611f606139ea565b605c811115611f7157611f716139ea565b8152602001846101400151605c811115611f8d57611f8d6139ea565b605c811115611f9e57611f9e6139ea565b8152602001846101600151605c811115611fba57611fba6139ea565b605c811115611fcb57611fcb6139ea565b8152602001846101800151605c811115611fe757611fe76139ea565b605c811115611ff857611ff86139ea565b8152602001846101a00151605c811115612014576120146139ea565b605c811115612025576120256139ea565b9052905060005b600d8110156120825760008282600d811061204957612049613a00565b6020020151605c81111561205f5761205f6139ea565b14612072578261206e81613a77565b9350505b61207b81613a77565b905061202c565b508161208d81613d4b565b949350505050565b6060600082605c8111156120ab576120ab6139ea565b036120b557600080fd5b60007f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc6001600160a01b031663fc9faca584605c8111156120f8576120f86139ea565b605c811115612109576121096139ea565b6040518263ffffffff1660e01b81526004016121259190613d02565b600060405180830381865afa158015612142573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261216a9190810190613b83565b9050606060007f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc6001600160a01b031663683375c486605c8111156121b1576121b16139ea565b605c8111156121c2576121c26139ea565b6040518263ffffffff1660e01b81526004016121de9190613d02565b602060405180830381865afa1580156121fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221f9190613d2a565b600c811115612230576122306139ea565b600c811115612241576122416139ea565b9050600081600c811115612257576122576139ea565b0361227f57604051806040016040528060038152602001620a6caf60eb1b815250915061255f565b600181600c811115612293576122936139ea565b036122bc57604051806040016040528060048152602001632430b4b960e11b815250915061255f565b600281600c8111156122d0576122d06139ea565b036122f957604051806040016040528060048152602001634579657360e01b815250915061255f565b600381600c81111561230d5761230d6139ea565b0361233757604051806040016040528060058152602001641099585c9960da1b815250915061255f565b600481600c81111561234b5761234b6139ea565b0361237457604051806040016040528060048152602001634561727360e01b815250915061255f565b600581600c811115612388576123886139ea565b036123b157604051806040016040528060048152602001634c69707360e01b815250915061255f565b600681600c8111156123c5576123c56139ea565b036123ef576040518060400160405280600581526020016409adeeae8d60db1b815250915061255f565b600781600c811115612403576124036139ea565b0361242c57604051806040016040528060048152602001634661636560e01b815250915061255f565b600881600c811115612440576124406139ea565b0361246c576040518060400160405280600781526020016622b6b7ba34b7b760c91b815250915061255f565b600981600c811115612480576124806139ea565b036124a957604051806040016040528060048152602001634e65636b60e01b815250915061255f565b600a81600c8111156124bd576124bd6139ea565b036124e657604051806040016040528060048152602001634e6f736560e01b815250915061255f565b600b81600c8111156124fa576124fa6139ea565b036125255760405180604001604052806006815260200165436865656b7360d01b815250915061255f565b600c81600c811115612539576125396139ea565b0361255f57604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001612572929190613d62565b6040516020818303038152906040529350505050919050565b601f1982015182518251603f199092019182906125a89083613be3565b11156126065760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b6064820152608401610b51565b61159d84846130f8565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061264582610df8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166126f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b51565b600061270283610df8565b9050806001600160a01b0316846001600160a01b0316148061273d5750836001600160a01b031661273284610adc565b6001600160a01b0316145b8061208d575061208d81856116a9565b826001600160a01b031661276082610df8565b6001600160a01b0316146127c45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b51565b6001600160a01b0382166128265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b51565b612831600082612610565b6001600160a01b038316600090815260056020526040812080546001929061285a908490613aef565b90915550506001600160a01b0382166000908152600560205260408120805460019290612888908490613be3565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6008546001600160a01b03163314610d975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b51565b6002600954036129955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b51565b6002600955565b3332146129e35760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc818d85b9b9bdd081b5a5b9d605a1b6044820152606401610b51565b6001600160a01b038216612a395760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b51565b60008111612a9a5760405162461bcd60e51b815260206004820152602860248201527f455243373231723a206e65656420746f206d696e74206174206c65617374206f6044820152673732903a37b5b2b760c11b6064820152608401610b51565b806003541015612b005760405162461bcd60e51b815260206004820152602b60248201527f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686160448201526a6e20617661696c61626c6560a81b6064820152608401610b51565b60035460005b82811015612b43576000612b1a858461312e565b9050612b26858261318c565b612b2f83613d4b565b92505080612b3c90613a77565b9050612b06565b5060038190556001600160a01b03831660009081526005602052604081208054849290612b71908490613be3565b9091555050505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000612bda836131e5565b600101905060008167ffffffffffffffff811115612bfa57612bfa6137f0565b6040519080825280601f01601f191660200182016040528015612c24576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450841561122757612c2e565b816001600160a01b0316836001600160a01b031603612cbf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b51565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d3784848461274d565b612d43848484846132bd565b61159d5760405162461bcd60e51b8152600401610b5190613dea565b60606000612d6c83610f17565b90506000612d7d8461ffff16612bcd565b604051602001612d8d9190613e3c565b60408051601f19818403018152606083019091526021808352909250612df09183916140946020830139612dc0856133be565b612dc9886106cd565b604051602001612ddc9493929190613e76565b6040516020818303038152906040526133be565b604051602001612e009190613f8e565b60405160208183030381529060405292505050919050565b606082600060015b60018351612e2e9190613aef565b821015612e71576000612e42878785613511565b90508019612e505750612e71565b81612e5a81613a77565b9250612e699050816001613be3565b925050612e20565b8067ffffffffffffffff811115612e8a57612e8a6137f0565b604051908082528060200260200182016040528015612ebd57816020015b6060815260200190600190039081612ea85790505b50935060009150600090505b60018351612ed79190613aef565b821015612ffc576000612eeb878785613511565b90508019612ef7575082515b6000612f038483613aef565b67ffffffffffffffff811115612f1b57612f1b6137f0565b6040519080825280601f01601f191660200182016040528015612f45576020820181803683370190505b509050806000855b84811015612fbc57878181518110612f6757612f67613a00565b01602001516001600160f81b0319168383612f8181613a77565b945081518110612f9357612f93613a00565b60200101906001600160f81b031916908160001a90535080612fb481613a77565b915050612f4d565b50612fc8846001613be3565b9550818886612fd681613a77565b975081518110612fe857612fe8613a00565b602002602001018190525050505050612ec9565b50505092915050565b825160609084906130168585613fd3565b111561302457613024613ffb565b60008467ffffffffffffffff81111561303f5761303f6137f0565b6040519080825280601f01601f191660200182016040528015613069576020820181803683370190505b509050806000855b61307b8888613fd3565b8110156130e95784818151811061309457613094613a00565b01602001516001600160f81b03191683836130ae81613a77565b9450815181106130c0576130c0613a00565b60200101906001600160f81b031916908160001a905350806130e181613a77565b915050613071565b509093505050505b9392505050565b8051602082019150808201602084510184015b8184101561312357835181526020938401930161310b565b505082510190915250565b604080516001600160a01b038416602080830191909152308284015260608083018590528351808403909101815260809092019092528051910120600090816131778483614011565b905061318381856135ac565b95945050505050565b60008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106132245772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613250576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061326e57662386f26fc10000830492506010015b6305f5e1008310613286576305f5e100830492506008015b612710831061329a57612710830492506004015b606483106132ac576064830492506002015b600a83106106c75760010192915050565b60006001600160a01b0384163b156133b357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613301903390899088908890600401614025565b6020604051808303816000875af192505050801561333c575060408051601f3d908101601f1916820190925261333991810190614062565b60015b613399573d80801561336a576040519150601f19603f3d011682016040523d82523d6000602084013e61336f565b606091505b5080516000036133915760405162461bcd60e51b8152600401610b5190613dea565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061208d565b506001949350505050565b606081516000036133dd57505060408051602081019091526000815290565b60006040518060600160405280604081526020016141e6604091399050600060038451600261340c9190613be3565b613416919061407f565b613421906004613bcc565b67ffffffffffffffff811115613439576134396137f0565b6040519080825280601f01601f191660200182016040528015613463576020820181803683370190505b509050600182016020820185865187015b808210156134cf576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613474565b50506003865106600181146134eb57600281146134fe57613506565b603d6001830353603d6002830353613506565b603d60018303535b509195945050505050565b81516000908490849060011461352957613529613ffb565b835b825181101561359e578160008151811061354757613547613a00565b602001015160f81c60f81b6001600160f81b03191683828151811061356e5761356e613a00565b01602001516001600160f81b0319160361358c5792506130f1915050565b8061359681613a77565b91505061352b565b506000199695505050505050565b600082815260026020526040812054818181036135ca5750836135cd565b50805b60006135da600186613aef565b6000818152600260205260409020549091508682146136235780600003613611576000878152600260205260409020829055613623565b60008781526002602052604090208190555b8015613639576000828152600260205260408120555b509095945050505050565b6001600160e01b03198116811461151d57600080fd5b60006020828403121561366c57600080fd5b81356130f181613644565b60006020828403121561368957600080fd5b813561ffff811681146130f157600080fd5b60005b838110156136b657818101518382015260200161369e565b50506000910152565b600081518084526136d781602086016020860161369b565b601f01601f19169290920160200192915050565b6020815260006130f160208301846136bf565b60006020828403121561371057600080fd5b5035919050565b80356001600160a01b038116811461372e57600080fd5b919050565b6000806040838503121561374657600080fd5b61374f83613717565b946020939093013593505050565b60008060006060848603121561377257600080fd5b61377b84613717565b925061378960208501613717565b9150604084013590509250925092565b6000602082840312156137ab57600080fd5b6130f182613717565b600080604083850312156137c757600080fd5b6137d083613717565b9150602083013580151581146137e557600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561382f5761382f6137f0565b604052919050565b6000602080838503121561384a57600080fd5b823567ffffffffffffffff8082111561386257600080fd5b818501915085601f83011261387657600080fd5b813581811115613888576138886137f0565b8060051b9150613899848301613806565b81815291830184019184810190888411156138b357600080fd5b938501935b838510156138d8576138c985613717565b825293850193908501906138b8565b98975050505050505050565b600067ffffffffffffffff8211156138fe576138fe6137f0565b50601f01601f191660200190565b6000806000806080858703121561392257600080fd5b61392b85613717565b935061393960208601613717565b925060408501359150606085013567ffffffffffffffff81111561395c57600080fd5b8501601f8101871361396d57600080fd5b803561398061397b826138e4565b613806565b81815288602083850101111561399557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156139ca57600080fd5b6139d383613717565b91506139e160208401613717565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008151613a2881856020860161369b565b9290920192915050565b60008351613a4481846020880161369b565b835190830190613a5881836020880161369b565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613a8957613a89613a61565b5060010190565b60008251613aa281846020870161369b565b605d60f81b920191825250600101919050565b600181811c90821680613ac957607f821691505b602082108103613ae957634e487b7160e01b600052602260045260246000fd5b50919050565b818103818111156106c7576106c7613a61565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000613b6161397b846138e4565b9050828152838383011115613b7557600080fd5b6130f183602083018461369b565b600060208284031215613b9557600080fd5b815167ffffffffffffffff811115613bac57600080fd5b8201601f81018413613bbd57600080fd5b61208d84825160208401613b53565b80820281158282048414176106c7576106c7613a61565b808201808211156106c7576106c7613a61565b681e3932b1ba103c1e9160b91b81528351600090613c1b81600985016020890161369b565b6411103c9e9160d91b6009918401918201528451613c4081600e84016020890161369b565b68222066696c6c3d222360b81b600e92909101918201528351613c6a81601784016020880161369b565b6211179f60e91b60179290910191820152601a0195945050505050565b602080825260099082015268536f6c64204f75742160b81b604082015260600190565b6020808252601e908201527f546865206d696e74657220697320616e6f7468657220636f6e74726163740000604082015260600190565b600060208284031215613cf357600080fd5b8151605d81106130f157600080fd5b60208101605d8310613d2457634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215613d3c57600080fd5b8151600d81106130f157600080fd5b600081613d5a57613d5a613a61565b506000190190565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090613d8d81600f85016020880161369b565b6b111610113b30b63ab2911d1160a11b600f918401918201528351613db981601b84016020880161369b565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b714f6e636861696e2041706550756e6b73202360701b815260008251613e6981601285016020870161369b565b9190910160120192915050565b607b60f81b815267113730b6b2911d1160c11b60018201528451600090613ea4816009850160208a0161369b565b701116113232b9b1b934b83a34b7b7111d1160791b6009918401918201528551613ed581601a840160208a0161369b565b7f222c226261636b67726f756e645f636f6c6f72223a22303034424646222c2269601a92909101918201527f6d6167655f64617461223a22646174613a696d6167652f7376672b786d6c3b62603a82015265185cd94d8d0b60d21b605a8201528451613f4881606084016020890161369b565b6f011161130ba3a3934b13aba32b9911d160851b60609290910191820152613f83613f766070830186613a16565b607d60f81b815260010190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613fc681601d85016020870161369b565b91909101601d0192915050565b8082018281126000831280158216821582161715613ff357613ff3613a61565b505092915050565b634e487b7160e01b600052600160045260246000fd5b60008261402057614020613dd4565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614058908301846136bf565b9695505050505050565b60006020828403121561407457600080fd5b81516130f181613644565b60008261408e5761408e613dd4565b50049056fe46697273742050465020636f6c6c656374696f6e206f6e20417065436861696e2e3c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d22302030203234203234223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c7265637420783d22302220793d223022207374796c653d2277696474683a313030253b6865696768743a31303025222066696c6c3d222330303442464622202f3e3c67207374796c653d227472616e73666f726d3a207472616e736c6174652863616c6328353025202d2031327078292c2063616c6328353025202d20313270782929223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b9b081c8ee60324533eb1ec7d2ff350212961b3b54e67d4b2fde12f02ddc418a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
-----Decoded View---------------
Arg [0] : punkDataContractAddress (address): 0x0FC4340DEFc4Ba506356292fD7f8893d08Dd57DC
Arg [1] : extendedPunkDataContractAddress (address): 0x0FC4340DEFc4Ba506356292fD7f8893d08Dd57DC
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
Arg [1] : 0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
Deployed Bytecode Sourcemap
78689:15709:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61147:305;;;;;;;;;;-1:-1:-1;61147:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;61147:305:0;;;;;;;;91160:1172;;;;;;;;;;-1:-1:-1;91160:1172:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;81216:34::-;;;;;;;;;;;;;;;;;;;1771:25:1;;;1759:2;1744:18;81216:34:0;1625:177:1;62330:100:0;;;;;;;;;;;;;:::i;63891:221::-;;;;;;;;;;-1:-1:-1;63891:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2156:32:1;;;2138:51;;2126:2;2111:18;63891:221:0;1992:203:1;63413:412:0;;;;;;;;;;-1:-1:-1;63413:412:0;;;;;:::i;:::-;;:::i;:::-;;61464:119;;;;;;;;;;;;;:::i;64641:339::-;;;;;;;;;;-1:-1:-1;64641:339:0;;;;;:::i;:::-;;:::i;83228:186::-;;;;;;;;;;;;;:::i;65051:185::-;;;;;;;;;;-1:-1:-1;65051:185:0;;;;;:::i;:::-;;:::i;83422:102::-;;;;;;;;;;;;;:::i;84054:101::-;;;;;;;;;;-1:-1:-1;84054:101:0;;;;;:::i;:::-;;:::i;62024:239::-;;;;;;;;;;-1:-1:-1;62024:239:0;;;;;:::i;:::-;;:::i;81171:38::-;;;;;;;;;;;;;;;;61754:208;;;;;;;;;;-1:-1:-1;61754:208:0;;;;;:::i;:::-;;:::i;40470:103::-;;;;;;;;;;;;;:::i;39822:87::-;;;;;;;;;;-1:-1:-1;39895:6:0;;-1:-1:-1;;;;;39895:6:0;39822:87;;62499:104;;;;;;;;;;;;;:::i;88636:1797::-;;;;;;;;;;-1:-1:-1;88636:1797:0;;;;;:::i;:::-;;:::i;83130:90::-;;;;;;;;;;;;;:::i;81900:427::-;;;;;;:::i;:::-;;:::i;64184:155::-;;;;;;;;;;-1:-1:-1;64184:155:0;;;;;:::i;:::-;;:::i;82335:559::-;;;;;;;;;;;;;:::i;81257:32::-;;;;;;;;;;;;;;;;83821:225;;;;;;;;;;-1:-1:-1;83821:225:0;;;;;:::i;:::-;;:::i;65307:328::-;;;;;;;;;;-1:-1:-1;65307:328:0;;;;;:::i;:::-;;:::i;84163:185::-;;;;;;;;;;-1:-1:-1;84163:185:0;;;;;:::i;:::-;;:::i;81296:36::-;;;;;;;;;;-1:-1:-1;81296:36:0;;;;;;;;83008:114;;;;;;;;;;-1:-1:-1;83008:114:0;;;;;:::i;:::-;;:::i;61595:95::-;;;;;;;;;;-1:-1:-1;61672:10:0;61595:95;;81339:24;;;;;;;;;;-1:-1:-1;81339:24:0;;;;;;;-1:-1:-1;;;;;81339:24:0;;;83532:281;;;;;;;;;;-1:-1:-1;83532:281:0;;;;;:::i;:::-;;:::i;82902:98::-;;;;;;;;;;-1:-1:-1;82902:98:0;;;;;:::i;:::-;;:::i;64410:164::-;;;;;;;;;;-1:-1:-1;64410:164:0;;;;;:::i;:::-;;:::i;81372:45::-;;;;;;;;;;-1:-1:-1;81372:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40728:201;;;;;;;;;;-1:-1:-1;40728:201:0;;;;;:::i;:::-;;:::i;61147:305::-;61249:4;-1:-1:-1;;;;;;61286:40:0;;-1:-1:-1;;;61286:40:0;;:105;;-1:-1:-1;;;;;;;61343:48:0;;-1:-1:-1;;;61343:48:0;61286:105;:158;;;-1:-1:-1;;;;;;;;;;53660:40:0;;;61408:36;61266:178;61147:305;-1:-1:-1;;61147:305:0:o;91160:1172::-;91226:18;91257:16;91276:22;91291:6;91276:14;:22::i;:::-;91257:41;;91309:23;91379:19;:25;;;;;;;;;;;;;-1:-1:-1;;;91379:25:0;;;;;91425:39;:372;;;;;;;;91482:4;:8;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91505:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91529:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91553:4;:10;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91578:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91602:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91626:4;:10;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91651:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91675:4;:12;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91702:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91726:4;:9;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91750:4;:11;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;91776:4;:10;;;91425:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;-1:-1:-1;91810:14:0;91827:24;91846:4;91827:18;:24::i;:::-;91810:41;;91862:10;91894:6;91889:371;91910:2;91906:1;:6;91889:371;;;91934:26;91963:9;91973:1;91963:12;;;;;;;:::i;:::-;;;;;91934:41;;92007:4;91996:15;;;;;;;;:::i;:::-;:7;:15;;;;;;;;:::i;:::-;;91992:257;;92058:6;92066:28;92086:7;92066:19;:28::i;:::-;92041:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92032:63;;92128:9;92120:5;:17;92116:118;;;92162:22;;;;;;;;;;;;-1:-1:-1;;;92162:22:0;;;;;;:6;;:17;:22::i;:::-;92207:7;;;:::i;:::-;;;92116:118;-1:-1:-1;91914:3:0;;;:::i;:::-;;;91889:371;;;;92311:6;92294:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;92280:44;;;;;;;;91160:1172;;;:::o;62330:100::-;62384:13;62417:5;62410:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62330:100;:::o;63891:221::-;63967:7;67234:16;;;:7;:16;;;;;;-1:-1:-1;;;;;67234:16:0;63987:73;;;;-1:-1:-1;;;63987:73:0;;8510:2:1;63987:73:0;;;8492:21:1;8549:2;8529:18;;;8522:30;8588:34;8568:18;;;8561:62;-1:-1:-1;;;8639:18:1;;;8632:42;8691:19;;63987:73:0;;;;;;;;;-1:-1:-1;64080:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;64080:24:0;;63891:221::o;63413:412::-;63494:13;63510:24;63526:7;63510:15;:24::i;:::-;63494:40;;63559:5;-1:-1:-1;;;;;63553:11:0;:2;-1:-1:-1;;;;;63553:11:0;;63545:57;;;;-1:-1:-1;;;63545:57:0;;8923:2:1;63545:57:0;;;8905:21:1;8962:2;8942:18;;;8935:30;9001:34;8981:18;;;8974:62;-1:-1:-1;;;9052:18:1;;;9045:31;9093:19;;63545:57:0;8721:397:1;63545:57:0;38453:10;-1:-1:-1;;;;;63637:21:0;;;;:62;;-1:-1:-1;63662:37:0;63679:5;38453:10;64410:164;:::i;63662:37::-;63615:168;;;;-1:-1:-1;;;63615:168:0;;9325:2:1;63615:168:0;;;9307:21:1;9364:2;9344:18;;;9337:30;9403:34;9383:18;;;9376:62;9474:26;9454:18;;;9447:54;9518:19;;63615:168:0;9123:420:1;63615:168:0;63796:21;63805:2;63809:7;63796:8;:21::i;:::-;63483:342;63413:412;;:::o;61464:119::-;61516:7;61556:19;;61543:10;:32;;;;:::i;:::-;61536:39;;61464:119;:::o;64641:339::-;64836:41;38453:10;64869:7;64836:18;:41::i;:::-;64828:103;;;;-1:-1:-1;;;64828:103:0;;;;;;;:::i;:::-;64944:28;64954:4;64960:2;64964:7;64944:9;:28::i;83228:186::-;39708:13;:11;:13::i;:::-;21894:21:::1;:19;:21::i;:::-;83310:49:::2;::::0;83292:12:::2;::::0;83310:10:::2;::::0;83333:21:::2;::::0;83292:12;83310:49;83292:12;83310:49;83333:21;83310:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83291:68;;;83378:7;83370:36;;;::::0;-1:-1:-1;;;83370:36:0;;10511:2:1;83370:36:0::2;::::0;::::2;10493:21:1::0;10550:2;10530:18;;;10523:30;-1:-1:-1;;;10569:18:1;;;10562:46;10625:18;;83370:36:0::2;10309:340:1::0;83370:36:0::2;83280:134;21938:20:::1;21332:1:::0;22458:7;:22;22275:213;21938:20:::1;83228:186::o:0;65051:185::-;65189:39;65206:4;65212:2;65216:7;65189:39;;;;;;;;;;;;:16;:39::i;83422:102::-;39708:13;:11;:13::i;:::-;21894:21:::1;:19;:21::i;:::-;83486:28:::2;83498:10;83510:3;83486:11;:28::i;:::-;21938:20:::1;21332:1:::0;22458:7;:22;22275:213;84054:101;84107:4;67234:16;;;:7;:16;;;;;;-1:-1:-1;;;;;67234:16:0;:30;;84131:16;67145:127;62024:239;62096:7;62132:16;;;:7;:16;;;;;;-1:-1:-1;;;;;62132:16:0;;62159:73;;;;-1:-1:-1;;;62159:73:0;;10856:2:1;62159:73:0;;;10838:21:1;10895:2;10875:18;;;10868:30;10934:34;10914:18;;;10907:62;-1:-1:-1;;;10985:18:1;;;10978:39;11034:19;;62159:73:0;10654:405:1;61754:208:0;61826:7;-1:-1:-1;;;;;61854:19:0;;61846:74;;;;-1:-1:-1;;;61846:74:0;;11266:2:1;61846:74:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:34;11324:18;;;11317:62;-1:-1:-1;;;11395:18:1;;;11388:40;11445:19;;61846:74:0;11064:406:1;61846:74:0;-1:-1:-1;;;;;;61938:16:0;;;;;:9;:16;;;;;;;61754:208::o;40470:103::-;39708:13;:11;:13::i;:::-;40535:30:::1;40562:1;40535:18;:30::i;62499:104::-:0;62555:13;62588:7;62581:14;;;;;:::i;88636:1797::-;88741:43;;-1:-1:-1;;;88741:43:0;;11649:6:1;11637:19;;88741:43:0;;;11619:38:1;88693:13:0;;88719:19;;-1:-1:-1;;;;;88741:16:0;:26;;;;11592:18:1;;88741:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;88741:43:0;;;;;;;;;;;;:::i;:::-;16786:4;16780:11;;17099:20;;;17137:25;;;17275:19;17312:25;;88795:21;17467:4;17452:20;;;17531:17;;;88719:65;;-1:-1:-1;88795:58:0;88874:328;;;;;;;;;;;;;;;;;;:8;;:19;:328::i;:::-;89245:12;;;89255:1;89245:12;;;;;;;;;89223:19;;89245:12;;;;;;;;;;-1:-1:-1;89245:12:0;89223:34;;89273:9;89268:1070;89292:2;89288:1;:6;89268:1070;;;89321:9;89316:1011;89340:2;89336:1;:6;89316:1011;;;89368:9;89390:1;89381:6;:1;89385:2;89381:6;:::i;:::-;:10;;;;:::i;:::-;89380:16;;89395:1;89380:16;:::i;:::-;89368:28;-1:-1:-1;89442:1:0;89425:6;89432:5;89368:28;89436:1;89432:5;:::i;:::-;89425:13;;;;;;;;:::i;:::-;;;;;;;89419:24;89415:897;;;89473:9;89468:321;89492:1;89488;:5;89468:321;;;89527:11;89547:6;89554:5;89558:1;89554;:5;:::i;:::-;89547:13;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;89655:3:0;89647:11;;89634:25;;;;;;;:::i;:::-;;;;89614:6;89621:5;:1;89625;89621:5;:::i;:::-;:9;;89629:1;89621:9;:::i;:::-;89614:17;;;;;;;;:::i;:::-;;;;:45;-1:-1:-1;;;;;89614:45:0;;;;;;;;-1:-1:-1;89696:1:0;89686:11;;;-1:-1:-1;;;89686:11:0;89740:25;;;;;;;:::i;:::-;;;;89724:6;89731:5;:1;89735;89731:5;:::i;:::-;89724:13;;;;;;;;:::i;:::-;;;;:41;-1:-1:-1;;;;;89724:41:0;;;;;;;;;89500:289;89495:3;;;;;:::i;:::-;;;;89468:321;;;-1:-1:-1;89845:6:0;89897:395;90032:12;:1;:10;:12::i;:::-;90113;:1;:10;:12::i;:::-;90198:8;89943:326;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;89943:326:0;;;;;;;;;89897:8;;:19;:395::i;:::-;89445:867;89415:897;-1:-1:-1;89344:3:0;;;;:::i;:::-;;;;89316:1011;;;-1:-1:-1;89296:3:0;;;;:::i;:::-;;;;89268:1070;;;-1:-1:-1;90358:33:0;;;;;;;;;;;;-1:-1:-1;;;90358:33:0;;;;;;:8;;:19;:33::i;:::-;-1:-1:-1;90416:8:0;88636:1797;-1:-1:-1;;;88636:1797:0:o;83130:90::-;39708:13;:11;:13::i;:::-;83201:11:::1;::::0;;-1:-1:-1;;83186:26:0;::::1;83201:11;::::0;;::::1;83200:12;83186:26;::::0;;83130:90::o;81900:427::-;81983:9;;82013:11;;;;82005:42;;;;-1:-1:-1;;;82005:42:0;;14320:2:1;82005:42:0;;;14302:21:1;14359:2;14339:18;;;14332:30;-1:-1:-1;;;14378:18:1;;;14371:48;14436:18;;82005:42:0;14118:342:1;82005:42:0;61672:10;82082:5;82066:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:36;;82058:58;;;;-1:-1:-1;;;82058:58:0;;;;;;;:::i;:::-;82148:12;82156:4;82148:5;:12;:::i;:::-;82135:9;:25;;82127:70;;;;-1:-1:-1;;;82127:70:0;;15004:2:1;82127:70:0;;;14986:21:1;;;15023:18;;;15016:30;15082:34;15062:18;;;15055:62;15134:18;;82127:70:0;14802:356:1;82127:70:0;82216:10;82230:9;82216:23;82208:66;;;;-1:-1:-1;;;82208:66:0;;;;;;;:::i;:::-;82287:30;82299:10;82311:5;82287:11;:30::i;:::-;81947:380;81900:427;:::o;64184:155::-;64279:52;38453:10;64312:8;64322;64279:18;:52::i;82335:559::-;82437:10;82377:13;82423:25;;;:13;:25;;;;;;82393:1;;82423:25;;:34;82415:72;;;;-1:-1:-1;;;82415:72:0;;15724:2:1;82415:72:0;;;15706:21:1;15763:2;15743:18;;;15736:30;15802:27;15782:18;;;15775:55;15847:18;;82415:72:0;15522:349:1;82415:72:0;82518:10;;82506:9;;:22;82498:63;;;;-1:-1:-1;;;82498:63:0;;16078:2:1;82498:63:0;;;16060:21:1;16117:2;16097:18;;;16090:30;16156;16136:18;;;16129:58;16204:18;;82498:63:0;15876:352:1;82498:63:0;82580:11;;;;82572:44;;;;-1:-1:-1;;;82572:44:0;;16435:2:1;82572:44:0;;;16417:21:1;16474:2;16454:18;;;16447:30;-1:-1:-1;;;16493:18:1;;;16486:50;16553:18;;82572:44:0;16233:344:1;82572:44:0;61672:10;82651:5;82635:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:36;;82627:58;;;;-1:-1:-1;;;82627:58:0;;;;;;;:::i;:::-;82704:10;82718:9;82704:23;82696:66;;;;-1:-1:-1;;;82696:66:0;;;;;;;:::i;:::-;82787:9;;:13;;82799:1;82787:13;:::i;:::-;82775:9;:25;82825:10;82811:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;82811:32:0;82839:4;82811:32;;;82854:30;;82878:5;82854:11;:30::i;:::-;82366:528;82335:559::o;83821:225::-;39708:13;:11;:13::i;:::-;83919:1:::1;83903:13;83931:108;83955:10;:17;83951:1;:21;83931:108;;;83994:33;84006:10;84017:1;84006:13;;;;;;;;:::i;:::-;;;;;;;84021:5;83994:11;:33::i;:::-;83974:3:::0;::::1;::::0;::::1;:::i;:::-;;;;83931:108;;65307:328:::0;65482:41;38453:10;65515:7;65482:18;:41::i;:::-;65474:103;;;;-1:-1:-1;;;65474:103:0;;;;;;;:::i;:::-;65588:39;65602:4;65608:2;65612:7;65621:5;65588:13;:39::i;:::-;65307:328;;;;:::o;84163:185::-;67210:4;67234:16;;;:7;:16;;;;;;84223:13;;-1:-1:-1;;;;;67234:16:0;84249:44;;;;-1:-1:-1;;;84249:44:0;;16784:2:1;84249:44:0;;;16766:21:1;16823:2;16803:18;;;16796:30;-1:-1:-1;;;16842:18:1;;;16835:50;16902:18;;84249:44:0;16582:344:1;84249:44:0;84311:29;84336:2;84311:17;:29::i;83008:114::-;39708:13;:11;:13::i;:::-;83078:10:::1;:24:::0;83008:114::o;83532:281::-;39708:13;:11;:13::i;:::-;83617:1:::1;61672:10:::0;83655:5:::1;83639:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:36;;83631:58;;;;-1:-1:-1::0;;;83631:58:0::1;;;;;;;:::i;:::-;83708:10;83722:9;83708:23;83700:66;;;;-1:-1:-1::0;;;83700:66:0::1;;;;;;;:::i;:::-;83777:26;83789:6;83797:5;83777:11;:26::i;82902:98::-:0;39708:13;:11;:13::i;:::-;82962:9:::1;:18:::0;82902:98::o;64410:164::-;-1:-1:-1;;;;;64531:25:0;;;64507:4;64531:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64410:164::o;40728:201::-;39708:13;:11;:13::i;:::-;-1:-1:-1;;;;;40817:22:0;::::1;40809:73;;;::::0;-1:-1:-1;;;40809:73:0;;17133:2:1;40809:73:0::1;::::0;::::1;17115:21:1::0;17172:2;17152:18;;;17145:30;17211:34;17191:18;;;17184:62;-1:-1:-1;;;17262:18:1;;;17255:36;17308:19;;40809:73:0::1;16931:402:1::0;40809:73:0::1;40893:28;40912:8;40893:18;:28::i;85454:3107::-:0;85515:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85515:11:0;85558:621;;;;;;;;;;;;;;85539:16;;85558:621;;;85539:16;85558:621;;;;85652:23;85558:621;;;;85696:23;85558:621;;;;85741:23;85558:621;;;;85785:23;85558:621;;;;85829:23;85558:621;;;;85874:23;85558:621;;;;85918:23;85558:621;;;;85965:23;85558:621;;;;86009:23;85558:621;;;;86053:23;85558:621;;;;86099:23;85558:621;;;;86144:23;85558:621;;86200:16;;;;;;86264:40;;-1:-1:-1;;;86264:40:0;;;;;11619:38:1;;;;86200:16:0;;-1:-1:-1;86200:7:0;;86264:16;-1:-1:-1;;;;;86264:31:0;;;;11592:18:1;;86264:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86264:40:0;;;;;;;;;;;;:::i;:::-;86237:67;;86317:30;86350:21;;;;;;;;;;;;;;-1:-1:-1;;;86350:21:0;;;:10;:16;;:21;;;;:::i;:::-;86317:54;;86397:6;86392:2130;86413:14;:21;86409:1;:25;86392:2130;;;86456:32;86491:14;86506:1;86491:17;;;;;;;;:::i;:::-;;;;;;;86456:52;;86523:30;86590:1;86586;:5;86582:232;;;86631:29;;;;;;;;;;;;-1:-1:-1;;;86631:29:0;;;;;;:18;;:24;:29::i;:::-;86661:1;86631:32;;;;;;;;:::i;:::-;;;;;;;86612:51;;86582:232;;;86723:75;86792:1;86763:18;86757:32;:36;;;;:::i;:::-;86723:18;;86796:1;86723:29;:75::i;:::-;86704:94;;86582:232;86897:66;;-1:-1:-1;;;86897:66:0;;86842:28;;-1:-1:-1;;;;;86897:24:0;:48;;;;:66;;86946:16;;86897:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86892:72;;;;;;;;:::i;:::-;86873:92;;;;;;;;:::i;:::-;86842:123;;86980:26;87032:24;-1:-1:-1;;;;;87032:51:0;;87134:9;87129:15;;;;;;;;:::i;:::-;87084:61;;;;;;;;:::i;:::-;87032:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;87027:120;;;;;;;;:::i;:::-;87009:139;;;;;;;;:::i;:::-;86980:168;-1:-1:-1;87193:21:0;87181:8;:33;;;;;;;;:::i;:::-;;87177:1334;;87235:8;;;87246:9;87235:20;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;87177:1334:0;;;87293:22;87281:8;:34;;;;;;;;:::i;:::-;;87277:1234;;87336:9;;;87348;87336:21;;;;;;;;:::i;87277:1234::-;87395:22;87383:8;:34;;;;;;;;:::i;:::-;;87379:1132;;87438:9;;;87450;87438:21;;;;;;;;:::i;87379:1132::-;87497:23;87485:8;:35;;;;;;;;:::i;:::-;;87481:1030;;87541:10;;;87554:9;87541:22;;;;;;;;:::i;87481:1030::-;87601:22;87589:8;:34;;;;;;;;:::i;:::-;;87585:926;;87644:9;;;87656;87644:21;;;;;;;;:::i;87585:926::-;87703:22;87691:8;:34;;;;;;;;:::i;:::-;;87687:824;;87746:9;;;87758;87746:21;;;;;;;;:::i;87687:824::-;87805:23;87793:8;:35;;;;;;;;:::i;:::-;;87789:722;;87849:10;;;87862:9;87849:22;;;;;;;;:::i;87789:722::-;87909:22;87897:8;:34;;;;;;;;:::i;:::-;;87893:618;;87952:9;;;87964;87952:21;;;;;;;;:::i;87893:618::-;88011:25;87999:8;:37;;;;;;;;:::i;:::-;;87995:516;;88057:12;;;88072:9;88057:24;;;;;;;;:::i;87995:516::-;88119:22;88107:8;:34;;;;;;;;:::i;:::-;;88103:408;;88162:9;;;88174;88162:21;;;;;;;;:::i;88103:408::-;88221:22;88209:8;:34;;;;;;;;:::i;:::-;;88205:306;;88264:9;;;88276;88264:21;;;;;;;;:::i;88205:306::-;88323:24;88311:8;:36;;;;;;;;:::i;:::-;;88307:204;;88368:11;;;88382:9;88368:23;;;;;;;;:::i;88307:204::-;88429:23;88417:8;:35;;;;;;;;:::i;:::-;;88413:98;;88473:10;;;88486:9;88473:22;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;88413:98:0;86441:2081;;;;86436:3;;;;;:::i;:::-;;;;86392:2130;;;-1:-1:-1;88549:4:0;;85454:3107;-1:-1:-1;;;;85454:3107:0:o;90441:711::-;90509:15;90537:39;:372;;;;;;;;90594:4;:8;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90617:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90641:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90665:4;:10;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90690:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90714:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90738:4;:10;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90763:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90787:4;:12;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90814:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90838:4;:9;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90862:4;:11;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;90888:4;:10;;;90537:372;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;-1:-1:-1;90935:6:0;90930:148;90951:2;90947:1;:6;90930:148;;;90995:23;90979:9;90989:1;90979:12;;;;;;;:::i;:::-;;;;;:39;;;;;;;;:::i;:::-;;90975:92;;91039:12;;;;:::i;:::-;;;;90975:92;90955:3;;;:::i;:::-;;;90930:148;;;-1:-1:-1;91132:12:0;;;;:::i;:::-;;90441:711;-1:-1:-1;;;;90441:711:0:o;92340:2053::-;92422:18;92474:23;92461:9;:36;;;;;;;;:::i;:::-;;92453:45;;;;;;92511:31;92545:24;-1:-1:-1;;;;;92545:48:0;;92644:9;92639:15;;;;;;;;:::i;:::-;92594:61;;;;;;;;:::i;:::-;92545:111;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92545:111:0;;;;;;;;;;;;:::i;:::-;92511:145;;92667:35;92723:26;92775:24;-1:-1:-1;;;;;92775:51:0;;92877:9;92872:15;;;;;;;;:::i;:::-;92827:61;;;;;;;;:::i;:::-;92775:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92770:120;;;;;;;;:::i;:::-;92752:139;;;;;;;;:::i;:::-;92723:168;-1:-1:-1;92920:21:0;92908:8;:33;;;;;;;;:::i;:::-;;92904:1347;;92958:29;;;;;;;;;;;;;-1:-1:-1;;;92958:29:0;;;;;92904:1347;;;93021:22;93009:8;:34;;;;;;;;:::i;:::-;;93005:1246;;93060:30;;;;;;;;;;;;;-1:-1:-1;;;93060:30:0;;;;;93005:1246;;;93124:22;93112:8;:34;;;;;;;;:::i;:::-;;93108:1143;;93163:30;;;;;;;;;;;;;-1:-1:-1;;;93163:30:0;;;;;93108:1143;;;93227:23;93215:8;:35;;;;;;;;:::i;:::-;;93211:1040;;93267:31;;;;;;;;;;;;;-1:-1:-1;;;93267:31:0;;;;;93211:1040;;;93332:22;93320:8;:34;;;;;;;;:::i;:::-;;93316:935;;93371:30;;;;;;;;;;;;;-1:-1:-1;;;93371:30:0;;;;;93316:935;;;93435:22;93423:8;:34;;;;;;;;:::i;:::-;;93419:832;;93474:30;;;;;;;;;;;;;-1:-1:-1;;;93474:30:0;;;;;93419:832;;;93538:23;93526:8;:35;;;;;;;;:::i;:::-;;93522:729;;93578:31;;;;;;;;;;;;;-1:-1:-1;;;93578:31:0;;;;;93522:729;;;93643:22;93631:8;:34;;;;;;;;:::i;:::-;;93627:624;;93682:30;;;;;;;;;;;;;-1:-1:-1;;;93682:30:0;;;;;93627:624;;;93746:25;93734:8;:37;;;;;;;;:::i;:::-;;93730:521;;93788:33;;;;;;;;;;;;;-1:-1:-1;;;93788:33:0;;;;;93730:521;;;93855:22;93843:8;:34;;;;;;;;:::i;:::-;;93839:412;;93894:30;;;;;;;;;;;;;-1:-1:-1;;;93894:30:0;;;;;93839:412;;;93958:22;93946:8;:34;;;;;;;;:::i;:::-;;93942:309;;93997:30;;;;;;;;;;;;;-1:-1:-1;;;93997:30:0;;;;;93942:309;;;94061:24;94049:8;:36;;;;;;;;:::i;:::-;;94045:206;;94102:32;;;;;;;;;;;;;-1:-1:-1;;;94102:32:0;;;;;94045:206;;;94168:23;94156:8;:35;;;;;;;;:::i;:::-;;94152:99;;94208:31;;;;;;;;;;;;;-1:-1:-1;;;94208:31:0;;;;;94152:99;94321:21;94360:17;94285:99;;;;;;;;;:::i;:::-;;;;;;;;;;;;;94271:114;;;;;92340:2053;;;:::o;19107:437::-;-1:-1:-1;;19290:17:0;;19284:24;19339:13;;19406:11;;-1:-1:-1;;19280:35:0;;;;;;19397:20;;19339:13;19397:20;:::i;:::-;:32;;19375:121;;;;-1:-1:-1;;;19375:121:0;;20095:2:1;19375:121:0;;;20077:21:1;20134:2;20114:18;;;20107:30;20173:34;20153:18;;;20146:62;-1:-1:-1;;;20224:18:1;;;20217:37;20271:19;;19375:121:0;19893:403:1;19375:121:0;19507:29;19523:6;19531:4;19507:15;:29::i;73216:175::-;73291:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;73291:29:0;-1:-1:-1;;;;;73291:29:0;;;;;;;;:24;;73345;73291;73345:15;:24::i;:::-;-1:-1:-1;;;;;73336:47:0;;;;;;;;;;;73216:175;;:::o;67439:349::-;67532:4;67234:16;;;:7;:16;;;;;;-1:-1:-1;;;;;67234:16:0;67549:73;;;;-1:-1:-1;;;67549:73:0;;20503:2:1;67549:73:0;;;20485:21:1;20542:2;20522:18;;;20515:30;20581:34;20561:18;;;20554:62;-1:-1:-1;;;20632:18:1;;;20625:42;20684:19;;67549:73:0;20301:408:1;67549:73:0;67633:13;67649:24;67665:7;67649:15;:24::i;:::-;67633:40;;67703:5;-1:-1:-1;;;;;67692:16:0;:7;-1:-1:-1;;;;;67692:16:0;;:51;;;;67736:7;-1:-1:-1;;;;;67712:31:0;:20;67724:7;67712:11;:20::i;:::-;-1:-1:-1;;;;;67712:31:0;;67692:51;:87;;;;67747:32;67764:5;67771:7;67747:16;:32::i;72472:626::-;72632:4;-1:-1:-1;;;;;72604:32:0;:24;72620:7;72604:15;:24::i;:::-;-1:-1:-1;;;;;72604:32:0;;72596:82;;;;-1:-1:-1;;;72596:82:0;;20916:2:1;72596:82:0;;;20898:21:1;20955:2;20935:18;;;20928:30;20994:34;20974:18;;;20967:62;-1:-1:-1;;;21045:18:1;;;21038:35;21090:19;;72596:82:0;20714:401:1;72596:82:0;-1:-1:-1;;;;;72697:16:0;;72689:65;;;;-1:-1:-1;;;72689:65:0;;21322:2:1;72689:65:0;;;21304:21:1;21361:2;21341:18;;;21334:30;21400:34;21380:18;;;21373:62;-1:-1:-1;;;21451:18:1;;;21444:34;21495:19;;72689:65:0;21120:400:1;72689:65:0;72871:29;72888:1;72892:7;72871:8;:29::i;:::-;-1:-1:-1;;;;;72913:15:0;;;;;;:9;:15;;;;;:20;;72932:1;;72913:15;:20;;72932:1;;72913:20;:::i;:::-;;;;-1:-1:-1;;;;;;;72944:13:0;;;;;;:9;:13;;;;;:18;;72961:1;;72944:13;:18;;72961:1;;72944:18;:::i;:::-;;;;-1:-1:-1;;72973:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;72973:21:0;-1:-1:-1;;;;;72973:21:0;;;;;;;;;73012:27;;72973:16;;73012:27;;;;;;;63483:342;63413:412;;:::o;39987:132::-;39895:6;;-1:-1:-1;;;;;39895:6:0;38453:10;40051:23;40043:68;;;;-1:-1:-1;;;40043:68:0;;21727:2:1;40043:68:0;;;21709:21:1;;;21746:18;;;21739:30;21805:34;21785:18;;;21778:62;21857:18;;40043:68:0;21525:356:1;21974:293:0;21376:1;22108:7;;:19;22100:63;;;;-1:-1:-1;;;22100:63:0;;22088:2:1;22100:63:0;;;22070:21:1;22127:2;22107:18;;;22100:30;22166:33;22146:18;;;22139:61;22217:18;;22100:63:0;21886:355:1;22100:63:0;21376:1;22241:7;:18;21974:293::o;68108:984::-;38453:10;68210:9;68194:25;68186:59;;;;-1:-1:-1;;;68186:59:0;;22448:2:1;68186:59:0;;;22430:21:1;22487:2;22467:18;;;22460:30;-1:-1:-1;;;22506:18:1;;;22499:51;22567:18;;68186:59:0;22246:345:1;68186:59:0;-1:-1:-1;;;;;68264:16:0;;68256:61;;;;-1:-1:-1;;;68256:61:0;;22798:2:1;68256:61:0;;;22780:21:1;;;22817:18;;;22810:30;22876:34;22856:18;;;22849:62;22928:18;;68256:61:0;22596:356:1;68256:61:0;68349:1;68336:10;:14;68328:67;;;;-1:-1:-1;;;68328:67:0;;23159:2:1;68328:67:0;;;23141:21:1;23198:2;23178:18;;;23171:30;23237:34;23217:18;;;23210:62;-1:-1:-1;;;23288:18:1;;;23281:38;23336:19;;68328:67:0;22957:404:1;68328:67:0;68549:10;68526:19;;:33;;68518:89;;;;-1:-1:-1;;;68518:89:0;;23568:2:1;68518:89:0;;;23550:21:1;23607:2;23587:18;;;23580:30;23646:34;23626:18;;;23619:62;-1:-1:-1;;;23697:18:1;;;23690:41;23748:19;;68518:89:0;23366:407:1;68518:89:0;68661:19;;68628:30;68691:288;68711:10;68707:1;:14;68691:288;;;68768:15;68786:56;68812:2;68816:25;68786;:56::i;:::-;68768:74;;68871:40;68899:2;68903:7;68871:27;:40::i;:::-;68940:27;;;:::i;:::-;;;68728:251;68723:3;;;;:::i;:::-;;;68691:288;;;-1:-1:-1;68999:19:0;:47;;;-1:-1:-1;;;;;69057:13:0;;;;;;:9;:13;;;;;:27;;69074:10;;69057:13;:27;;69074:10;;69057:27;:::i;:::-;;;;-1:-1:-1;;;;;68108:984:0:o;41089:191::-;41182:6;;;-1:-1:-1;;;;;41199:17:0;;;-1:-1:-1;;;;;;41199:17:0;;;;;;;41232:40;;41182:6;;;41199:17;41182:6;;41232:40;;41163:16;;41232:40;41152:128;41089:191;:::o;35800:716::-;35856:13;35907:14;35924:17;35935:5;35924:10;:17::i;:::-;35944:1;35924:21;35907:38;;35960:20;35994:6;35983:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35983:18:0;-1:-1:-1;35960:41:0;-1:-1:-1;36125:28:0;;;36141:2;36125:28;36182:288;-1:-1:-1;;36214:5:0;-1:-1:-1;;;36351:2:0;36340:14;;36335:30;36214:5;36322:44;36412:2;36403:11;;;-1:-1:-1;36433:21:0;;36449:5;36433:21;36182:288;;73533:315;73688:8;-1:-1:-1;;;;;73679:17:0;:5;-1:-1:-1;;;;;73679:17:0;;73671:55;;;;-1:-1:-1;;;73671:55:0;;24112:2:1;73671:55:0;;;24094:21:1;24151:2;24131:18;;;24124:30;24190:27;24170:18;;;24163:55;24235:18;;73671:55:0;23910:349:1;73671:55:0;-1:-1:-1;;;;;73737:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;73737:46:0;;;;;;;;;;73799:41;;540::1;;;73799::0;;513:18:1;73799:41:0;;;;;;;73533:315;;;:::o;66517:::-;66674:28;66684:4;66690:2;66694:7;66674:9;:28::i;:::-;66721:48;66744:4;66750:2;66754:7;66763:5;66721:22;:48::i;:::-;66713:111;;;;-1:-1:-1;;;66713:111:0;;;;;;;:::i;84356:1090::-;84421:13;84447:16;84472:19;84483:7;84472:10;:19::i;:::-;84447:45;;84503:18;84563;:7;:16;;;:18::i;:::-;84524:58;;;;;;;;:::i;:::-;;;;-1:-1:-1;;84524:58:0;;;;;;84982:16;;;;;;;;;;84524:58;;-1:-1:-1;84741:663:0;;84524:58;;84982:16;84524:58;84982:16;;;85146:18;85160:3;85146:13;:18::i;:::-;85255:29;85276:7;85255:20;:29::i;:::-;84817:537;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84741:13;:663::i;:::-;84648:775;;;;;;;;:::i;:::-;;;;;;;;;;;;;84603:835;;;;84356:1090;;;:::o;9573:1267::-;9681:24;9750:5;9718:23;9816:1;9828:280;9865:1;9845:10;:17;:21;;;;:::i;:::-;9835:7;:31;9828:280;;;9883:10;9896:32;9905:5;9912:6;9920:7;9896:8;:32::i;:::-;9883:45;-1:-1:-1;9947:12:0;;9943:154;;9978:5;;;9943:154;10022:14;;;;:::i;:::-;;-1:-1:-1;10065:16:0;;-1:-1:-1;10070:6:0;10080:1;10065:16;:::i;:::-;10055:26;;9868:240;9828:280;;;10144:12;10131:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10120:37;;10180:1;10170:11;;10207:1;10192:16;;10219:588;10256:1;10236:10;:17;:21;;;;:::i;:::-;10226:7;:31;10219:588;;;10276:10;10289:32;10298:5;10305:6;10313:7;10289:8;:32::i;:::-;10276:45;-1:-1:-1;10340:13:0;;10336:85;;-1:-1:-1;10387:17:0;;10336:85;10437:18;10469:22;10484:7;10474:6;10469:22;:::i;:::-;10458:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10458:34:0;-1:-1:-1;10437:55:0;-1:-1:-1;10437:55:0;10507:22;10599:7;10585:111;10617:6;10608:1;:16;10585:111;;;10667:10;10678:1;10667:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;10667:13:0;10650:9;10660:3;;;;:::i;:::-;;;10650:14;;;;;;;;:::i;:::-;;;;:30;-1:-1:-1;;;;;10650:30:0;;;;;;;;-1:-1:-1;10626:3:0;;;;:::i;:::-;;;;10585:111;;;-1:-1:-1;10720:16:0;10725:6;10735:1;10720:16;:::i;:::-;10710:26;-1:-1:-1;10785:9:0;10751:8;10760:14;;;;:::i;:::-;;;10751:24;;;;;;;;:::i;:::-;;;;;;:44;;;;10259:548;;;;10219:588;;;10817:15;;;9573:1267;;;;:::o;9013:550::-;9241:17;;9130:13;;9188:5;;9219:17;9229:7;9219;:17;:::i;:::-;9214:44;;9207:52;;;;:::i;:::-;9272:18;9309:7;9293:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9293:25:0;-1:-1:-1;9272:46:0;-1:-1:-1;9272:46:0;9329:22;9418:7;9399:120;9437:17;9447:7;9437;:17;:::i;:::-;9428:1;:27;9399:120;;;9494:10;9505:1;9494:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9494:13:0;9477:9;9487:3;;;;:::i;:::-;;;9477:14;;;;;;;;:::i;:::-;;;;:30;-1:-1:-1;;;;;9477:30:0;;;;;;;;-1:-1:-1;9457:3:0;;;;:::i;:::-;;;;9399:120;;;-1:-1:-1;9545:9:0;;-1:-1:-1;;;;9013:550:0;;;;;;:::o;17864:1001::-;18021:4;18015:11;18081:4;18075;18071:15;18063:23;;18129:6;18123:4;18119:17;18199:4;18190:6;18184:13;18180:24;18172:6;18168:37;18040:712;18230:7;18224:4;18221:17;18040:712;;;18725:11;;18710:27;;18276:4;18266:15;;;;18309:17;18040:712;;;-1:-1:-1;;18824:13:0;;18820:26;18805:42;;;-1:-1:-1;17864:1001:0:o;69108:745::-;69318:349;;;-1:-1:-1;;;;;28250:15:1;;69318:349:0;;;;28232:34:1;;;;69595:4:0;28282:18:1;;;28275:43;28334:18;;;;28327:34;;;69318:349:0;;;;;;;;;;28167:18:1;;;;69318:349:0;;;69290:392;;;;;-1:-1:-1;;;69726:37:0;28327:34:1;69290:392:0;69726:37;:::i;:::-;69704:59;;69781:64;69806:11;69819:25;69781:24;:64::i;:::-;69774:71;69108:745;-1:-1:-1;;;;;69108:745:0:o;67796:304::-;67947:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;67947:21:0;-1:-1:-1;;;;;67947:21:0;;;;;;;;67994:33;;67947:16;;;67994:33;;67947:16;;67994:33;81947:380;81900:427;:::o;32666:922::-;32719:7;;-1:-1:-1;;;32797:15:0;;32793:102;;-1:-1:-1;;;32833:15:0;;;-1:-1:-1;32877:2:0;32867:12;32793:102;32922:6;32913:5;:15;32909:102;;32958:6;32949:15;;;-1:-1:-1;32993:2:0;32983:12;32909:102;33038:6;33029:5;:15;33025:102;;33074:6;33065:15;;;-1:-1:-1;33109:2:0;33099:12;33025:102;33154:5;33145;:14;33141:99;;33189:5;33180:14;;;-1:-1:-1;33223:1:0;33213:11;33141:99;33267:5;33258;:14;33254:99;;33302:5;33293:14;;;-1:-1:-1;33336:1:0;33326:11;33254:99;33380:5;33371;:14;33367:99;;33415:5;33406:14;;;-1:-1:-1;33449:1:0;33439:11;33367:99;33493:5;33484;:14;33480:66;;33529:1;33519:11;33574:6;32666:922;-1:-1:-1;;32666:922:0:o;74413:799::-;74568:4;-1:-1:-1;;;;;74589:13:0;;42815:19;:23;74585:620;;74625:72;;-1:-1:-1;;;74625:72:0;;-1:-1:-1;;;;;74625:36:0;;;;;:72;;38453:10;;74676:4;;74682:7;;74691:5;;74625:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74625:72:0;;;;;;;;-1:-1:-1;;74625:72:0;;;;;;;;;;;;:::i;:::-;;;74621:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74867:6;:13;74884:1;74867:18;74863:272;;74910:60;;-1:-1:-1;;;74910:60:0;;;;;;;:::i;74863:272::-;75085:6;75079:13;75070:6;75066:2;75062:15;75055:38;74621:529;-1:-1:-1;;;;;;74748:51:0;-1:-1:-1;;;74748:51:0;;-1:-1:-1;74741:58:0;;74585:620;-1:-1:-1;75189:4:0;74413:799;;;;;;:::o;498:3097::-;556:13;793:4;:11;808:1;793:16;789:31;;-1:-1:-1;;811:9:0;;;;;;;;;-1:-1:-1;811:9:0;;;498:3097::o;789:31::-;873:19;895:6;;;;;;;;;;;;;;;;;873:28;;1312:20;1371:1;1352:4;:11;1366:1;1352:15;;;;:::i;:::-;1351:21;;;;:::i;:::-;1346:27;;:1;:27;:::i;:::-;1335:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1335:39:0;;1312:62;;1554:1;1547:5;1543:13;1658:2;1650:6;1646:15;1769:4;1821;1815:11;1809:4;1805:22;1731:1432;1855:6;1846:7;1843:19;1731:1432;;;1961:1;1952:7;1948:15;1937:26;;2000:7;1994:14;2653:4;2645:5;2641:2;2637:14;2633:25;2623:8;2619:40;2613:47;2602:9;2594:67;2707:1;2696:9;2692:17;2679:30;;2799:4;2791:5;2787:2;2783:14;2779:25;2769:8;2765:40;2759:47;2748:9;2740:67;2853:1;2842:9;2838:17;2825:30;;2944:4;2936:5;2933:1;2929:13;2925:24;2915:8;2911:39;2905:46;2894:9;2886:66;2998:1;2987:9;2983:17;2970:30;;3081:4;3074:5;3070:16;3060:8;3056:31;3050:38;3039:9;3031:58;;3135:1;3124:9;3120:17;3107:30;;1731:1432;;;1735:107;;3325:1;3318:4;3312:11;3308:19;3346:1;3341:123;;;;3483:1;3478:73;;;;3301:250;;3341:123;3394:4;3390:1;3379:9;3375:17;3367:32;3444:4;3440:1;3429:9;3425:17;3417:32;3341:123;;3478:73;3531:4;3527:1;3516:9;3512:17;3504:32;3301:250;-1:-1:-1;3581:6:0;;498:3097;-1:-1:-1;;;;;498:3097:0:o;6767:478::-;7017:18;;6892:3;;6940:5;;6990:6;;7039:1;7017:23;7010:31;;;;:::i;:::-;7068:7;7054:162;7081:10;:17;7077:1;:21;7054:162;;;7141:11;7153:1;7141:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;7124:31:0;;:10;7135:1;7124:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;7124:13:0;:31;7120:85;;7187:1;-1:-1:-1;7176:13:0;;-1:-1:-1;;7176:13:0;7120:85;7100:3;;;;:::i;:::-;;;;7054:162;;;-1:-1:-1;;;7235:2:0;6767:478;-1:-1:-1;;;;;;6767:478:0:o;69971:1476::-;70093:7;70139:28;;;:16;:28;;;;;;70093:7;70207:15;;;70203:292;;-1:-1:-1;70320:10:0;70203:292;;;-1:-1:-1;70473:10:0;70203:292;70507:17;70527:29;70555:1;70527:25;:29;:::i;:::-;70567:22;70592:27;;;:16;:27;;;;;;70507:49;;-1:-1:-1;70634:23:0;;;70630:629;;70885:14;70903:1;70885:19;70881:367;;71001:28;;;;:16;:28;;;;;:40;;;70881:367;;;71187:28;;;;:16;:28;;;;;:45;;;70881:367;71273:19;;71269:137;;71367:27;;;;:16;:27;;;;;71360:34;71269:137;-1:-1:-1;71433:6:0;;69971:1476;-1:-1:-1;;;;;69971:1476:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:272::-;650:6;703:2;691:9;682:7;678:23;674:32;671:52;;;719:1;716;709:12;671:52;758:9;745:23;808:6;801:5;797:18;790:5;787:29;777:57;;830:1;827;820:12;869:250;954:1;964:113;978:6;975:1;972:13;964:113;;;1054:11;;;1048:18;1035:11;;;1028:39;1000:2;993:10;964:113;;;-1:-1:-1;;1111:1:1;1093:16;;1086:27;869:250::o;1124:271::-;1166:3;1204:5;1198:12;1231:6;1226:3;1219:19;1247:76;1316:6;1309:4;1304:3;1300:14;1293:4;1286:5;1282:16;1247:76;:::i;:::-;1377:2;1356:15;-1:-1:-1;;1352:29:1;1343:39;;;;1384:4;1339:50;;1124:271;-1:-1:-1;;1124:271:1:o;1400:220::-;1549:2;1538:9;1531:21;1512:4;1569:45;1610:2;1599:9;1595:18;1587:6;1569:45;:::i;1807:180::-;1866:6;1919:2;1907:9;1898:7;1894:23;1890:32;1887:52;;;1935:1;1932;1925:12;1887:52;-1:-1:-1;1958:23:1;;1807:180;-1:-1:-1;1807:180:1:o;2200:173::-;2268:20;;-1:-1:-1;;;;;2317:31:1;;2307:42;;2297:70;;2363:1;2360;2353:12;2297:70;2200:173;;;:::o;2378:254::-;2446:6;2454;2507:2;2495:9;2486:7;2482:23;2478:32;2475:52;;;2523:1;2520;2513:12;2475:52;2546:29;2565:9;2546:29;:::i;:::-;2536:39;2622:2;2607:18;;;;2594:32;;-1:-1:-1;;;2378:254:1:o;2637:328::-;2714:6;2722;2730;2783:2;2771:9;2762:7;2758:23;2754:32;2751:52;;;2799:1;2796;2789:12;2751:52;2822:29;2841:9;2822:29;:::i;:::-;2812:39;;2870:38;2904:2;2893:9;2889:18;2870:38;:::i;:::-;2860:48;;2955:2;2944:9;2940:18;2927:32;2917:42;;2637:328;;;;;:::o;2970:186::-;3029:6;3082:2;3070:9;3061:7;3057:23;3053:32;3050:52;;;3098:1;3095;3088:12;3050:52;3121:29;3140:9;3121:29;:::i;3161:347::-;3226:6;3234;3287:2;3275:9;3266:7;3262:23;3258:32;3255:52;;;3303:1;3300;3293:12;3255:52;3326:29;3345:9;3326:29;:::i;:::-;3316:39;;3405:2;3394:9;3390:18;3377:32;3452:5;3445:13;3438:21;3431:5;3428:32;3418:60;;3474:1;3471;3464:12;3418:60;3497:5;3487:15;;;3161:347;;;;;:::o;3513:127::-;3574:10;3569:3;3565:20;3562:1;3555:31;3605:4;3602:1;3595:15;3629:4;3626:1;3619:15;3645:275;3716:2;3710:9;3781:2;3762:13;;-1:-1:-1;;3758:27:1;3746:40;;3816:18;3801:34;;3837:22;;;3798:62;3795:88;;;3863:18;;:::i;:::-;3899:2;3892:22;3645:275;;-1:-1:-1;3645:275:1:o;3925:952::-;4009:6;4040:2;4083;4071:9;4062:7;4058:23;4054:32;4051:52;;;4099:1;4096;4089:12;4051:52;4139:9;4126:23;4168:18;4209:2;4201:6;4198:14;4195:34;;;4225:1;4222;4215:12;4195:34;4263:6;4252:9;4248:22;4238:32;;4308:7;4301:4;4297:2;4293:13;4289:27;4279:55;;4330:1;4327;4320:12;4279:55;4366:2;4353:16;4388:2;4384;4381:10;4378:36;;;4394:18;;:::i;:::-;4440:2;4437:1;4433:10;4423:20;;4463:28;4487:2;4483;4479:11;4463:28;:::i;:::-;4525:15;;;4595:11;;;4591:20;;;4556:12;;;;4623:19;;;4620:39;;;4655:1;4652;4645:12;4620:39;4679:11;;;;4699:148;4715:6;4710:3;4707:15;4699:148;;;4781:23;4800:3;4781:23;:::i;:::-;4769:36;;4732:12;;;;4825;;;;4699:148;;;4866:5;3925:952;-1:-1:-1;;;;;;;;3925:952:1:o;4882:186::-;4930:4;4963:18;4955:6;4952:30;4949:56;;;4985:18;;:::i;:::-;-1:-1:-1;5051:2:1;5030:15;-1:-1:-1;;5026:29:1;5057:4;5022:40;;4882:186::o;5073:888::-;5168:6;5176;5184;5192;5245:3;5233:9;5224:7;5220:23;5216:33;5213:53;;;5262:1;5259;5252:12;5213:53;5285:29;5304:9;5285:29;:::i;:::-;5275:39;;5333:38;5367:2;5356:9;5352:18;5333:38;:::i;:::-;5323:48;;5418:2;5407:9;5403:18;5390:32;5380:42;;5473:2;5462:9;5458:18;5445:32;5500:18;5492:6;5489:30;5486:50;;;5532:1;5529;5522:12;5486:50;5555:22;;5608:4;5600:13;;5596:27;-1:-1:-1;5586:55:1;;5637:1;5634;5627:12;5586:55;5673:2;5660:16;5698:48;5714:31;5742:2;5714:31;:::i;:::-;5698:48;:::i;:::-;5769:2;5762:5;5755:17;5809:7;5804:2;5799;5795;5791:11;5787:20;5784:33;5781:53;;;5830:1;5827;5820:12;5781:53;5885:2;5880;5876;5872:11;5867:2;5860:5;5856:14;5843:45;5929:1;5924:2;5919;5912:5;5908:14;5904:23;5897:34;5950:5;5940:15;;;;;5073:888;;;;;;;:::o;5966:260::-;6034:6;6042;6095:2;6083:9;6074:7;6070:23;6066:32;6063:52;;;6111:1;6108;6101:12;6063:52;6134:29;6153:9;6134:29;:::i;:::-;6124:39;;6182:38;6216:2;6205:9;6201:18;6182:38;:::i;:::-;6172:48;;5966:260;;;;;:::o;6231:127::-;6292:10;6287:3;6283:20;6280:1;6273:31;6323:4;6320:1;6313:15;6347:4;6344:1;6337:15;6363:127;6424:10;6419:3;6415:20;6412:1;6405:31;6455:4;6452:1;6445:15;6479:4;6476:1;6469:15;6495:197;6536:3;6574:5;6568:12;6589:65;6647:6;6642:3;6635:4;6628:5;6624:16;6589:65;:::i;:::-;6670:16;;;;;6495:197;-1:-1:-1;;6495:197:1:o;6697:494::-;6874:3;6912:6;6906:13;6928:66;6987:6;6982:3;6975:4;6967:6;6963:17;6928:66;:::i;:::-;7057:13;;7016:16;;;;7079:70;7057:13;7016:16;7126:4;7114:17;;7079:70;:::i;:::-;7165:20;;6697:494;-1:-1:-1;;;;6697:494:1:o;7196:127::-;7257:10;7252:3;7248:20;7245:1;7238:31;7288:4;7285:1;7278:15;7312:4;7309:1;7302:15;7328:135;7367:3;7388:17;;;7385:43;;7408:18;;:::i;:::-;-1:-1:-1;7455:1:1;7444:13;;7328:135::o;7468:450::-;7698:3;7736:6;7730:13;7752:66;7811:6;7806:3;7799:4;7791:6;7787:17;7752:66;:::i;:::-;-1:-1:-1;;;7840:16:1;;7865:18;;;-1:-1:-1;7910:1:1;7899:13;;7468:450;-1:-1:-1;7468:450:1:o;7923:380::-;8002:1;7998:12;;;;8045;;;8066:61;;8120:4;8112:6;8108:17;8098:27;;8066:61;8173:2;8165:6;8162:14;8142:18;8139:38;8136:161;;8219:10;8214:3;8210:20;8207:1;8200:31;8254:4;8251:1;8244:15;8282:4;8279:1;8272:15;8136:161;;7923:380;;;:::o;9548:128::-;9615:9;;;9636:11;;;9633:37;;;9650:18;;:::i;9681:413::-;9883:2;9865:21;;;9922:2;9902:18;;;9895:30;9961:34;9956:2;9941:18;;9934:62;-1:-1:-1;;;10027:2:1;10012:18;;10005:47;10084:3;10069:19;;9681:413::o;11668:320::-;11743:5;11772:52;11788:35;11816:6;11788:35;:::i;11772:52::-;11763:61;;11847:6;11840:5;11833:21;11887:3;11878:6;11873:3;11869:16;11866:25;11863:45;;;11904:1;11901;11894:12;11863:45;11917:65;11975:6;11968:4;11961:5;11957:16;11952:3;11917:65;:::i;11993:457::-;12072:6;12125:2;12113:9;12104:7;12100:23;12096:32;12093:52;;;12141:1;12138;12131:12;12093:52;12174:9;12168:16;12207:18;12199:6;12196:30;12193:50;;;12239:1;12236;12229:12;12193:50;12262:22;;12315:4;12307:13;;12303:27;-1:-1:-1;12293:55:1;;12344:1;12341;12334:12;12293:55;12367:77;12436:7;12431:2;12425:9;12420:2;12416;12412:11;12367:77;:::i;12455:168::-;12528:9;;;12559;;12576:15;;;12570:22;;12556:37;12546:71;;12597:18;;:::i;12628:125::-;12693:9;;;12714:10;;;12711:36;;;12727:18;;:::i;12758:1355::-;-1:-1:-1;;;13407:43:1;;13473:13;;13389:3;;13495:74;13473:13;13558:1;13549:11;;13542:4;13530:17;;13495:74;:::i;:::-;-1:-1:-1;;;13628:1:1;13588:16;;;13620:10;;;13613:42;13680:13;;13702:76;13680:13;13764:2;13756:11;;13749:4;13737:17;;13702:76;:::i;:::-;-1:-1:-1;;;13838:2:1;13797:17;;;;13830:11;;;13823:51;13899:13;;13921:76;13899:13;13983:2;13975:11;;13968:4;13956:17;;13921:76;:::i;:::-;-1:-1:-1;;;14057:2:1;14016:17;;;;14049:11;;;14042:38;14104:2;14096:11;;12758:1355;-1:-1:-1;;;;;12758:1355:1:o;14465:332::-;14667:2;14649:21;;;14706:1;14686:18;;;14679:29;-1:-1:-1;;;14739:2:1;14724:18;;14717:39;14788:2;14773:18;;14465:332::o;15163:354::-;15365:2;15347:21;;;15404:2;15384:18;;;15377:30;15443:32;15438:2;15423:18;;15416:60;15508:2;15493:18;;15163:354::o;17801:284::-;17894:6;17947:2;17935:9;17926:7;17922:23;17918:32;17915:52;;;17963:1;17960;17953:12;17915:52;17995:9;17989:16;18034:2;18027:5;18024:13;18014:41;;18051:1;18048;18041:12;18090:352;18245:2;18230:18;;18278:2;18267:14;;18257:145;;18324:10;18319:3;18315:20;18312:1;18305:31;18359:4;18356:1;18349:15;18387:4;18384:1;18377:15;18257:145;18411:25;;;18090:352;:::o;18447:283::-;18539:6;18592:2;18580:9;18571:7;18567:23;18563:32;18560:52;;;18608:1;18605;18598:12;18560:52;18640:9;18634:16;18679:2;18672:5;18669:13;18659:41;;18696:1;18693;18686:12;18735:136;18774:3;18802:5;18792:39;;18811:18;;:::i;:::-;-1:-1:-1;;;18847:18:1;;18735:136::o;18876:1012::-;-1:-1:-1;;;19376:55:1;;19454:13;;19358:3;;19476:75;19454:13;19539:2;19530:12;;19523:4;19511:17;;19476:75;:::i;:::-;-1:-1:-1;;;19610:2:1;19570:16;;;19602:11;;;19595:57;19677:13;;19699:76;19677:13;19761:2;19753:11;;19746:4;19734:17;;19699:76;:::i;:::-;-1:-1:-1;;;19835:2:1;19794:17;;;;19827:11;;;19820:35;19879:2;19871:11;;18876:1012;-1:-1:-1;;;;18876:1012:1:o;23778:127::-;23839:10;23834:3;23830:20;23827:1;23820:31;23870:4;23867:1;23860:15;23894:4;23891:1;23884:15;24264:414;24466:2;24448:21;;;24505:2;24485:18;;;24478:30;24544:34;24539:2;24524:18;;24517:62;-1:-1:-1;;;24610:2:1;24595:18;;24588:48;24668:3;24653:19;;24264:414::o;24683:450::-;-1:-1:-1;;;24940:3:1;24933:33;24915:3;24995:6;24989:13;25011:75;25079:6;25074:2;25069:3;25065:12;25058:4;25050:6;25046:17;25011:75;:::i;:::-;25106:16;;;;25124:2;25102:25;;24683:450;-1:-1:-1;;24683:450:1:o;25257:1911::-;-1:-1:-1;;;26152:16:1;;-1:-1:-1;;;26193:1:1;26184:11;;26177:49;26249:13;;-1:-1:-1;;26271:74:1;26249:13;26334:1;26325:11;;26318:4;26306:17;;26271:74;:::i;:::-;-1:-1:-1;;;26404:1:1;26364:16;;;26396:10;;;26389:66;26480:13;;26502:76;26480:13;26564:2;26556:11;;26549:4;26537:17;;26502:76;:::i;:::-;26643:66;26638:2;26597:17;;;;26630:11;;;26623:87;26739:66;26734:2;26726:11;;26719:87;-1:-1:-1;;;26830:2:1;26822:11;;26815:29;26869:13;;26891:76;26869:13;26953:2;26945:11;;26938:4;26926:17;;26891:76;:::i;:::-;-1:-1:-1;;;27027:2:1;26986:17;;;;27019:11;;;27012:65;27093:69;27123:38;27156:3;27148:12;;27140:6;27123:38;:::i;:::-;-1:-1:-1;;;25203:16:1;;25244:1;25235:11;;25138:114;27093:69;27086:76;25257:1911;-1:-1:-1;;;;;;;25257:1911:1:o;27173:461::-;27435:31;27430:3;27423:44;27405:3;27496:6;27490:13;27512:75;27580:6;27575:2;27570:3;27566:12;27559:4;27551:6;27547:17;27512:75;:::i;:::-;27607:16;;;;27625:2;27603:25;;27173:461;-1:-1:-1;;27173:461:1:o;27639:216::-;27703:9;;;27731:11;;;27678:3;27761:9;;27789:10;;27785:19;;27814:10;;27806:19;;27782:44;27779:70;;;27829:18;;:::i;:::-;27779:70;;27639:216;;;;:::o;27860:127::-;27921:10;27916:3;27912:20;27909:1;27902:31;27952:4;27949:1;27942:15;27976:4;27973:1;27966:15;28372:112;28404:1;28430;28420:35;;28435:18;;:::i;:::-;-1:-1:-1;28469:9:1;;28372:112::o;28489:489::-;-1:-1:-1;;;;;28758:15:1;;;28740:34;;28810:15;;28805:2;28790:18;;28783:43;28857:2;28842:18;;28835:34;;;28905:3;28900:2;28885:18;;28878:31;;;28683:4;;28926:46;;28952:19;;28944:6;28926:46;:::i;:::-;28918:54;28489:489;-1:-1:-1;;;;;;28489:489:1:o;28983:249::-;29052:6;29105:2;29093:9;29084:7;29080:23;29076:32;29073:52;;;29121:1;29118;29111:12;29073:52;29153:9;29147:16;29172:30;29196:5;29172:30;:::i;29237:120::-;29277:1;29303;29293:35;;29308:18;;:::i;:::-;-1:-1:-1;29342:9:1;;29237:120::o
Swarm Source
ipfs://b9b081c8ee60324533eb1ec7d2ff350212961b3b54e67d4b2fde12f02ddc418a
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.