Token Ghost OG
Overview CRC721
Total Supply:
3,917 GOG
Holders:
114 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
GOG
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-25 */ // 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/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // 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/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // 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/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/3_Ballot.sol pragma solidity ^0.8.17; contract GOG is ERC721Enumerable, Ownable, ReentrancyGuard, ERC2981 { using Strings for uint256; string private _baseTokenURI = 'ipfs://ipfsHash/'; string private extension = '.json'; address public admin1 = 0x94910DC8CfEBdBD884A40AD1Bd67d6fdc49Fa2A3; //CRMax address public admin2 = 0x4995A7787816e2898c171D1064615EE7e4c3DD22; address public admin3 = 0x2b98dbF6E4af55FaD3f509152a867849b358677F; address public admin4 = 0x4d1d39E722A26d485DE95C9BaDA1E004690E7931; uint256 public constant MAX_ENTRIES = 7070; uint256[7] public PRICES = [ 49 ether, 54 ether, 59 ether, 64 ether, 69 ether, 74 ether, 79 ether ]; uint256 public constant LIMIT_PER_TRANSACTION = 50; uint256 public totalMinted; mapping(address => bool) public minted; mapping(address => bool) public whitelisted; uint8 public saleState = 0; constructor() ERC721('Ghost OG', 'GOG') { setDefaultRoyalty(admin4, 1000); } function mint(uint256 amount) external payable { require(saleState > 0, 'Sale is not started'); require(amount > 0, 'Insufficient mint amount'); require(amount <= LIMIT_PER_TRANSACTION, 'Exceeds max nft per tx'); require(totalMinted + amount <= MAX_ENTRIES, 'Exceeds max nfts'); uint256 i; if (saleState == 1) { require(amount == 1, 'You can only mint 1 in presale'); require(whitelisted[msg.sender], 'You are not whitelisted'); require(!minted[msg.sender], 'You already minted an nft'); minted[msg.sender] = true; } else { uint256 price = 0; for (i = 1; i <= amount; ++i) { price += getPrice(totalMinted + i); } require(msg.value >= price, 'Insufficient fund'); } for (i = 0; i < amount; ++i) { _safeMint(msg.sender, ++totalMinted); } } function getPrice(uint256 index) public view returns (uint256) { if (index <= 1000) { return PRICES[0]; } else if (index <= 2000) { return PRICES[1]; } else if (index <= 3000) { return PRICES[2]; } else if (index <= 4000) { return PRICES[3]; } else if (index <= 5000) { return PRICES[4]; } else if (index <= 6000) { return PRICES[5]; } else { return PRICES[6]; } } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function startPresale() external onlyOwner { saleState = 1; } function startPublicSale() external onlyOwner { saleState = 2; } function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function addToWhitelist(address[] memory wallets) external onlyOwner { uint256 i; for (i = 0; i < wallets.length; ++i) { whitelisted[wallets[i]] = true; } } function setExtension(string memory newExtension) external { extension = newExtension; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), 'ERC721Metadata: URI query for nonexistent token' ); return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), extension)); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(admin1).transfer((balance * 275) / 1000); payable(admin2).transfer((balance * 300) / 1000); payable(admin3).transfer((balance * 275) / 1000); payable(admin4).transfer((balance * 150) / 1000); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LIMIT_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PRICES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280601081526020017f697066733a2f2f69706673486173682f00000000000000000000000000000000815250600e90816200004a919062000a1f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f908162000091919062000a1f565b507394910dc8cfebdbd884a40ad1bd67d6fdc49fa2a3601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734995a7787816e2898c171d1064615ee7e4c3dd22601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732b98dbf6e4af55fad3f509152a867849b358677f601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734d1d39e722a26d485de95c9bada1e004690e7931601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060e001604052806802a802f8630a24000068ffffffffffffffffff1681526020016802ed6689e54f18000068ffffffffffffffffff168152602001680332ca1b67940c000068ffffffffffffffffff1681526020016803782dace9d900000068ffffffffffffffffff1681526020016803bd913e6c1df4000068ffffffffffffffffff168152602001680402f4cfee62e8000068ffffffffffffffffff168152602001680448586170a7dc000068ffffffffffffffffff168152506014906007620002b792919062000734565b506000601e60006101000a81548160ff021916908360ff160217905550348015620002e157600080fd5b506040518060400160405280600881526020017f47686f7374204f470000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474f47000000000000000000000000000000000000000000000000000000000081525081600090816200035f919062000a1f565b50806001908162000371919062000a1f565b5050506200039462000388620003d860201b60201c565b620003e060201b60201c565b6001600b81905550620003d2601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620004a660201b60201c565b62000c93565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004b6620004cc60201b60201c565b620004c882826200055d60201b60201c565b5050565b620004dc620003d860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005026200070060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200055b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005529062000b67565b60405180910390fd5b565b6200056d6200072a60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620005ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062000bff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000640576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006379062000c71565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b826007810192821562000773579160200282015b8281111562000772578251829068ffffffffffffffffff1690559160200191906001019062000748565b5b50905062000782919062000786565b5090565b5b80821115620007a157600081600090555060010162000787565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200082757607f821691505b6020821081036200083d576200083c620007df565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008a77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000868565b620008b3868362000868565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000900620008fa620008f484620008cb565b620008d5565b620008cb565b9050919050565b6000819050919050565b6200091c83620008df565b620009346200092b8262000907565b84845462000875565b825550505050565b600090565b6200094b6200093c565b6200095881848462000911565b505050565b5b8181101562000980576200097460008262000941565b6001810190506200095e565b5050565b601f821115620009cf57620009998162000843565b620009a48462000858565b81016020851015620009b4578190505b620009cc620009c38562000858565b8301826200095d565b50505b505050565b600082821c905092915050565b6000620009f460001984600802620009d4565b1980831691505092915050565b600062000a0f8383620009e1565b9150826002028217905092915050565b62000a2a82620007a5565b67ffffffffffffffff81111562000a465762000a45620007b0565b5b62000a5282546200080e565b62000a5f82828562000984565b600060209050601f83116001811462000a97576000841562000a82578287015190505b62000a8e858262000a01565b86555062000afe565b601f19841662000aa78662000843565b60005b8281101562000ad15784890151825560018201915060208501945060208101905062000aaa565b8683101562000af1578489015162000aed601f891682620009e1565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b4f60208362000b06565b915062000b5c8262000b17565b602082019050919050565b6000602082019050818103600083015262000b828162000b40565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000be7602a8362000b06565b915062000bf48262000b89565b604082019050919050565b6000602082019050818103600083015262000c1a8162000bd8565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000c5960198362000b06565b915062000c668262000c21565b602082019050919050565b6000602082019050818103600083015262000c8c8162000c4a565b9050919050565b6151308062000ca36000396000f3fe60806040526004361061023b5760003560e01c806355f804b31161012e578063a0712d68116100ab578063caa77ac71161006f578063caa77ac714610853578063d936547e14610890578063e7572230146108cd578063e985e9c51461090a578063f2fde38b146109475761023b565b8063a0712d681461077d578063a22cb46514610799578063a2309ff8146107c2578063b88d4fde146107ed578063c87b56dd146108165761023b565b80637d4cb964116100f25780637d4cb964146106aa5780637e2285aa146106d55780637f649783146106fe5780638da5cb5b1461072757806395d89b41146107525761023b565b806355f804b3146105c5578063603f4d52146105ee5780636352211e1461061957806370a0823114610656578063715018a6146106935761023b565b80631de46a78116101bc5780632f745c59116101805780632f745c59146104e05780633ccfd60b1461051d57806342842e0e14610534578063472890751461055d5780634f6ccce7146105885761023b565b80631de46a78146103e65780631e7269c51461041157806323b872dd1461044e5780632a55205a146104775780632b0c685a146104b55761023b565b8063081812fc11610203578063081812fc14610313578063095ea7b3146103505780630c1c972a14610379578063115976c41461039057806318160ddd146103bb5761023b565b806301ffc9a71461024057806304634d8d1461027d57806304c98b2b146102a657806306a8f8a2146102bd57806306fdde03146102e8575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906134ab565b610970565b60405161027491906134f3565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906135b0565b610982565b005b3480156102b257600080fd5b506102bb610998565b005b3480156102c957600080fd5b506102d26109be565b6040516102df91906135ff565b60405180910390f35b3480156102f457600080fd5b506102fd6109e4565b60405161030a91906136aa565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190613702565b610a76565b60405161034791906135ff565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061372f565b610abc565b005b34801561038557600080fd5b5061038e610bd3565b005b34801561039c57600080fd5b506103a5610bf9565b6040516103b291906135ff565b60405180910390f35b3480156103c757600080fd5b506103d0610c1f565b6040516103dd919061377e565b60405180910390f35b3480156103f257600080fd5b506103fb610c2c565b60405161040891906135ff565b60405180910390f35b34801561041d57600080fd5b5061043860048036038101906104339190613799565b610c52565b60405161044591906134f3565b60405180910390f35b34801561045a57600080fd5b50610475600480360381019061047091906137c6565b610c72565b005b34801561048357600080fd5b5061049e60048036038101906104999190613819565b610cd2565b6040516104ac929190613859565b60405180910390f35b3480156104c157600080fd5b506104ca610ebc565b6040516104d791906135ff565b60405180910390f35b3480156104ec57600080fd5b506105076004803603810190610502919061372f565b610ee2565b604051610514919061377e565b60405180910390f35b34801561052957600080fd5b50610532610f87565b005b34801561054057600080fd5b5061055b600480360381019061055691906137c6565b6111a2565b005b34801561056957600080fd5b506105726111c2565b60405161057f919061377e565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613702565b6111c7565b6040516105bc919061377e565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e791906139b7565b611238565b005b3480156105fa57600080fd5b50610603611253565b6040516106109190613a1c565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190613702565b611266565b60405161064d91906135ff565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190613799565b6112ec565b60405161068a919061377e565b60405180910390f35b34801561069f57600080fd5b506106a86113a3565b005b3480156106b657600080fd5b506106bf6113b7565b6040516106cc919061377e565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906139b7565b6113bd565b005b34801561070a57600080fd5b5061072560048036038101906107209190613aff565b6113d0565b005b34801561073357600080fd5b5061073c61146b565b60405161074991906135ff565b60405180910390f35b34801561075e57600080fd5b50610767611495565b60405161077491906136aa565b60405180910390f35b61079760048036038101906107929190613702565b611527565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613b74565b6118f1565b005b3480156107ce57600080fd5b506107d7611907565b6040516107e4919061377e565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f9190613c55565b61190d565b005b34801561082257600080fd5b5061083d60048036038101906108389190613702565b61196f565b60405161084a91906136aa565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190613702565b6119ee565b604051610887919061377e565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190613799565b611a09565b6040516108c491906134f3565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef9190613702565b611a29565b604051610901919061377e565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190613cd8565b611b34565b60405161093e91906134f3565b60405180910390f35b34801561095357600080fd5b5061096e60048036038101906109699190613799565b611bc8565b005b600061097b82611c4b565b9050919050565b61098a611cc5565b6109948282611d43565b5050565b6109a0611cc5565b6001601e60006101000a81548160ff021916908360ff160217905550565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600080546109f390613d47565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1f90613d47565b8015610a6c5780601f10610a4157610100808354040283529160200191610a6c565b820191906000526020600020905b815481529060010190602001808311610a4f57829003601f168201915b5050505050905090565b6000610a8182611ed8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac782611266565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90613dea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b56611f23565b73ffffffffffffffffffffffffffffffffffffffff161480610b855750610b8481610b7f611f23565b611b34565b5b610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90613e7c565b60405180910390fd5b610bce8383611f2b565b505050565b610bdb611cc5565b6002601e60006101000a81548160ff021916908360ff160217905550565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c6020528060005260406000206000915054906101000a900460ff1681565b610c83610c7d611f23565b82611fe4565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990613f0e565b60405180910390fd5b610ccd838383612079565b505050565b6000806000600d60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e6757600c6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e71612372565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e9d9190613f5d565b610ea79190613fce565b90508160000151819350935050509250929050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610eed836112ec565b8210610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590614071565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f8f611cc5565b6000479050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e861011384610fe19190613f5d565b610feb9190613fce565b9081150290604051600060405180830381858888f19350505050158015611016573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e861012c846110649190613f5d565b61106e9190613fce565b9081150290604051600060405180830381858888f19350505050158015611099573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610113846110e79190613f5d565b6110f19190613fce565b9081150290604051600060405180830381858888f1935050505015801561111c573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e86096846111699190613f5d565b6111739190613fce565b9081150290604051600060405180830381858888f1935050505015801561119e573d6000803e3d6000fd5b5050565b6111bd8383836040518060200160405280600081525061190d565b505050565b603281565b60006111d1610c1f565b8210611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614103565b60405180910390fd5b6008828154811061122657611225614123565b5b90600052602060002001549050919050565b611240611cc5565b80600e908161124f91906142fe565b5050565b601e60009054906101000a900460ff1681565b6000806112728361237c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da9061441c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906144ae565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ab611cc5565b6113b560006123b9565b565b611b9e81565b80600f90816113cc91906142fe565b5050565b6113d8611cc5565b60005b8151811015611467576001601d60008484815181106113fd576113fc614123565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080611460906144ce565b90506113db565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114a490613d47565b80601f01602080910402602001604051908101604052809291908181526020018280546114d090613d47565b801561151d5780601f106114f25761010080835404028352916020019161151d565b820191906000526020600020905b81548152906001019060200180831161150057829003601f168201915b5050505050905090565b6000601e60009054906101000a900460ff1660ff161161157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390614562565b60405180910390fd5b600081116115bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b6906145ce565b60405180910390fd5b6032811115611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061463a565b60405180910390fd5b611b9e81601b54611614919061465a565b1115611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906146da565b60405180910390fd5b60006001601e60009054906101000a900460ff1660ff160361182a57600182146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab90614746565b60405180910390fd5b601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611737906147b2565b60405180910390fd5b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c49061481e565b60405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506118b1565b6000600191505b82821161186c5761184e82601b54611849919061465a565b611a29565b81611859919061465a565b905081611865906144ce565b9150611831565b803410156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a69061488a565b60405180910390fd5b505b600090505b818110156118ed576118dc33601b600081546118d1906144ce565b91905081905561247f565b806118e6906144ce565b90506118b6565b5050565b6119036118fc611f23565b838361249d565b5050565b601b5481565b61191e611918611f23565b83611fe4565b61195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613f0e565b60405180910390fd5b61196984848484612609565b50505050565b606061197a82612665565b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b09061491c565b60405180910390fd5b600e6119c4836126a6565b600f6040516020016119d8939291906149fb565b6040516020818303038152906040529050919050565b601481600781106119fe57600080fd5b016000915090505481565b601d6020528060005260406000206000915054906101000a900460ff1681565b60006103e88211611a52576014600060078110611a4957611a48614123565b5b01549050611b2f565b6107d08211611a79576014600160078110611a7057611a6f614123565b5b01549050611b2f565b610bb88211611aa0576014600260078110611a9757611a96614123565b5b01549050611b2f565b610fa08211611ac7576014600360078110611abe57611abd614123565b5b01549050611b2f565b6113888211611aee576014600460078110611ae557611ae4614123565b5b01549050611b2f565b6117708211611b15576014600560078110611b0c57611b0b614123565b5b01549050611b2f565b6014600660078110611b2a57611b29614123565b5b015490505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bd0611cc5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690614a9e565b60405180910390fd5b611c48816123b9565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cbe5750611cbd82612774565b5b9050919050565b611ccd611f23565b73ffffffffffffffffffffffffffffffffffffffff16611ceb61146b565b73ffffffffffffffffffffffffffffffffffffffff1614611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614b0a565b60405180910390fd5b565b611d4b612372565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090614b9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0f90614c08565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600c60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611ee181612665565b611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f179061441c565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f9e83611266565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611ff083611266565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061203257506120318185611b34565b5b8061207057508373ffffffffffffffffffffffffffffffffffffffff1661205884610a76565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661209982611266565b73ffffffffffffffffffffffffffffffffffffffff16146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614c9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361215e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215590614d2c565b60405180910390fd5b61216b83838360016127ee565b8273ffffffffffffffffffffffffffffffffffffffff1661218b82611266565b73ffffffffffffffffffffffffffffffffffffffff16146121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890614c9a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461236d838383600161294c565b505050565b6000612710905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612499828260405180602001604052806000815250612952565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290614d98565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125fc91906134f3565b60405180910390a3505050565b612614848484612079565b612620848484846129ad565b61265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265690614e2a565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166126878361237c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600060016126b584612b34565b01905060008167ffffffffffffffff8111156126d4576126d361388c565b5b6040519080825280601f01601f1916602001820160405280156127065781602001600182028036833780820191505090505b509050600082602001820190505b600115612769578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161275d5761275c613f9f565b5b04945060008503612714575b819350505050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127e757506127e682612c87565b5b9050919050565b6127fa84848484612d69565b600181111561283e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283590614ebc565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128855761288081612e8f565b6128c4565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146128c3576128c28582612ed8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129065761290181613045565b612945565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612944576129438482613116565b5b5b5050505050565b50505050565b61295c8383613195565b61296960008484846129ad565b6129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f90614e2a565b60405180910390fd5b505050565b60006129ce8473ffffffffffffffffffffffffffffffffffffffff166133b2565b15612b27578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129f7611f23565b8786866040518563ffffffff1660e01b8152600401612a199493929190614f31565b6020604051808303816000875af1925050508015612a5557506040513d601f19601f82011682018060405250810190612a529190614f92565b60015b612ad7573d8060008114612a85576040519150601f19603f3d011682016040523d82523d6000602084013e612a8a565b606091505b506000815103612acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac690614e2a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b2c565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612b92577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612b8857612b87613f9f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612bcf576d04ee2d6d415b85acef81000000008381612bc557612bc4613f9f565b5b0492506020810190505b662386f26fc100008310612bfe57662386f26fc100008381612bf457612bf3613f9f565b5b0492506010810190505b6305f5e1008310612c27576305f5e1008381612c1d57612c1c613f9f565b5b0492506008810190505b6127108310612c4c576127108381612c4257612c41613f9f565b5b0492506004810190505b60648310612c6f5760648381612c6557612c64613f9f565b5b0492506002810190505b600a8310612c7e576001810190505b80915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d5257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d625750612d61826133d5565b5b9050919050565b6001811115612e8957600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612dfd5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612df59190614fbf565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e885780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e80919061465a565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ee5846112ec565b612eef9190614fbf565b9050600060076000848152602001908152602001600020549050818114612fd4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130599190614fbf565b905060006009600084815260200190815260200160002054905060006008838154811061308957613088614123565b5b9060005260206000200154905080600883815481106130ab576130aa614123565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130fa576130f9614ff3565b5b6001900381819060005260206000200160009055905550505050565b6000613121836112ec565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fb9061506e565b60405180910390fd5b61320d81612665565b1561324d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613244906150da565b60405180910390fd5b61325b6000838360016127ee565b61326481612665565b156132a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329b906150da565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133ae60008383600161294c565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61348881613453565b811461349357600080fd5b50565b6000813590506134a58161347f565b92915050565b6000602082840312156134c1576134c0613449565b5b60006134cf84828501613496565b91505092915050565b60008115159050919050565b6134ed816134d8565b82525050565b600060208201905061350860008301846134e4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135398261350e565b9050919050565b6135498161352e565b811461355457600080fd5b50565b60008135905061356681613540565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61358d8161356c565b811461359857600080fd5b50565b6000813590506135aa81613584565b92915050565b600080604083850312156135c7576135c6613449565b5b60006135d585828601613557565b92505060206135e68582860161359b565b9150509250929050565b6135f98161352e565b82525050565b600060208201905061361460008301846135f0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613654578082015181840152602081019050613639565b60008484015250505050565b6000601f19601f8301169050919050565b600061367c8261361a565b6136868185613625565b9350613696818560208601613636565b61369f81613660565b840191505092915050565b600060208201905081810360008301526136c48184613671565b905092915050565b6000819050919050565b6136df816136cc565b81146136ea57600080fd5b50565b6000813590506136fc816136d6565b92915050565b60006020828403121561371857613717613449565b5b6000613726848285016136ed565b91505092915050565b6000806040838503121561374657613745613449565b5b600061375485828601613557565b9250506020613765858286016136ed565b9150509250929050565b613778816136cc565b82525050565b6000602082019050613793600083018461376f565b92915050565b6000602082840312156137af576137ae613449565b5b60006137bd84828501613557565b91505092915050565b6000806000606084860312156137df576137de613449565b5b60006137ed86828701613557565b93505060206137fe86828701613557565b925050604061380f868287016136ed565b9150509250925092565b600080604083850312156138305761382f613449565b5b600061383e858286016136ed565b925050602061384f858286016136ed565b9150509250929050565b600060408201905061386e60008301856135f0565b61387b602083018461376f565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138c482613660565b810181811067ffffffffffffffff821117156138e3576138e261388c565b5b80604052505050565b60006138f661343f565b905061390282826138bb565b919050565b600067ffffffffffffffff8211156139225761392161388c565b5b61392b82613660565b9050602081019050919050565b82818337600083830152505050565b600061395a61395584613907565b6138ec565b90508281526020810184848401111561397657613975613887565b5b613981848285613938565b509392505050565b600082601f83011261399e5761399d613882565b5b81356139ae848260208601613947565b91505092915050565b6000602082840312156139cd576139cc613449565b5b600082013567ffffffffffffffff8111156139eb576139ea61344e565b5b6139f784828501613989565b91505092915050565b600060ff82169050919050565b613a1681613a00565b82525050565b6000602082019050613a316000830184613a0d565b92915050565b600067ffffffffffffffff821115613a5257613a5161388c565b5b602082029050602081019050919050565b600080fd5b6000613a7b613a7684613a37565b6138ec565b90508083825260208201905060208402830185811115613a9e57613a9d613a63565b5b835b81811015613ac75780613ab38882613557565b845260208401935050602081019050613aa0565b5050509392505050565b600082601f830112613ae657613ae5613882565b5b8135613af6848260208601613a68565b91505092915050565b600060208284031215613b1557613b14613449565b5b600082013567ffffffffffffffff811115613b3357613b3261344e565b5b613b3f84828501613ad1565b91505092915050565b613b51816134d8565b8114613b5c57600080fd5b50565b600081359050613b6e81613b48565b92915050565b60008060408385031215613b8b57613b8a613449565b5b6000613b9985828601613557565b9250506020613baa85828601613b5f565b9150509250929050565b600067ffffffffffffffff821115613bcf57613bce61388c565b5b613bd882613660565b9050602081019050919050565b6000613bf8613bf384613bb4565b6138ec565b905082815260208101848484011115613c1457613c13613887565b5b613c1f848285613938565b509392505050565b600082601f830112613c3c57613c3b613882565b5b8135613c4c848260208601613be5565b91505092915050565b60008060008060808587031215613c6f57613c6e613449565b5b6000613c7d87828801613557565b9450506020613c8e87828801613557565b9350506040613c9f878288016136ed565b925050606085013567ffffffffffffffff811115613cc057613cbf61344e565b5b613ccc87828801613c27565b91505092959194509250565b60008060408385031215613cef57613cee613449565b5b6000613cfd85828601613557565b9250506020613d0e85828601613557565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d5f57607f821691505b602082108103613d7257613d71613d18565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd4602183613625565b9150613ddf82613d78565b604082019050919050565b60006020820190508181036000830152613e0381613dc7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613e66603d83613625565b9150613e7182613e0a565b604082019050919050565b60006020820190508181036000830152613e9581613e59565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613ef8602d83613625565b9150613f0382613e9c565b604082019050919050565b60006020820190508181036000830152613f2781613eeb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f68826136cc565b9150613f73836136cc565b9250828202613f81816136cc565b91508282048414831517613f9857613f97613f2e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fd9826136cc565b9150613fe4836136cc565b925082613ff457613ff3613f9f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061405b602b83613625565b915061406682613fff565b604082019050919050565b6000602082019050818103600083015261408a8161404e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006140ed602c83613625565b91506140f882614091565b604082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614177565b6141be8683614177565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141fb6141f66141f1846136cc565b6141d6565b6136cc565b9050919050565b6000819050919050565b614215836141e0565b61422961422182614202565b848454614184565b825550505050565b600090565b61423e614231565b61424981848461420c565b505050565b5b8181101561426d57614262600082614236565b60018101905061424f565b5050565b601f8211156142b25761428381614152565b61428c84614167565b8101602085101561429b578190505b6142af6142a785614167565b83018261424e565b50505b505050565b600082821c905092915050565b60006142d5600019846008026142b7565b1980831691505092915050565b60006142ee83836142c4565b9150826002028217905092915050565b6143078261361a565b67ffffffffffffffff8111156143205761431f61388c565b5b61432a8254613d47565b614335828285614271565b600060209050601f8311600181146143685760008415614356578287015190505b61436085826142e2565b8655506143c8565b601f19841661437686614152565b60005b8281101561439e57848901518255600182019150602085019450602081019050614379565b868310156143bb57848901516143b7601f8916826142c4565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614406601883613625565b9150614411826143d0565b602082019050919050565b60006020820190508181036000830152614435816143f9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614498602983613625565b91506144a38261443c565b604082019050919050565b600060208201905081810360008301526144c78161448b565b9050919050565b60006144d9826136cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361450b5761450a613f2e565b5b600182019050919050565b7f53616c65206973206e6f74207374617274656400000000000000000000000000600082015250565b600061454c601383613625565b915061455782614516565b602082019050919050565b6000602082019050818103600083015261457b8161453f565b9050919050565b7f496e73756666696369656e74206d696e7420616d6f756e740000000000000000600082015250565b60006145b8601883613625565b91506145c382614582565b602082019050919050565b600060208201905081810360008301526145e7816145ab565b9050919050565b7f45786365656473206d6178206e66742070657220747800000000000000000000600082015250565b6000614624601683613625565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b6000614665826136cc565b9150614670836136cc565b925082820190508082111561468857614687613f2e565b5b92915050565b7f45786365656473206d6178206e66747300000000000000000000000000000000600082015250565b60006146c4601083613625565b91506146cf8261468e565b602082019050919050565b600060208201905081810360008301526146f3816146b7565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120696e2070726573616c650000600082015250565b6000614730601e83613625565b915061473b826146fa565b602082019050919050565b6000602082019050818103600083015261475f81614723565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b600061479c601783613625565b91506147a782614766565b602082019050919050565b600060208201905081810360008301526147cb8161478f565b9050919050565b7f596f7520616c7265616479206d696e74656420616e206e667400000000000000600082015250565b6000614808601983613625565b9150614813826147d2565b602082019050919050565b60006020820190508181036000830152614837816147fb565b9050919050565b7f496e73756666696369656e742066756e64000000000000000000000000000000600082015250565b6000614874601183613625565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614906602f83613625565b9150614911826148aa565b604082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b600081905092915050565b6000815461495481613d47565b61495e818661493c565b94506001821660008114614979576001811461498e576149c1565b60ff19831686528115158202860193506149c1565b61499785614152565b60005b838110156149b95781548189015260018201915060208101905061499a565b838801955050505b50505092915050565b60006149d58261361a565b6149df818561493c565b93506149ef818560208601613636565b80840191505092915050565b6000614a078286614947565b9150614a1382856149ca565b9150614a1f8284614947565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a88602683613625565b9150614a9382614a2c565b604082019050919050565b60006020820190508181036000830152614ab781614a7b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614af4602083613625565b9150614aff82614abe565b602082019050919050565b60006020820190508181036000830152614b2381614ae7565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614b86602a83613625565b9150614b9182614b2a565b604082019050919050565b60006020820190508181036000830152614bb581614b79565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614bf2601983613625565b9150614bfd82614bbc565b602082019050919050565b60006020820190508181036000830152614c2181614be5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c84602583613625565b9150614c8f82614c28565b604082019050919050565b60006020820190508181036000830152614cb381614c77565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d16602483613625565b9150614d2182614cba565b604082019050919050565b60006020820190508181036000830152614d4581614d09565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d82601983613625565b9150614d8d82614d4c565b602082019050919050565b60006020820190508181036000830152614db181614d75565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e14603283613625565b9150614e1f82614db8565b604082019050919050565b60006020820190508181036000830152614e4381614e07565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ea6603583613625565b9150614eb182614e4a565b604082019050919050565b60006020820190508181036000830152614ed581614e99565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614f0382614edc565b614f0d8185614ee7565b9350614f1d818560208601613636565b614f2681613660565b840191505092915050565b6000608082019050614f4660008301876135f0565b614f5360208301866135f0565b614f60604083018561376f565b8181036060830152614f728184614ef8565b905095945050505050565b600081519050614f8c8161347f565b92915050565b600060208284031215614fa857614fa7613449565b5b6000614fb684828501614f7d565b91505092915050565b6000614fca826136cc565b9150614fd5836136cc565b9250828203905081811115614fed57614fec613f2e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615058602083613625565b915061506382615022565b602082019050919050565b600060208201905081810360008301526150878161504b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150c4601c83613625565b91506150cf8261508e565b602082019050919050565b600060208201905081810360008301526150f3816150b7565b905091905056fea2646970667358221220418aefae66f6c888f7a370b8c900cb01626bf32fca65343792bf01cce674e96964736f6c63430008110033
Deployed ByteCode Sourcemap
70495:3936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74239:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73166:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73013:69;;;;;;;;;;;;;:::i;:::-;;70772:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48549:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50061:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49579:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73088:72;;;;;;;;;;;;;:::i;:::-;;70693:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65127:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70843:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71261:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50761:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36720:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;70914:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64795:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73922:311;;;;;;;;;;;;;:::i;:::-;;51167:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71175:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65317:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72911:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71352:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48259:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47990:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20921:103;;;;;;;;;;;;;:::i;:::-;;70986:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73510:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73323:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20273:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48718:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71475:862;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50304:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71230:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51423:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73612:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71033:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71304:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72343:456;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50530:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21179:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74239:189;74363:4;74386:36;74410:11;74386:23;:36::i;:::-;74379:43;;74239:189;;;:::o;73166:151::-;20159:13;:11;:13::i;:::-;73269:42:::1;73288:8;73298:12;73269:18;:42::i;:::-;73166:151:::0;;:::o;73013:69::-;20159:13;:11;:13::i;:::-;73075:1:::1;73063:9;;:13;;;;;;;;;;;;;;;;;;73013:69::o:0;70772:66::-;;;;;;;;;;;;;:::o;48549:100::-;48603:13;48636:5;48629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48549:100;:::o;50061:171::-;50137:7;50157:23;50172:7;50157:14;:23::i;:::-;50200:15;:24;50216:7;50200:24;;;;;;;;;;;;;;;;;;;;;50193:31;;50061:171;;;:::o;49579:416::-;49660:13;49676:23;49691:7;49676:14;:23::i;:::-;49660:39;;49724:5;49718:11;;:2;:11;;;49710:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49818:5;49802:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49827:37;49844:5;49851:12;:10;:12::i;:::-;49827:16;:37::i;:::-;49802:62;49780:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;49966:21;49975:2;49979:7;49966:8;:21::i;:::-;49649:346;49579:416;;:::o;73088:72::-;20159:13;:11;:13::i;:::-;73153:1:::1;73141:9;;:13;;;;;;;;;;;;;;;;;;73088:72::o:0;70693:66::-;;;;;;;;;;;;;:::o;65127:113::-;65188:7;65215:10;:17;;;;65208:24;;65127:113;:::o;70843:66::-;;;;;;;;;;;;;:::o;71261:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;50761:335::-;50956:41;50975:12;:10;:12::i;:::-;50989:7;50956:18;:41::i;:::-;50948:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51060:28;51070:4;51076:2;51080:7;51060:9;:28::i;:::-;50761:335;;;:::o;36720:442::-;36817:7;36826;36846:26;36875:17;:27;36893:8;36875:27;;;;;;;;;;;36846:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:1;36919:30;;:7;:16;;;:30;;;36915:92;;36976:19;36966:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:92;37019:21;37084:17;:15;:17::i;:::-;37043:58;;37057:7;:23;;;37044:36;;:10;:36;;;;:::i;:::-;37043:58;;;;:::i;:::-;37019:82;;37122:7;:16;;;37140:13;37114:40;;;;;;36720:442;;;;;:::o;70914:66::-;;;;;;;;;;;;;:::o;64795:256::-;64892:7;64928:23;64945:5;64928:16;:23::i;:::-;64920:5;:31;64912:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;65017:12;:19;65030:5;65017:19;;;;;;;;;;;;;;;:26;65037:5;65017:26;;;;;;;;;;;;65010:33;;64795:256;;;;:::o;73922:311::-;20159:13;:11;:13::i;:::-;73968:15:::1;73986:21;73968:39;;74022:6;;;;;;;;;;;74014:24;;:48;74057:4;74050:3;74040:7;:13;;;;:::i;:::-;74039:22;;;;:::i;:::-;74014:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74077:6;;;;;;;;;;;74069:24;;:48;74112:4;74105:3;74095:7;:13;;;;:::i;:::-;74094:22;;;;:::i;:::-;74069:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74132:6;;;;;;;;;;;74124:24;;:48;74167:4;74160:3;74150:7;:13;;;;:::i;:::-;74149:22;;;;:::i;:::-;74124:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74187:6;;;;;;;;;;;74179:24;;:48;74222:4;74215:3;74205:7;:13;;;;:::i;:::-;74204:22;;;;:::i;:::-;74179:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;73961:272;73922:311::o:0;51167:185::-;51305:39;51322:4;51328:2;51332:7;51305:39;;;;;;;;;;;;:16;:39::i;:::-;51167:185;;;:::o;71175:50::-;71223:2;71175:50;:::o;65317:233::-;65392:7;65428:30;:28;:30::i;:::-;65420:5;:38;65412:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;65525:10;65536:5;65525:17;;;;;;;;:::i;:::-;;;;;;;;;;65518:24;;65317:233;;;:::o;72911:96::-;20159:13;:11;:13::i;:::-;72994:7:::1;72978:13;:23;;;;;;:::i;:::-;;72911:96:::0;:::o;71352:26::-;;;;;;;;;;;;;:::o;48259:223::-;48331:7;48351:13;48367:17;48376:7;48367:8;:17::i;:::-;48351:33;;48420:1;48403:19;;:5;:19;;;48395:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48469:5;48462:12;;;48259:223;;;:::o;47990:207::-;48062:7;48107:1;48090:19;;:5;:19;;;48082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48173:9;:16;48183:5;48173:16;;;;;;;;;;;;;;;;48166:23;;47990:207;;;:::o;20921:103::-;20159:13;:11;:13::i;:::-;20986:30:::1;21013:1;20986:18;:30::i;:::-;20921:103::o:0;70986:42::-;71024:4;70986:42;:::o;73510:96::-;73588:12;73576:9;:24;;;;;;:::i;:::-;;73510:96;:::o;73323:181::-;20159:13;:11;:13::i;:::-;73399:9:::1;73415:84;73431:7;:14;73427:1;:18;73415:84;;;73487:4;73461:11;:23;73473:7;73481:1;73473:10;;;;;;;;:::i;:::-;;;;;;;;73461:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;73447:3;;;;:::i;:::-;;;73415:84;;;73392:112;73323:181:::0;:::o;20273:87::-;20319:7;20346:6;;;;;;;;;;;20339:13;;20273:87;:::o;48718:104::-;48774:13;48807:7;48800:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48718:104;:::o;71475:862::-;71549:1;71537:9;;;;;;;;;;;:13;;;71529:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;71598:1;71589:6;:10;71581:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;71223:2;71643:6;:31;;71635:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71024:4;71730:6;71716:11;;:20;;;;:::i;:::-;:35;;71708:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71779:9;71812:1;71799:9;;;;;;;;;;;:14;;;71795:449;;71842:1;71832:6;:11;71824:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;71895:11;:23;71907:10;71895:23;;;;;;;;;;;;;;;;;;;;;;;;;71887:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71964:6;:18;71971:10;71964:18;;;;;;;;;;;;;;;;;;;;;;;;;71963:19;71955:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72042:4;72021:6;:18;72028:10;72021:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;71795:449;;;72069:13;72104:1;72100:5;;72095:85;72112:6;72107:1;:11;72095:85;;72145:25;72168:1;72154:11;;:15;;;;:::i;:::-;72145:8;:25::i;:::-;72136:34;;;;;:::i;:::-;;;72120:3;;;;:::i;:::-;;;72095:85;;;72209:5;72196:9;:18;;72188:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;72060:184;71795:449;72259:1;72255:5;;72250:82;72266:6;72262:1;:10;72250:82;;;72288:36;72298:10;72312:11;;72310:13;;;;;:::i;:::-;;;;;;;72288:9;:36::i;:::-;72274:3;;;;:::i;:::-;;;72250:82;;;71522:815;71475:862;:::o;50304:155::-;50399:52;50418:12;:10;:12::i;:::-;50432:8;50442;50399:18;:52::i;:::-;50304:155;;:::o;71230:26::-;;;;:::o;51423:322::-;51597:41;51616:12;:10;:12::i;:::-;51630:7;51597:18;:41::i;:::-;51589:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51699:38;51713:4;51719:2;51723:7;51732:4;51699:13;:38::i;:::-;51423:322;;;;:::o;73612:304::-;73697:13;73738:16;73746:7;73738;:16::i;:::-;73722:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;73864:13;73879:18;:7;:16;:18::i;:::-;73899:9;73847:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73826:84;;73612:304;;;:::o;71033:137::-;;;;;;;;;;;;;;;;;;;;:::o;71304:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;72343:456::-;72397:7;72426:4;72417:5;:13;72413:381;;72448:6;72455:1;72448:9;;;;;;;:::i;:::-;;;;72441:16;;;;72413:381;72484:4;72475:5;:13;72471:323;;72506:6;72513:1;72506:9;;;;;;;:::i;:::-;;;;72499:16;;;;72471:323;72542:4;72533:5;:13;72529:265;;72564:6;72571:1;72564:9;;;;;;;:::i;:::-;;;;72557:16;;;;72529:265;72600:4;72591:5;:13;72587:207;;72622:6;72629:1;72622:9;;;;;;;:::i;:::-;;;;72615:16;;;;72587:207;72658:4;72649:5;:13;72645:149;;72680:6;72687:1;72680:9;;;;;;;:::i;:::-;;;;72673:16;;;;72645:149;72716:4;72707:5;:13;72703:91;;72738:6;72745:1;72738:9;;;;;;;:::i;:::-;;;;72731:16;;;;72703:91;72777:6;72784:1;72777:9;;;;;;;:::i;:::-;;;;72770:16;;72343:456;;;;:::o;50530:164::-;50627:4;50651:18;:25;50670:5;50651:25;;;;;;;;;;;;;;;:35;50677:8;50651:35;;;;;;;;;;;;;;;;;;;;;;;;;50644:42;;50530:164;;;;:::o;21179:201::-;20159:13;:11;:13::i;:::-;21288:1:::1;21268:22;;:8;:22;;::::0;21260:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21344:28;21363:8;21344:18;:28::i;:::-;21179:201:::0;:::o;36450:215::-;36552:4;36591:26;36576:41;;;:11;:41;;;;:81;;;;36621:36;36645:11;36621:23;:36::i;:::-;36576:81;36569:88;;36450:215;;;:::o;20438:132::-;20513:12;:10;:12::i;:::-;20502:23;;:7;:5;:7::i;:::-;:23;;;20494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20438:132::o;37812:332::-;37931:17;:15;:17::i;:::-;37915:33;;:12;:33;;;;37907:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;38034:1;38014:22;;:8;:22;;;38006:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38101:35;;;;;;;;38113:8;38101:35;;;;;;38123:12;38101:35;;;;;38079:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37812:332;;:::o;59880:135::-;59962:16;59970:7;59962;:16::i;:::-;59954:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59880:135;:::o;18824:98::-;18877:7;18904:10;18897:17;;18824:98;:::o;59159:174::-;59261:2;59234:15;:24;59250:7;59234:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59317:7;59313:2;59279:46;;59288:23;59303:7;59288:14;:23::i;:::-;59279:46;;;;;;;;;;;;59159:174;;:::o;53778:264::-;53871:4;53888:13;53904:23;53919:7;53904:14;:23::i;:::-;53888:39;;53957:5;53946:16;;:7;:16;;;:52;;;;53966:32;53983:5;53990:7;53966:16;:32::i;:::-;53946:52;:87;;;;54026:7;54002:31;;:20;54014:7;54002:11;:20::i;:::-;:31;;;53946:87;53938:96;;;53778:264;;;;:::o;57777:1263::-;57936:4;57909:31;;:23;57924:7;57909:14;:23::i;:::-;:31;;;57901:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58015:1;58001:16;;:2;:16;;;57993:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58071:42;58092:4;58098:2;58102:7;58111:1;58071:20;:42::i;:::-;58243:4;58216:31;;:23;58231:7;58216:14;:23::i;:::-;:31;;;58208:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58361:15;:24;58377:7;58361:24;;;;;;;;;;;;58354:31;;;;;;;;;;;58856:1;58837:9;:15;58847:4;58837:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58889:1;58872:9;:13;58882:2;58872:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;58931:2;58912:7;:16;58920:7;58912:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58970:7;58966:2;58951:27;;58960:4;58951:27;;;;;;;;;;;;58991:41;59011:4;59017:2;59021:7;59030:1;58991:19;:41::i;:::-;57777:1263;;;:::o;37444:97::-;37502:6;37528:5;37521:12;;37444:97;:::o;53053:117::-;53119:7;53146;:16;53154:7;53146:16;;;;;;;;;;;;;;;;;;;;;53139:23;;53053:117;;;:::o;21540:191::-;21614:16;21633:6;;;;;;;;;;;21614:25;;21659:8;21650:6;;:17;;;;;;;;;;;;;;;;;;21714:8;21683:40;;21704:8;21683:40;;;;;;;;;;;;21603:128;21540:191;:::o;54384:110::-;54460:26;54470:2;54474:7;54460:26;;;;;;;;;;;;:9;:26::i;:::-;54384:110;;:::o;59476:315::-;59631:8;59622:17;;:5;:17;;;59614:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59718:8;59680:18;:25;59699:5;59680:25;;;;;;;;;;;;;;;:35;59706:8;59680:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59764:8;59742:41;;59757:5;59742:41;;;59774:8;59742:41;;;;;;:::i;:::-;;;;;;;;59476:315;;;:::o;52626:313::-;52782:28;52792:4;52798:2;52802:7;52782:9;:28::i;:::-;52829:47;52852:4;52858:2;52862:7;52871:4;52829:22;:47::i;:::-;52821:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52626:313;;;;:::o;53483:128::-;53548:4;53601:1;53572:31;;:17;53581:7;53572:8;:17::i;:::-;:31;;;;53565:38;;53483:128;;;:::o;16251:716::-;16307:13;16358:14;16395:1;16375:17;16386:5;16375:10;:17::i;:::-;:21;16358:38;;16411:20;16445:6;16434:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16411:41;;16467:11;16596:6;16592:2;16588:15;16580:6;16576:28;16569:35;;16633:288;16640:4;16633:288;;;16665:5;;;;;;;;16807:8;16802:2;16795:5;16791:14;16786:30;16781:3;16773:44;16863:2;16854:11;;;;;;:::i;:::-;;;;;16897:1;16888:5;:10;16633:288;16884:21;16633:288;16942:6;16935:13;;;;;16251:716;;;:::o;64487:224::-;64589:4;64628:35;64613:50;;;:11;:50;;;;:90;;;;64667:36;64691:11;64667:23;:36::i;:::-;64613:90;64606:97;;64487:224;;;:::o;65624:915::-;65801:61;65828:4;65834:2;65838:12;65852:9;65801:26;:61::i;:::-;65891:1;65879:9;:13;65875:222;;;66022:63;;;;;;;;;;:::i;:::-;;;;;;;;65875:222;66109:15;66127:12;66109:30;;66172:1;66156:18;;:4;:18;;;66152:187;;66191:40;66223:7;66191:31;:40::i;:::-;66152:187;;;66261:2;66253:10;;:4;:10;;;66249:90;;66280:47;66313:4;66319:7;66280:32;:47::i;:::-;66249:90;66152:187;66367:1;66353:16;;:2;:16;;;66349:183;;66386:45;66423:7;66386:36;:45::i;:::-;66349:183;;;66459:4;66453:10;;:2;:10;;;66449:83;;66480:40;66508:2;66512:7;66480:27;:40::i;:::-;66449:83;66349:183;65790:749;65624:915;;;;:::o;63296:158::-;;;;;:::o;54721:319::-;54850:18;54856:2;54860:7;54850:5;:18::i;:::-;54901:53;54932:1;54936:2;54940:7;54949:4;54901:22;:53::i;:::-;54879:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;54721:319;;;:::o;60579:853::-;60733:4;60754:15;:2;:13;;;:15::i;:::-;60750:675;;;60806:2;60790:36;;;60827:12;:10;:12::i;:::-;60841:4;60847:7;60856:4;60790:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60786:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61048:1;61031:6;:13;:18;61027:328;;61074:60;;;;;;;;;;:::i;:::-;;;;;;;;61027:328;61305:6;61299:13;61290:6;61286:2;61282:15;61275:38;60786:584;60922:41;;;60912:51;;;:6;:51;;;;60905:58;;;;;60750:675;61409:4;61402:11;;60579:853;;;;;;;:::o;13117:922::-;13170:7;13190:14;13207:1;13190:18;;13257:6;13248:5;:15;13244:102;;13293:6;13284:15;;;;;;:::i;:::-;;;;;13328:2;13318:12;;;;13244:102;13373:6;13364:5;:15;13360:102;;13409:6;13400:15;;;;;;:::i;:::-;;;;;13444:2;13434:12;;;;13360:102;13489:6;13480:5;:15;13476:102;;13525:6;13516:15;;;;;;:::i;:::-;;;;;13560:2;13550:12;;;;13476:102;13605:5;13596;:14;13592:99;;13640:5;13631:14;;;;;;:::i;:::-;;;;;13674:1;13664:11;;;;13592:99;13718:5;13709;:14;13705:99;;13753:5;13744:14;;;;;;:::i;:::-;;;;;13787:1;13777:11;;;;13705:99;13831:5;13822;:14;13818:99;;13866:5;13857:14;;;;;;:::i;:::-;;;;;13900:1;13890:11;;;;13818:99;13944:5;13935;:14;13931:66;;13980:1;13970:11;;;;13931:66;14025:6;14018:13;;;13117:922;;;:::o;47621:305::-;47723:4;47775:25;47760:40;;;:11;:40;;;;:105;;;;47832:33;47817:48;;;:11;:48;;;;47760:105;:158;;;;47882:36;47906:11;47882:23;:36::i;:::-;47760:158;47740:178;;47621:305;;;:::o;62164:410::-;62354:1;62342:9;:13;62338:229;;;62392:1;62376:18;;:4;:18;;;62372:87;;62434:9;62415;:15;62425:4;62415:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;62372:87;62491:1;62477:16;;:2;:16;;;62473:83;;62531:9;62514;:13;62524:2;62514:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;62473:83;62338:229;62164:410;;;;:::o;67262:164::-;67366:10;:17;;;;67339:15;:24;67355:7;67339:24;;;;;;;;;;;:44;;;;67394:10;67410:7;67394:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67262:164;:::o;68053:988::-;68319:22;68369:1;68344:22;68361:4;68344:16;:22::i;:::-;:26;;;;:::i;:::-;68319:51;;68381:18;68402:17;:26;68420:7;68402:26;;;;;;;;;;;;68381:47;;68549:14;68535:10;:28;68531:328;;68580:19;68602:12;:18;68615:4;68602:18;;;;;;;;;;;;;;;:34;68621:14;68602:34;;;;;;;;;;;;68580:56;;68686:11;68653:12;:18;68666:4;68653:18;;;;;;;;;;;;;;;:30;68672:10;68653:30;;;;;;;;;;;:44;;;;68803:10;68770:17;:30;68788:11;68770:30;;;;;;;;;;;:43;;;;68565:294;68531:328;68955:17;:26;68973:7;68955:26;;;;;;;;;;;68948:33;;;68999:12;:18;69012:4;68999:18;;;;;;;;;;;;;;;:34;69018:14;68999:34;;;;;;;;;;;68992:41;;;68134:907;;68053:988;;:::o;69336:1079::-;69589:22;69634:1;69614:10;:17;;;;:21;;;;:::i;:::-;69589:46;;69646:18;69667:15;:24;69683:7;69667:24;;;;;;;;;;;;69646:45;;70018:19;70040:10;70051:14;70040:26;;;;;;;;:::i;:::-;;;;;;;;;;70018:48;;70104:11;70079:10;70090;70079:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;70215:10;70184:15;:28;70200:11;70184:28;;;;;;;;;;;:41;;;;70356:15;:24;70372:7;70356:24;;;;;;;;;;;70349:31;;;70391:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69407:1008;;;69336:1079;:::o;66840:221::-;66925:14;66942:20;66959:2;66942:16;:20::i;:::-;66925:37;;67000:7;66973:12;:16;66986:2;66973:16;;;;;;;;;;;;;;;:24;66990:6;66973:24;;;;;;;;;;;:34;;;;67047:6;67018:17;:26;67036:7;67018:26;;;;;;;;;;;:35;;;;66914:147;66840:221;;:::o;55376:942::-;55470:1;55456:16;;:2;:16;;;55448:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55529:16;55537:7;55529;:16::i;:::-;55528:17;55520:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55591:48;55620:1;55624:2;55628:7;55637:1;55591:20;:48::i;:::-;55738:16;55746:7;55738;:16::i;:::-;55737:17;55729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56153:1;56136:9;:13;56146:2;56136:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56197:2;56178:7;:16;56186:7;56178:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56242:7;56238:2;56217:33;;56234:1;56217:33;;;;;;;;;;;;56263:47;56291:1;56295:2;56299:7;56308:1;56263:19;:47::i;:::-;55376:942;;:::o;22971:326::-;23031:4;23288:1;23266:7;:19;;;:23;23259:30;;22971:326;;;:::o;34900:157::-;34985:4;35024:25;35009:40;;;:11;:40;;;;35002:47;;34900:157;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:118::-;2974:24;2992:5;2974:24;:::i;:::-;2969:3;2962:37;2887:118;;:::o;3011:222::-;3104:4;3142:2;3131:9;3127:18;3119:26;;3155:71;3223:1;3212:9;3208:17;3199:6;3155:71;:::i;:::-;3011:222;;;;:::o;3239:99::-;3291:6;3325:5;3319:12;3309:22;;3239:99;;;:::o;3344:169::-;3428:11;3462:6;3457:3;3450:19;3502:4;3497:3;3493:14;3478:29;;3344:169;;;;:::o;3519:246::-;3600:1;3610:113;3624:6;3621:1;3618:13;3610:113;;;3709:1;3704:3;3700:11;3694:18;3690:1;3685:3;3681:11;3674:39;3646:2;3643:1;3639:10;3634:15;;3610:113;;;3757:1;3748:6;3743:3;3739:16;3732:27;3581:184;3519:246;;;:::o;3771:102::-;3812:6;3863:2;3859:7;3854:2;3847:5;3843:14;3839:28;3829:38;;3771:102;;;:::o;3879:377::-;3967:3;3995:39;4028:5;3995:39;:::i;:::-;4050:71;4114:6;4109:3;4050:71;:::i;:::-;4043:78;;4130:65;4188:6;4183:3;4176:4;4169:5;4165:16;4130:65;:::i;:::-;4220:29;4242:6;4220:29;:::i;:::-;4215:3;4211:39;4204:46;;3971:285;3879:377;;;;:::o;4262:313::-;4375:4;4413:2;4402:9;4398:18;4390:26;;4462:9;4456:4;4452:20;4448:1;4437:9;4433:17;4426:47;4490:78;4563:4;4554:6;4490:78;:::i;:::-;4482:86;;4262:313;;;;:::o;4581:77::-;4618:7;4647:5;4636:16;;4581:77;;;:::o;4664:122::-;4737:24;4755:5;4737:24;:::i;:::-;4730:5;4727:35;4717:63;;4776:1;4773;4766:12;4717:63;4664:122;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:329::-;4996:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;4937:329;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:329::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:53;6408:7;6399:6;6388:9;6384:22;6363:53;:::i;:::-;6353:63;;6309:117;6104:329;;;;:::o;6439:619::-;6516:6;6524;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:119;;;6587:79;;:::i;:::-;6549:119;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6962:2;6988:53;7033:7;7024:6;7013:9;7009:22;6988:53;:::i;:::-;6978:63;;6933:118;6439:619;;;;;:::o;7064:474::-;7132:6;7140;7189:2;7177:9;7168:7;7164:23;7160:32;7157:119;;;7195:79;;:::i;:::-;7157:119;7315:1;7340:53;7385:7;7376:6;7365:9;7361:22;7340:53;:::i;:::-;7330:63;;7286:117;7442:2;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7413:118;7064:474;;;;;:::o;7544:332::-;7665:4;7703:2;7692:9;7688:18;7680:26;;7716:71;7784:1;7773:9;7769:17;7760:6;7716:71;:::i;:::-;7797:72;7865:2;7854:9;7850:18;7841:6;7797:72;:::i;:::-;7544:332;;;;;:::o;7882:117::-;7991:1;7988;7981:12;8005:117;8114:1;8111;8104:12;8128:180;8176:77;8173:1;8166:88;8273:4;8270:1;8263:15;8297:4;8294:1;8287:15;8314:281;8397:27;8419:4;8397:27;:::i;:::-;8389:6;8385:40;8527:6;8515:10;8512:22;8491:18;8479:10;8476:34;8473:62;8470:88;;;8538:18;;:::i;:::-;8470:88;8578:10;8574:2;8567:22;8357:238;8314:281;;:::o;8601:129::-;8635:6;8662:20;;:::i;:::-;8652:30;;8691:33;8719:4;8711:6;8691:33;:::i;:::-;8601:129;;;:::o;8736:308::-;8798:4;8888:18;8880:6;8877:30;8874:56;;;8910:18;;:::i;:::-;8874:56;8948:29;8970:6;8948:29;:::i;:::-;8940:37;;9032:4;9026;9022:15;9014:23;;8736:308;;;:::o;9050:146::-;9147:6;9142:3;9137;9124:30;9188:1;9179:6;9174:3;9170:16;9163:27;9050:146;;;:::o;9202:425::-;9280:5;9305:66;9321:49;9363:6;9321:49;:::i;:::-;9305:66;:::i;:::-;9296:75;;9394:6;9387:5;9380:21;9432:4;9425:5;9421:16;9470:3;9461:6;9456:3;9452:16;9449:25;9446:112;;;9477:79;;:::i;:::-;9446:112;9567:54;9614:6;9609:3;9604;9567:54;:::i;:::-;9286:341;9202:425;;;;;:::o;9647:340::-;9703:5;9752:3;9745:4;9737:6;9733:17;9729:27;9719:122;;9760:79;;:::i;:::-;9719:122;9877:6;9864:20;9902:79;9977:3;9969:6;9962:4;9954:6;9950:17;9902:79;:::i;:::-;9893:88;;9709:278;9647:340;;;;:::o;9993:509::-;10062:6;10111:2;10099:9;10090:7;10086:23;10082:32;10079:119;;;10117:79;;:::i;:::-;10079:119;10265:1;10254:9;10250:17;10237:31;10295:18;10287:6;10284:30;10281:117;;;10317:79;;:::i;:::-;10281:117;10422:63;10477:7;10468:6;10457:9;10453:22;10422:63;:::i;:::-;10412:73;;10208:287;9993:509;;;;:::o;10508:86::-;10543:7;10583:4;10576:5;10572:16;10561:27;;10508:86;;;:::o;10600:112::-;10683:22;10699:5;10683:22;:::i;:::-;10678:3;10671:35;10600:112;;:::o;10718:214::-;10807:4;10845:2;10834:9;10830:18;10822:26;;10858:67;10922:1;10911:9;10907:17;10898:6;10858:67;:::i;:::-;10718:214;;;;:::o;10938:311::-;11015:4;11105:18;11097:6;11094:30;11091:56;;;11127:18;;:::i;:::-;11091:56;11177:4;11169:6;11165:17;11157:25;;11237:4;11231;11227:15;11219:23;;10938:311;;;:::o;11255:117::-;11364:1;11361;11354:12;11395:710;11491:5;11516:81;11532:64;11589:6;11532:64;:::i;:::-;11516:81;:::i;:::-;11507:90;;11617:5;11646:6;11639:5;11632:21;11680:4;11673:5;11669:16;11662:23;;11733:4;11725:6;11721:17;11713:6;11709:30;11762:3;11754:6;11751:15;11748:122;;;11781:79;;:::i;:::-;11748:122;11896:6;11879:220;11913:6;11908:3;11905:15;11879:220;;;11988:3;12017:37;12050:3;12038:10;12017:37;:::i;:::-;12012:3;12005:50;12084:4;12079:3;12075:14;12068:21;;11955:144;11939:4;11934:3;11930:14;11923:21;;11879:220;;;11883:21;11497:608;;11395:710;;;;;:::o;12128:370::-;12199:5;12248:3;12241:4;12233:6;12229:17;12225:27;12215:122;;12256:79;;:::i;:::-;12215:122;12373:6;12360:20;12398:94;12488:3;12480:6;12473:4;12465:6;12461:17;12398:94;:::i;:::-;12389:103;;12205:293;12128:370;;;;:::o;12504:539::-;12588:6;12637:2;12625:9;12616:7;12612:23;12608:32;12605:119;;;12643:79;;:::i;:::-;12605:119;12791:1;12780:9;12776:17;12763:31;12821:18;12813:6;12810:30;12807:117;;;12843:79;;:::i;:::-;12807:117;12948:78;13018:7;13009:6;12998:9;12994:22;12948:78;:::i;:::-;12938:88;;12734:302;12504:539;;;;:::o;13049:116::-;13119:21;13134:5;13119:21;:::i;:::-;13112:5;13109:32;13099:60;;13155:1;13152;13145:12;13099:60;13049:116;:::o;13171:133::-;13214:5;13252:6;13239:20;13230:29;;13268:30;13292:5;13268:30;:::i;:::-;13171:133;;;;:::o;13310:468::-;13375:6;13383;13432:2;13420:9;13411:7;13407:23;13403:32;13400:119;;;13438:79;;:::i;:::-;13400:119;13558:1;13583:53;13628:7;13619:6;13608:9;13604:22;13583:53;:::i;:::-;13573:63;;13529:117;13685:2;13711:50;13753:7;13744:6;13733:9;13729:22;13711:50;:::i;:::-;13701:60;;13656:115;13310:468;;;;;:::o;13784:307::-;13845:4;13935:18;13927:6;13924:30;13921:56;;;13957:18;;:::i;:::-;13921:56;13995:29;14017:6;13995:29;:::i;:::-;13987:37;;14079:4;14073;14069:15;14061:23;;13784:307;;;:::o;14097:423::-;14174:5;14199:65;14215:48;14256:6;14215:48;:::i;:::-;14199:65;:::i;:::-;14190:74;;14287:6;14280:5;14273:21;14325:4;14318:5;14314:16;14363:3;14354:6;14349:3;14345:16;14342:25;14339:112;;;14370:79;;:::i;:::-;14339:112;14460:54;14507:6;14502:3;14497;14460:54;:::i;:::-;14180:340;14097:423;;;;;:::o;14539:338::-;14594:5;14643:3;14636:4;14628:6;14624:17;14620:27;14610:122;;14651:79;;:::i;:::-;14610:122;14768:6;14755:20;14793:78;14867:3;14859:6;14852:4;14844:6;14840:17;14793:78;:::i;:::-;14784:87;;14600:277;14539:338;;;;:::o;14883:943::-;14978:6;14986;14994;15002;15051:3;15039:9;15030:7;15026:23;15022:33;15019:120;;;15058:79;;:::i;:::-;15019:120;15178:1;15203:53;15248:7;15239:6;15228:9;15224:22;15203:53;:::i;:::-;15193:63;;15149:117;15305:2;15331:53;15376:7;15367:6;15356:9;15352:22;15331:53;:::i;:::-;15321:63;;15276:118;15433:2;15459:53;15504:7;15495:6;15484:9;15480:22;15459:53;:::i;:::-;15449:63;;15404:118;15589:2;15578:9;15574:18;15561:32;15620:18;15612:6;15609:30;15606:117;;;15642:79;;:::i;:::-;15606:117;15747:62;15801:7;15792:6;15781:9;15777:22;15747:62;:::i;:::-;15737:72;;15532:287;14883:943;;;;;;;:::o;15832:474::-;15900:6;15908;15957:2;15945:9;15936:7;15932:23;15928:32;15925:119;;;15963:79;;:::i;:::-;15925:119;16083:1;16108:53;16153:7;16144:6;16133:9;16129:22;16108:53;:::i;:::-;16098:63;;16054:117;16210:2;16236:53;16281:7;16272:6;16261:9;16257:22;16236:53;:::i;:::-;16226:63;;16181:118;15832:474;;;;;:::o;16312:180::-;16360:77;16357:1;16350:88;16457:4;16454:1;16447:15;16481:4;16478:1;16471:15;16498:320;16542:6;16579:1;16573:4;16569:12;16559:22;;16626:1;16620:4;16616:12;16647:18;16637:81;;16703:4;16695:6;16691:17;16681:27;;16637:81;16765:2;16757:6;16754:14;16734:18;16731:38;16728:84;;16784:18;;:::i;:::-;16728:84;16549:269;16498:320;;;:::o;16824:220::-;16964:34;16960:1;16952:6;16948:14;16941:58;17033:3;17028:2;17020:6;17016:15;17009:28;16824:220;:::o;17050:366::-;17192:3;17213:67;17277:2;17272:3;17213:67;:::i;:::-;17206:74;;17289:93;17378:3;17289:93;:::i;:::-;17407:2;17402:3;17398:12;17391:19;;17050:366;;;:::o;17422:419::-;17588:4;17626:2;17615:9;17611:18;17603:26;;17675:9;17669:4;17665:20;17661:1;17650:9;17646:17;17639:47;17703:131;17829:4;17703:131;:::i;:::-;17695:139;;17422:419;;;:::o;17847:248::-;17987:34;17983:1;17975:6;17971:14;17964:58;18056:31;18051:2;18043:6;18039:15;18032:56;17847:248;:::o;18101:366::-;18243:3;18264:67;18328:2;18323:3;18264:67;:::i;:::-;18257:74;;18340:93;18429:3;18340:93;:::i;:::-;18458:2;18453:3;18449:12;18442:19;;18101:366;;;:::o;18473:419::-;18639:4;18677:2;18666:9;18662:18;18654:26;;18726:9;18720:4;18716:20;18712:1;18701:9;18697:17;18690:47;18754:131;18880:4;18754:131;:::i;:::-;18746:139;;18473:419;;;:::o;18898:232::-;19038:34;19034:1;19026:6;19022:14;19015:58;19107:15;19102:2;19094:6;19090:15;19083:40;18898:232;:::o;19136:366::-;19278:3;19299:67;19363:2;19358:3;19299:67;:::i;:::-;19292:74;;19375:93;19464:3;19375:93;:::i;:::-;19493:2;19488:3;19484:12;19477:19;;19136:366;;;:::o;19508:419::-;19674:4;19712:2;19701:9;19697:18;19689:26;;19761:9;19755:4;19751:20;19747:1;19736:9;19732:17;19725:47;19789:131;19915:4;19789:131;:::i;:::-;19781:139;;19508:419;;;:::o;19933:180::-;19981:77;19978:1;19971:88;20078:4;20075:1;20068:15;20102:4;20099:1;20092:15;20119:410;20159:7;20182:20;20200:1;20182:20;:::i;:::-;20177:25;;20216:20;20234:1;20216:20;:::i;:::-;20211:25;;20271:1;20268;20264:9;20293:30;20311:11;20293:30;:::i;:::-;20282:41;;20472:1;20463:7;20459:15;20456:1;20453:22;20433:1;20426:9;20406:83;20383:139;;20502:18;;:::i;:::-;20383:139;20167:362;20119:410;;;;:::o;20535:180::-;20583:77;20580:1;20573:88;20680:4;20677:1;20670:15;20704:4;20701:1;20694:15;20721:185;20761:1;20778:20;20796:1;20778:20;:::i;:::-;20773:25;;20812:20;20830:1;20812:20;:::i;:::-;20807:25;;20851:1;20841:35;;20856:18;;:::i;:::-;20841:35;20898:1;20895;20891:9;20886:14;;20721:185;;;;:::o;20912:230::-;21052:34;21048:1;21040:6;21036:14;21029:58;21121:13;21116:2;21108:6;21104:15;21097:38;20912:230;:::o;21148:366::-;21290:3;21311:67;21375:2;21370:3;21311:67;:::i;:::-;21304:74;;21387:93;21476:3;21387:93;:::i;:::-;21505:2;21500:3;21496:12;21489:19;;21148:366;;;:::o;21520:419::-;21686:4;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21520:419;;;:::o;21945:231::-;22085:34;22081:1;22073:6;22069:14;22062:58;22154:14;22149:2;22141:6;22137:15;22130:39;21945:231;:::o;22182:366::-;22324:3;22345:67;22409:2;22404:3;22345:67;:::i;:::-;22338:74;;22421:93;22510:3;22421:93;:::i;:::-;22539:2;22534:3;22530:12;22523:19;;22182:366;;;:::o;22554:419::-;22720:4;22758:2;22747:9;22743:18;22735:26;;22807:9;22801:4;22797:20;22793:1;22782:9;22778:17;22771:47;22835:131;22961:4;22835:131;:::i;:::-;22827:139;;22554:419;;;:::o;22979:180::-;23027:77;23024:1;23017:88;23124:4;23121:1;23114:15;23148:4;23145:1;23138:15;23165:141;23214:4;23237:3;23229:11;;23260:3;23257:1;23250:14;23294:4;23291:1;23281:18;23273:26;;23165:141;;;:::o;23312:93::-;23349:6;23396:2;23391;23384:5;23380:14;23376:23;23366:33;;23312:93;;;:::o;23411:107::-;23455:8;23505:5;23499:4;23495:16;23474:37;;23411:107;;;;:::o;23524:393::-;23593:6;23643:1;23631:10;23627:18;23666:97;23696:66;23685:9;23666:97;:::i;:::-;23784:39;23814:8;23803:9;23784:39;:::i;:::-;23772:51;;23856:4;23852:9;23845:5;23841:21;23832:30;;23905:4;23895:8;23891:19;23884:5;23881:30;23871:40;;23600:317;;23524:393;;;;;:::o;23923:60::-;23951:3;23972:5;23965:12;;23923:60;;;:::o;23989:142::-;24039:9;24072:53;24090:34;24099:24;24117:5;24099:24;:::i;:::-;24090:34;:::i;:::-;24072:53;:::i;:::-;24059:66;;23989:142;;;:::o;24137:75::-;24180:3;24201:5;24194:12;;24137:75;;;:::o;24218:269::-;24328:39;24359:7;24328:39;:::i;:::-;24389:91;24438:41;24462:16;24438:41;:::i;:::-;24430:6;24423:4;24417:11;24389:91;:::i;:::-;24383:4;24376:105;24294:193;24218:269;;;:::o;24493:73::-;24538:3;24493:73;:::o;24572:189::-;24649:32;;:::i;:::-;24690:65;24748:6;24740;24734:4;24690:65;:::i;:::-;24625:136;24572:189;;:::o;24767:186::-;24827:120;24844:3;24837:5;24834:14;24827:120;;;24898:39;24935:1;24928:5;24898:39;:::i;:::-;24871:1;24864:5;24860:13;24851:22;;24827:120;;;24767:186;;:::o;24959:543::-;25060:2;25055:3;25052:11;25049:446;;;25094:38;25126:5;25094:38;:::i;:::-;25178:29;25196:10;25178:29;:::i;:::-;25168:8;25164:44;25361:2;25349:10;25346:18;25343:49;;;25382:8;25367:23;;25343:49;25405:80;25461:22;25479:3;25461:22;:::i;:::-;25451:8;25447:37;25434:11;25405:80;:::i;:::-;25064:431;;25049:446;24959:543;;;:::o;25508:117::-;25562:8;25612:5;25606:4;25602:16;25581:37;;25508:117;;;;:::o;25631:169::-;25675:6;25708:51;25756:1;25752:6;25744:5;25741:1;25737:13;25708:51;:::i;:::-;25704:56;25789:4;25783;25779:15;25769:25;;25682:118;25631:169;;;;:::o;25805:295::-;25881:4;26027:29;26052:3;26046:4;26027:29;:::i;:::-;26019:37;;26089:3;26086:1;26082:11;26076:4;26073:21;26065:29;;25805:295;;;;:::o;26105:1395::-;26222:37;26255:3;26222:37;:::i;:::-;26324:18;26316:6;26313:30;26310:56;;;26346:18;;:::i;:::-;26310:56;26390:38;26422:4;26416:11;26390:38;:::i;:::-;26475:67;26535:6;26527;26521:4;26475:67;:::i;:::-;26569:1;26593:4;26580:17;;26625:2;26617:6;26614:14;26642:1;26637:618;;;;27299:1;27316:6;27313:77;;;27365:9;27360:3;27356:19;27350:26;27341:35;;27313:77;27416:67;27476:6;27469:5;27416:67;:::i;:::-;27410:4;27403:81;27272:222;26607:887;;26637:618;26689:4;26685:9;26677:6;26673:22;26723:37;26755:4;26723:37;:::i;:::-;26782:1;26796:208;26810:7;26807:1;26804:14;26796:208;;;26889:9;26884:3;26880:19;26874:26;26866:6;26859:42;26940:1;26932:6;26928:14;26918:24;;26987:2;26976:9;26972:18;26959:31;;26833:4;26830:1;26826:12;26821:17;;26796:208;;;27032:6;27023:7;27020:19;27017:179;;;27090:9;27085:3;27081:19;27075:26;27133:48;27175:4;27167:6;27163:17;27152:9;27133:48;:::i;:::-;27125:6;27118:64;27040:156;27017:179;27242:1;27238;27230:6;27226:14;27222:22;27216:4;27209:36;26644:611;;;26607:887;;26197:1303;;;26105:1395;;:::o;27506:174::-;27646:26;27642:1;27634:6;27630:14;27623:50;27506:174;:::o;27686:366::-;27828:3;27849:67;27913:2;27908:3;27849:67;:::i;:::-;27842:74;;27925:93;28014:3;27925:93;:::i;:::-;28043:2;28038:3;28034:12;28027:19;;27686:366;;;:::o;28058:419::-;28224:4;28262:2;28251:9;28247:18;28239:26;;28311:9;28305:4;28301:20;28297:1;28286:9;28282:17;28275:47;28339:131;28465:4;28339:131;:::i;:::-;28331:139;;28058:419;;;:::o;28483:228::-;28623:34;28619:1;28611:6;28607:14;28600:58;28692:11;28687:2;28679:6;28675:15;28668:36;28483:228;:::o;28717:366::-;28859:3;28880:67;28944:2;28939:3;28880:67;:::i;:::-;28873:74;;28956:93;29045:3;28956:93;:::i;:::-;29074:2;29069:3;29065:12;29058:19;;28717:366;;;:::o;29089:419::-;29255:4;29293:2;29282:9;29278:18;29270:26;;29342:9;29336:4;29332:20;29328:1;29317:9;29313:17;29306:47;29370:131;29496:4;29370:131;:::i;:::-;29362:139;;29089:419;;;:::o;29514:233::-;29553:3;29576:24;29594:5;29576:24;:::i;:::-;29567:33;;29622:66;29615:5;29612:77;29609:103;;29692:18;;:::i;:::-;29609:103;29739:1;29732:5;29728:13;29721:20;;29514:233;;;:::o;29753:169::-;29893:21;29889:1;29881:6;29877:14;29870:45;29753:169;:::o;29928:366::-;30070:3;30091:67;30155:2;30150:3;30091:67;:::i;:::-;30084:74;;30167:93;30256:3;30167:93;:::i;:::-;30285:2;30280:3;30276:12;30269:19;;29928:366;;;:::o;30300:419::-;30466:4;30504:2;30493:9;30489:18;30481:26;;30553:9;30547:4;30543:20;30539:1;30528:9;30524:17;30517:47;30581:131;30707:4;30581:131;:::i;:::-;30573:139;;30300:419;;;:::o;30725:174::-;30865:26;30861:1;30853:6;30849:14;30842:50;30725:174;:::o;30905:366::-;31047:3;31068:67;31132:2;31127:3;31068:67;:::i;:::-;31061:74;;31144:93;31233:3;31144:93;:::i;:::-;31262:2;31257:3;31253:12;31246:19;;30905:366;;;:::o;31277:419::-;31443:4;31481:2;31470:9;31466:18;31458:26;;31530:9;31524:4;31520:20;31516:1;31505:9;31501:17;31494:47;31558:131;31684:4;31558:131;:::i;:::-;31550:139;;31277:419;;;:::o;31702:172::-;31842:24;31838:1;31830:6;31826:14;31819:48;31702:172;:::o;31880:366::-;32022:3;32043:67;32107:2;32102:3;32043:67;:::i;:::-;32036:74;;32119:93;32208:3;32119:93;:::i;:::-;32237:2;32232:3;32228:12;32221:19;;31880:366;;;:::o;32252:419::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32252:419;;;:::o;32677:191::-;32717:3;32736:20;32754:1;32736:20;:::i;:::-;32731:25;;32770:20;32788:1;32770:20;:::i;:::-;32765:25;;32813:1;32810;32806:9;32799:16;;32834:3;32831:1;32828:10;32825:36;;;32841:18;;:::i;:::-;32825:36;32677:191;;;;:::o;32874:166::-;33014:18;33010:1;33002:6;32998:14;32991:42;32874:166;:::o;33046:366::-;33188:3;33209:67;33273:2;33268:3;33209:67;:::i;:::-;33202:74;;33285:93;33374:3;33285:93;:::i;:::-;33403:2;33398:3;33394:12;33387:19;;33046:366;;;:::o;33418:419::-;33584:4;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33418:419;;;:::o;33843:180::-;33983:32;33979:1;33971:6;33967:14;33960:56;33843:180;:::o;34029:366::-;34171:3;34192:67;34256:2;34251:3;34192:67;:::i;:::-;34185:74;;34268:93;34357:3;34268:93;:::i;:::-;34386:2;34381:3;34377:12;34370:19;;34029:366;;;:::o;34401:419::-;34567:4;34605:2;34594:9;34590:18;34582:26;;34654:9;34648:4;34644:20;34640:1;34629:9;34625:17;34618:47;34682:131;34808:4;34682:131;:::i;:::-;34674:139;;34401:419;;;:::o;34826:173::-;34966:25;34962:1;34954:6;34950:14;34943:49;34826:173;:::o;35005:366::-;35147:3;35168:67;35232:2;35227:3;35168:67;:::i;:::-;35161:74;;35244:93;35333:3;35244:93;:::i;:::-;35362:2;35357:3;35353:12;35346:19;;35005:366;;;:::o;35377:419::-;35543:4;35581:2;35570:9;35566:18;35558:26;;35630:9;35624:4;35620:20;35616:1;35605:9;35601:17;35594:47;35658:131;35784:4;35658:131;:::i;:::-;35650:139;;35377:419;;;:::o;35802:175::-;35942:27;35938:1;35930:6;35926:14;35919:51;35802:175;:::o;35983:366::-;36125:3;36146:67;36210:2;36205:3;36146:67;:::i;:::-;36139:74;;36222:93;36311:3;36222:93;:::i;:::-;36340:2;36335:3;36331:12;36324:19;;35983:366;;;:::o;36355:419::-;36521:4;36559:2;36548:9;36544:18;36536:26;;36608:9;36602:4;36598:20;36594:1;36583:9;36579:17;36572:47;36636:131;36762:4;36636:131;:::i;:::-;36628:139;;36355:419;;;:::o;36780:167::-;36920:19;36916:1;36908:6;36904:14;36897:43;36780:167;:::o;36953:366::-;37095:3;37116:67;37180:2;37175:3;37116:67;:::i;:::-;37109:74;;37192:93;37281:3;37192:93;:::i;:::-;37310:2;37305:3;37301:12;37294:19;;36953:366;;;:::o;37325:419::-;37491:4;37529:2;37518:9;37514:18;37506:26;;37578:9;37572:4;37568:20;37564:1;37553:9;37549:17;37542:47;37606:131;37732:4;37606:131;:::i;:::-;37598:139;;37325:419;;;:::o;37750:234::-;37890:34;37886:1;37878:6;37874:14;37867:58;37959:17;37954:2;37946:6;37942:15;37935:42;37750:234;:::o;37990:366::-;38132:3;38153:67;38217:2;38212:3;38153:67;:::i;:::-;38146:74;;38229:93;38318:3;38229:93;:::i;:::-;38347:2;38342:3;38338:12;38331:19;;37990:366;;;:::o;38362:419::-;38528:4;38566:2;38555:9;38551:18;38543:26;;38615:9;38609:4;38605:20;38601:1;38590:9;38586:17;38579:47;38643:131;38769:4;38643:131;:::i;:::-;38635:139;;38362:419;;;:::o;38787:148::-;38889:11;38926:3;38911:18;;38787:148;;;;:::o;38965:874::-;39068:3;39105:5;39099:12;39134:36;39160:9;39134:36;:::i;:::-;39186:89;39268:6;39263:3;39186:89;:::i;:::-;39179:96;;39306:1;39295:9;39291:17;39322:1;39317:166;;;;39497:1;39492:341;;;;39284:549;;39317:166;39401:4;39397:9;39386;39382:25;39377:3;39370:38;39463:6;39456:14;39449:22;39441:6;39437:35;39432:3;39428:45;39421:52;;39317:166;;39492:341;39559:38;39591:5;39559:38;:::i;:::-;39619:1;39633:154;39647:6;39644:1;39641:13;39633:154;;;39721:7;39715:14;39711:1;39706:3;39702:11;39695:35;39771:1;39762:7;39758:15;39747:26;;39669:4;39666:1;39662:12;39657:17;;39633:154;;;39816:6;39811:3;39807:16;39800:23;;39499:334;;39284:549;;39072:767;;38965:874;;;;:::o;39845:390::-;39951:3;39979:39;40012:5;39979:39;:::i;:::-;40034:89;40116:6;40111:3;40034:89;:::i;:::-;40027:96;;40132:65;40190:6;40185:3;40178:4;40171:5;40167:16;40132:65;:::i;:::-;40222:6;40217:3;40213:16;40206:23;;39955:280;39845:390;;;;:::o;40241:583::-;40463:3;40485:92;40573:3;40564:6;40485:92;:::i;:::-;40478:99;;40594:95;40685:3;40676:6;40594:95;:::i;:::-;40587:102;;40706:92;40794:3;40785:6;40706:92;:::i;:::-;40699:99;;40815:3;40808:10;;40241:583;;;;;;:::o;40830:225::-;40970:34;40966:1;40958:6;40954:14;40947:58;41039:8;41034:2;41026:6;41022:15;41015:33;40830:225;:::o;41061:366::-;41203:3;41224:67;41288:2;41283:3;41224:67;:::i;:::-;41217:74;;41300:93;41389:3;41300:93;:::i;:::-;41418:2;41413:3;41409:12;41402:19;;41061:366;;;:::o;41433:419::-;41599:4;41637:2;41626:9;41622:18;41614:26;;41686:9;41680:4;41676:20;41672:1;41661:9;41657:17;41650:47;41714:131;41840:4;41714:131;:::i;:::-;41706:139;;41433:419;;;:::o;41858:182::-;41998:34;41994:1;41986:6;41982:14;41975:58;41858:182;:::o;42046:366::-;42188:3;42209:67;42273:2;42268:3;42209:67;:::i;:::-;42202:74;;42285:93;42374:3;42285:93;:::i;:::-;42403:2;42398:3;42394:12;42387:19;;42046:366;;;:::o;42418:419::-;42584:4;42622:2;42611:9;42607:18;42599:26;;42671:9;42665:4;42661:20;42657:1;42646:9;42642:17;42635:47;42699:131;42825:4;42699:131;:::i;:::-;42691:139;;42418:419;;;:::o;42843:229::-;42983:34;42979:1;42971:6;42967:14;42960:58;43052:12;43047:2;43039:6;43035:15;43028:37;42843:229;:::o;43078:366::-;43220:3;43241:67;43305:2;43300:3;43241:67;:::i;:::-;43234:74;;43317:93;43406:3;43317:93;:::i;:::-;43435:2;43430:3;43426:12;43419:19;;43078:366;;;:::o;43450:419::-;43616:4;43654:2;43643:9;43639:18;43631:26;;43703:9;43697:4;43693:20;43689:1;43678:9;43674:17;43667:47;43731:131;43857:4;43731:131;:::i;:::-;43723:139;;43450:419;;;:::o;43875:175::-;44015:27;44011:1;44003:6;43999:14;43992:51;43875:175;:::o;44056:366::-;44198:3;44219:67;44283:2;44278:3;44219:67;:::i;:::-;44212:74;;44295:93;44384:3;44295:93;:::i;:::-;44413:2;44408:3;44404:12;44397:19;;44056:366;;;:::o;44428:419::-;44594:4;44632:2;44621:9;44617:18;44609:26;;44681:9;44675:4;44671:20;44667:1;44656:9;44652:17;44645:47;44709:131;44835:4;44709:131;:::i;:::-;44701:139;;44428:419;;;:::o;44853:224::-;44993:34;44989:1;44981:6;44977:14;44970:58;45062:7;45057:2;45049:6;45045:15;45038:32;44853:224;:::o;45083:366::-;45225:3;45246:67;45310:2;45305:3;45246:67;:::i;:::-;45239:74;;45322:93;45411:3;45322:93;:::i;:::-;45440:2;45435:3;45431:12;45424:19;;45083:366;;;:::o;45455:419::-;45621:4;45659:2;45648:9;45644:18;45636:26;;45708:9;45702:4;45698:20;45694:1;45683:9;45679:17;45672:47;45736:131;45862:4;45736:131;:::i;:::-;45728:139;;45455:419;;;:::o;45880:223::-;46020:34;46016:1;46008:6;46004:14;45997:58;46089:6;46084:2;46076:6;46072:15;46065:31;45880:223;:::o;46109:366::-;46251:3;46272:67;46336:2;46331:3;46272:67;:::i;:::-;46265:74;;46348:93;46437:3;46348:93;:::i;:::-;46466:2;46461:3;46457:12;46450:19;;46109:366;;;:::o;46481:419::-;46647:4;46685:2;46674:9;46670:18;46662:26;;46734:9;46728:4;46724:20;46720:1;46709:9;46705:17;46698:47;46762:131;46888:4;46762:131;:::i;:::-;46754:139;;46481:419;;;:::o;46906:175::-;47046:27;47042:1;47034:6;47030:14;47023:51;46906:175;:::o;47087:366::-;47229:3;47250:67;47314:2;47309:3;47250:67;:::i;:::-;47243:74;;47326:93;47415:3;47326:93;:::i;:::-;47444:2;47439:3;47435:12;47428:19;;47087:366;;;:::o;47459:419::-;47625:4;47663:2;47652:9;47648:18;47640:26;;47712:9;47706:4;47702:20;47698:1;47687:9;47683:17;47676:47;47740:131;47866:4;47740:131;:::i;:::-;47732:139;;47459:419;;;:::o;47884:237::-;48024:34;48020:1;48012:6;48008:14;48001:58;48093:20;48088:2;48080:6;48076:15;48069:45;47884:237;:::o;48127:366::-;48269:3;48290:67;48354:2;48349:3;48290:67;:::i;:::-;48283:74;;48366:93;48455:3;48366:93;:::i;:::-;48484:2;48479:3;48475:12;48468:19;;48127:366;;;:::o;48499:419::-;48665:4;48703:2;48692:9;48688:18;48680:26;;48752:9;48746:4;48742:20;48738:1;48727:9;48723:17;48716:47;48780:131;48906:4;48780:131;:::i;:::-;48772:139;;48499:419;;;:::o;48924:240::-;49064:34;49060:1;49052:6;49048:14;49041:58;49133:23;49128:2;49120:6;49116:15;49109:48;48924:240;:::o;49170:366::-;49312:3;49333:67;49397:2;49392:3;49333:67;:::i;:::-;49326:74;;49409:93;49498:3;49409:93;:::i;:::-;49527:2;49522:3;49518:12;49511:19;;49170:366;;;:::o;49542:419::-;49708:4;49746:2;49735:9;49731:18;49723:26;;49795:9;49789:4;49785:20;49781:1;49770:9;49766:17;49759:47;49823:131;49949:4;49823:131;:::i;:::-;49815:139;;49542:419;;;:::o;49967:98::-;50018:6;50052:5;50046:12;50036:22;;49967:98;;;:::o;50071:168::-;50154:11;50188:6;50183:3;50176:19;50228:4;50223:3;50219:14;50204:29;;50071:168;;;;:::o;50245:373::-;50331:3;50359:38;50391:5;50359:38;:::i;:::-;50413:70;50476:6;50471:3;50413:70;:::i;:::-;50406:77;;50492:65;50550:6;50545:3;50538:4;50531:5;50527:16;50492:65;:::i;:::-;50582:29;50604:6;50582:29;:::i;:::-;50577:3;50573:39;50566:46;;50335:283;50245:373;;;;:::o;50624:640::-;50819:4;50857:3;50846:9;50842:19;50834:27;;50871:71;50939:1;50928:9;50924:17;50915:6;50871:71;:::i;:::-;50952:72;51020:2;51009:9;51005:18;50996:6;50952:72;:::i;:::-;51034;51102:2;51091:9;51087:18;51078:6;51034:72;:::i;:::-;51153:9;51147:4;51143:20;51138:2;51127:9;51123:18;51116:48;51181:76;51252:4;51243:6;51181:76;:::i;:::-;51173:84;;50624:640;;;;;;;:::o;51270:141::-;51326:5;51357:6;51351:13;51342:22;;51373:32;51399:5;51373:32;:::i;:::-;51270:141;;;;:::o;51417:349::-;51486:6;51535:2;51523:9;51514:7;51510:23;51506:32;51503:119;;;51541:79;;:::i;:::-;51503:119;51661:1;51686:63;51741:7;51732:6;51721:9;51717:22;51686:63;:::i;:::-;51676:73;;51632:127;51417:349;;;;:::o;51772:194::-;51812:4;51832:20;51850:1;51832:20;:::i;:::-;51827:25;;51866:20;51884:1;51866:20;:::i;:::-;51861:25;;51910:1;51907;51903:9;51895:17;;51934:1;51928:4;51925:11;51922:37;;;51939:18;;:::i;:::-;51922:37;51772:194;;;;:::o;51972:180::-;52020:77;52017:1;52010:88;52117:4;52114:1;52107:15;52141:4;52138:1;52131:15;52158:182;52298:34;52294:1;52286:6;52282:14;52275:58;52158:182;:::o;52346:366::-;52488:3;52509:67;52573:2;52568:3;52509:67;:::i;:::-;52502:74;;52585:93;52674:3;52585:93;:::i;:::-;52703:2;52698:3;52694:12;52687:19;;52346:366;;;:::o;52718:419::-;52884:4;52922:2;52911:9;52907:18;52899:26;;52971:9;52965:4;52961:20;52957:1;52946:9;52942:17;52935:47;52999:131;53125:4;52999:131;:::i;:::-;52991:139;;52718:419;;;:::o;53143:178::-;53283:30;53279:1;53271:6;53267:14;53260:54;53143:178;:::o;53327:366::-;53469:3;53490:67;53554:2;53549:3;53490:67;:::i;:::-;53483:74;;53566:93;53655:3;53566:93;:::i;:::-;53684:2;53679:3;53675:12;53668:19;;53327:366;;;:::o;53699:419::-;53865:4;53903:2;53892:9;53888:18;53880:26;;53952:9;53946:4;53942:20;53938:1;53927:9;53923:17;53916:47;53980:131;54106:4;53980:131;:::i;:::-;53972:139;;53699:419;;;:::o
Swarm Source
ipfs://418aefae66f6c888f7a370b8c900cb01626bf32fca65343792bf01cce674e969