ERC-721
Overview
Max Total Supply
2,222 MeatKites
Holders
557
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MeatKitesLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MeatKitesMaker
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-30 */ // SPDX-License-Identifier: VPL - VIRAL PUBLIC LICENSE pragma solidity ^0.8.13; /* MMMMMMMM MMMMMMMMEEEEEEEEEEEEEEEEEEEEEE AAA TTTTTTTTTTTTTTTTTTTTTTT M:::::::M M:::::::ME::::::::::::::::::::E A:::A T:::::::::::::::::::::T M::::::::M M::::::::ME::::::::::::::::::::E A:::::A T:::::::::::::::::::::T M:::::::::M M:::::::::MEE::::::EEEEEEEEE::::E A:::::::A T:::::TT:::::::TT:::::T M::::::::::M M::::::::::M E:::::E EEEEEE A:::::::::A TTTTTT T:::::T TTTTTT M:::::::::::M M:::::::::::M E:::::E A:::::A:::::A T:::::T M:::::::M::::M M::::M:::::::M E::::::EEEEEEEEEE A:::::A A:::::A T:::::T M::::::M M::::M M::::M M::::::M E:::::::::::::::E A:::::A A:::::A T:::::T M::::::M M::::M::::M M::::::M E:::::::::::::::E A:::::A A:::::A T:::::T M::::::M M:::::::M M::::::M E::::::EEEEEEEEEE A:::::AAAAAAAAA:::::A T:::::T M::::::M M:::::M M::::::M E:::::E A:::::::::::::::::::::A T:::::T M::::::M MMMMM M::::::M E:::::E EEEEEE A:::::AAAAAAAAAAAAA:::::A T:::::T M::::::M M::::::MEE::::::EEEEEEEE:::::E A:::::A A:::::A TT:::::::TT M::::::M M::::::ME::::::::::::::::::::E A:::::A A:::::A T:::::::::T M::::::M M::::::ME::::::::::::::::::::E A:::::A A:::::A T:::::::::T MMMMMMMM MMMMMMMMEEEEEEEEEEEEEEEEEEEEEEAAAAAAA AAAAAAATTTTTTTTTTT KKKKKKKKK KKKKKKKIIIIIIIIIITTTTTTTTTTTTTTTTTTTTTTTEEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS K:::::::K K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::E SS:::::::::::::::S K:::::::K K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::ES:::::SSSSSS::::::S K:::::::K K::::::KII::::::IIT:::::TT:::::::TT:::::TEE::::::EEEEEEEEE::::ES:::::S SSSSSSS KK::::::K K:::::KKK I::::I TTTTTT T:::::T TTTTTT E:::::E EEEEEES:::::S K:::::K K:::::K I::::I T:::::T E:::::E S:::::S K::::::K:::::K I::::I T:::::T E::::::EEEEEEEEEE S::::SSSS K:::::::::::K I::::I T:::::T E:::::::::::::::E SS::::::SSSSS K:::::::::::K I::::I T:::::T E:::::::::::::::E SSS::::::::SS K::::::K:::::K I::::I T:::::T E::::::EEEEEEEEEE SSSSSS::::S K:::::K K:::::K I::::I T:::::T E:::::E S:::::S KK::::::K K:::::KKK I::::I T:::::T E:::::E EEEEEE S:::::S K:::::::K K::::::KII::::::II TT:::::::TT EE::::::EEEEEEEE:::::ESSSSSSS S:::::S K:::::::K K:::::KI::::::::I T:::::::::T E::::::::::::::::::::ES::::::SSSSSS:::::S K:::::::K K:::::KI::::::::I T:::::::::T E::::::::::::::::::::ES:::::::::::::::SS KKKKKKKKK KKKKKKKIIIIIIIIII TTTTTTTTTTT EEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS meatkites.xyz | twitter.com/no_side666 The most exotic pets generated entirely 'in-chain'. (copyleft) 2023 VPL no_side666 */ /// @notice Library to encode strings in Base64. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol) /// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>. library Base64 { /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// See: https://datatracker.ietf.org/doc/html/rfc4648 /// @param fileSafe Whether to replace '+' with '-' and '/' with '_'. /// @param noPadding Whether to strip away the padding. function encode(bytes memory data, bool fileSafe, bool noPadding) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { for { let dataLength := mload(data) } dataLength {} { // Multiply by 4/3 rounded up. // The `shl(2, ...)` is equivalent to multiplying by 4. let encodedLength := shl(2, div(add(dataLength, 2), 3)) // Set `result` to point to the start of the free memory. result := mload(0x40) // Store the table into the scratch space. // Offsetted by -1 byte so that the `mload` will load the character. // We will rewrite the free memory pointer at `0x40` later with // the allocated size. // The magic constant 0x0230 will translate "-_" + "+/". mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef") mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230))) // Skip the first slot, which stores the length. let ptr := add(result, 0x20) let end := add(ptr, encodedLength) // Run over the input, 3 bytes at a time. for {} 1 {} { data := add(data, 3) // Advance 3 bytes. let input := mload(data) // Write 4 bytes. Optimized for fewer stack operations. mstore8(ptr, mload(and(shr(18, input), 0x3F))) mstore8(add(ptr, 1), mload(and(shr(12, input), 0x3F))) mstore8(add(ptr, 2), mload(and(shr(6, input), 0x3F))) mstore8(add(ptr, 3), mload(and(input, 0x3F))) ptr := add(ptr, 4) // Advance 4 bytes. if iszero(lt(ptr, end)) { break } } // Allocate the memory for the string. // Add 31 and mask with `not(31)` to round the // free memory pointer up the next multiple of 32. mstore(0x40, and(add(end, 31), not(31))) let r := mod(dataLength, 3) if iszero(noPadding) { // Offset `ptr` and pad with '='. We can simply write over the end. mstore8(sub(ptr, iszero(iszero(r))), 0x3d) // Pad at `ptr - 1` if `r > 0`. mstore8(sub(ptr, shl(1, eq(r, 1))), 0x3d) // Pad at `ptr - 2` if `r == 1`. // Write the length of the string. mstore(result, encodedLength) break } // Write the length of the string. mstore(result, sub(encodedLength, add(iszero(iszero(r)), eq(r, 1)))) break } } } /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// Equivalent to `encode(data, false, false)`. function encode(bytes memory data) internal pure returns (string memory result) { result = encode(data, false, false); } /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// Equivalent to `encode(data, fileSafe, false)`. function encode(bytes memory data, bool fileSafe) internal pure returns (string memory result) { result = encode(data, fileSafe, false); } /// @dev Encodes base64 encoded `data`. /// /// Supports: /// - RFC 4648 (both standard and file-safe mode). /// - RFC 3501 (63: ','). /// /// Does not support: /// - Line breaks. /// /// Note: For performance reasons, /// this function will NOT revert on invalid `data` inputs. /// Outputs for invalid inputs will simply be undefined behaviour. /// It is the user's responsibility to ensure that the `data` /// is a valid base64 encoded string. function decode(string memory data) internal pure returns (bytes memory result) { /// @solidity memory-safe-assembly assembly { let dataLength := mload(data) if dataLength { let end := add(data, dataLength) let decodedLength := mul(shr(2, dataLength), 3) for {} 1 {} { // If padded. if iszero(and(dataLength, 3)) { let t := xor(mload(end), 0x3d3d) // forgefmt: disable-next-item decodedLength := sub( decodedLength, add(iszero(byte(30, t)), iszero(byte(31, t))) ) break } // If non-padded. decodedLength := add(decodedLength, sub(and(dataLength, 3), 1)) break } result := mload(0x40) // Write the length of the string. mstore(result, decodedLength) // Skip the first slot, which stores the length. let ptr := add(result, 0x20) // Load the table into the scratch space. // Constants are optimized for smaller bytecode with zero gas overhead. // `m` also doubles as the mask of the upper 6 bits. let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc mstore(0x5b, m) mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064) mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4) for {} 1 {} { // Read 4 bytes. data := add(data, 4) let input := mload(data) // Write 3 bytes. // forgefmt: disable-next-item mstore(ptr, or( and(m, mload(byte(28, input))), shr(6, or( and(m, mload(byte(29, input))), shr(6, or( and(m, mload(byte(30, input))), shr(6, mload(byte(31, input))) )) )) )) ptr := add(ptr, 3) if iszero(lt(data, end)) { break } } // Allocate the memory for the string. // Add 32 + 31 and mask with `not(31)` to round the // free memory pointer up the next multiple of 32. mstore(0x40, and(add(add(result, decodedLength), 63), not(31))) // Restore the zero slot. mstore(0x60, 0) } } } } // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } /** * @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); } /// @notice Read and write to persistent storage at a fraction of the cost. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SSTORE2.sol) /// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol) library SSTORE2 { error SSTORE2_DEPLOYMENT_FAILED(); error SSTORE2_READ_OUT_OF_BOUNDS(); // We skip the first byte as it's a STOP opcode to ensure the contract can't be called. uint256 internal constant DATA_OFFSET = 1; /*////////////////////////////////////////////////////////////// WRITE LOGIC //////////////////////////////////////////////////////////////*/ function write(bytes memory data) internal returns (address pointer) { // Note: The assembly block below does not expand the memory. assembly { let originalDataLength := mload(data) // Add 1 to data size since we are prefixing it with a STOP opcode. let dataSize := add(originalDataLength, 1) /** * ------------------------------------------------------------------------------------+ * Opcode | Opcode + Arguments | Description | Stack View | * ------------------------------------------------------------------------------------| * 0x61 | 0x61XXXX | PUSH2 codeSize | codeSize | * 0x80 | 0x80 | DUP1 | codeSize codeSize | * 0x60 | 0x600A | PUSH1 10 | 10 codeSize codeSize | * 0x3D | 0x3D | RETURNDATASIZE | 0 10 codeSize codeSize | * 0x39 | 0x39 | CODECOPY | codeSize | * 0x3D | 0x3D | RETURNDATASZIE | 0 codeSize | * 0xF3 | 0xF3 | RETURN | | * 0x00 | 0x00 | STOP | | * ------------------------------------------------------------------------------------+ * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called. Also PUSH2 is * used since max contract size cap is 24,576 bytes which is less than 2 ** 16. */ mstore( data, or( 0x61000080600a3d393df300, shl(64, dataSize) // shift `dataSize` so that it lines up with the 0000 after PUSH2 ) ) // Deploy a new contract with the generated creation code. pointer := create(0, add(data, 21), add(dataSize, 10)) // Restore original length of the variable size `data` mstore(data, originalDataLength) } if (pointer == address(0)) { revert SSTORE2_DEPLOYMENT_FAILED(); } } /*////////////////////////////////////////////////////////////// READ LOGIC //////////////////////////////////////////////////////////////*/ function read(address pointer) internal view returns (bytes memory) { return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET); } function read(address pointer, uint256 start) internal view returns (bytes memory) { start += DATA_OFFSET; return readBytecode(pointer, start, pointer.code.length - start); } function read( address pointer, uint256 start, uint256 end ) internal view returns (bytes memory) { start += DATA_OFFSET; end += DATA_OFFSET; if (pointer.code.length < end) { revert SSTORE2_READ_OUT_OF_BOUNDS(); } return readBytecode(pointer, start, end - start); } /*////////////////////////////////////////////////////////////// INTERNAL HELPER LOGIC //////////////////////////////////////////////////////////////*/ function readBytecode( address pointer, uint256 start, uint256 size ) private view returns (bytes memory data) { assembly { // Get a pointer to some free memory. data := mload(0x40) // Update the free memory pointer to prevent overriding our data. // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)). // Adding 63 (32 + 31) to size and running the result through the logic // above ensures the memory pointer remains word-aligned, following // the Solidity convention. mstore(0x40, add(data, and(add(size, 63), not(31)))) // Store the size of the data in the first 32 byte chunk of free memory. mstore(data, size) // Copy the code into memory right after the 32 bytes we used to store the size. extcodecopy(pointer, add(data, 32), start, size) } } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @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); } } // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } /** * @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]; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @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); } } } /** * @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); } } abstract contract MarketWares is ERC2981, Ownable { address immutable private _tokenImagePtr; address immutable private _royaltyReceiver; constructor(bytes memory bTokenImage) Ownable() { _royaltyReceiver = owner(); _setDefaultRoyalty(_royaltyReceiver, 500); // ERC2981 5% royalty on secondary sales _tokenImagePtr = SSTORE2.write(bTokenImage); } // needed for opensea function contractURI() public view returns(string memory) { return string(abi.encodePacked( "data:application/json;base64,", Base64.encode(abi.encodePacked("{\"name\": \"MeatKites\"," " \"description\": \"The most exotic pets generated entirely 'in-chain'. meatkites.xyz | twitter.com/no_side666\"," " \"image\": \"", "data:image/svg+xml;base64,", Base64.encode(SSTORE2.read(_tokenImagePtr)), "\",", " \"seller_fee_basis_points:\": \"500\"," " \"fee_recipient\": \"", Strings.toHexString(_royaltyReceiver) ,"\"}")))); } function sendETH() external { (bool success,) = owner().call{value: address(this).balance}(""); require(success, "call failed."); } } /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } } interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } abstract contract OperatorFilteredERC721 is ERC721, DefaultOperatorFilterer { constructor( string memory name_, string memory symbol_ ) ERC721(name_, symbol_) {} // overrides for DefaultOperatorFilterer, which enables creator fees on opensea function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } } interface IRenderer { function renderAttributes(uint256 tokenId) external view returns(string memory); function renderSVG(uint256 tokenId) external view returns(string memory); } contract MeatKitesMaker is OperatorFilteredERC721, MarketWares { uint256 public totalSupply; // qty's uint256 constant public FREE_MINT = 100; uint256 constant public PEOPLE_PRICES_MINT = 300; uint256 constant public MAX_SUPPLY = 2222; // prices uint256 constant public PEOPLE_PRICE = 0.01 ether; uint256 constant public WANKER_PRICE = 0.1 ether; uint256 public publicMintDate; IRenderer internal _renderer; constructor(address renderer_, bytes memory bTokenImage) OperatorFilteredERC721("MKs", "MeatKites") MarketWares(bTokenImage) { _renderer = IRenderer(renderer_); } function mint(address to) external payable returns(uint256 lastTokenId) { return _mintTo({to: to, discounted: false}); } function mintDiscounted(address to) external payable returns(uint256 lastTokenId) { return _mintTo({to: to, discounted: callerOwnsSweetNFTs()}); } function publicMintActive() public view returns(bool) { uint256 _publicMintDate = publicMintDate; return (_publicMintDate != 0) && (block.timestamp > _publicMintDate); } function currentPrice() external view returns(uint256) { return _currentPrice({totalSupply_: totalSupply, discounted: false}); } function currentDiscountedPrice() external view returns(uint256) { return _currentPrice({ totalSupply_: totalSupply, discounted: callerOwnsSweetNFTs()}); } function callerOwnsSweetNFTs() public view returns(bool isCoolOwner) { IERC721[4] memory coolNFTs = [ IERC721(address(0x5078981549A1CC18673eb76fb47468f546aAdc51)), // FEETPIX wtf IERC721(address(0xeF1a89cbfAbE59397FfdA11Fc5DF293E9bC5Db90)), // BASED GHOULS IERC721(address(0x5Af0D9827E0c53E4799BB226655A1de152A425a5)), // MILADY MAKER IERC721(address(0x5DcE0bB0778694Ef3Ba79Bb702b88CAC1879cc7D))]; // bonSAI NFT for (uint256 i; i < coolNFTs.length; ++i) { if ((coolNFTs[i]).balanceOf(msg.sender) > 0) { isCoolOwner = true; break; } } } function tokenURI(uint256 tokenId) public view override returns(string memory) { require(tokenId < totalSupply, "tokenId dne."); string memory attributes = _renderer.renderAttributes(tokenId); assembly { // delete last comma mstore(attributes, sub(mload(attributes), 1)) } return string(abi.encodePacked( "data:application/json;base64,", Base64.encode(abi.encodePacked( "{\"name\":\"MeatKites ", Strings.toString(tokenId), "\", \"description\":\"the most exotic in-chain pets", "\", \"attributes\":[", attributes, "], \"image\":\"data:image/svg+xml;base64,", Base64.encode(bytes(_renderer.renderSVG(tokenId))), "\"}" )))); } function renderSVG(uint256 tokenId) external view virtual returns(string memory) { require(tokenId < totalSupply, "tokenId dne."); return string(Base64.encode(bytes(_renderer.renderSVG(tokenId)))); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC721Metadata super.supportsInterface(interfaceId); } // priveledged fns function setPublicMintDate(uint256 publicMintDate_) external onlyOwner virtual { require(publicMintDate == 0, "can only set once."); publicMintDate = publicMintDate_; } // internal/private fns function _mintTo(address to, bool discounted) private returns(uint256 lastTokenId) { require(publicMintActive() || msg.sender == owner(), "!publicMintActive."); uint256 tokenId = totalSupply; uint256 currentPrice_ = _currentPrice({totalSupply_: tokenId, discounted: discounted}); unchecked{ uint256 qty = (currentPrice_ > 0) ? msg.value / currentPrice_ : 1; // means freeMint is qty=1 at a time _checkQty(qty, tokenId); for (uint256 i; i < qty; ++i) { _mint(to, tokenId++); } lastTokenId = tokenId; totalSupply = lastTokenId; }//uc all math here safe } function _currentPrice(uint256 totalSupply_, bool discounted) private pure returns(uint256){ unchecked{ uint256 divisor = (discounted) ? 2 : 1; uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY]; if (totalSupply_ < checkpoints[0]) { return 0; // free } else if (totalSupply_ < checkpoints[1]) { return PEOPLE_PRICE / divisor; } return WANKER_PRICE / divisor; }//uc } function _checkQty(uint256 desiredQty, uint256 totalSupply_) private pure { require(desiredQty > 0, "msg.value must be n * currentPrice()."); // this crosses over interval boundary thankfully unchecked{ uint256 sum = desiredQty + totalSupply_; // won't overflow due to scarcity of eth and max supply require(sum <= MAX_SUPPLY, "all tokens minted."); if (desiredQty == 1) return; uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY]; bool inDifferentIntervals; for (uint256 i; i < checkpoints.length; ++i) { if ((totalSupply_ < checkpoints[i]) != (sum <= checkpoints[i])) { inDifferentIntervals = true; break; } } require(!inDifferentIntervals, "qty out of range."); }//uc } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"renderer_","type":"address"},{"internalType":"bytes","name":"bTokenImage","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"SSTORE2_DEPLOYMENT_FAILED","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICES_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WANKER_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerOwnsSweetNFTs","outputs":[{"internalType":"bool","name":"isCoolOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDiscountedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintDiscounted","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"stateMutability":"payable","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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"renderSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"sendETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicMintDate_","type":"uint256"}],"name":"setPublicMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002cbd38038062002cbd833981016040819052620000349162000441565b80604051806040016040528060038152602001624d4b7360e81b815250604051806040016040528060098152602001684d6561744b6974657360b81b815250733cc6cdda760b79bafa08df41ecfa224f810dceb66001838381600090816200009d9190620005c6565b506001620000ac8282620005c6565b5050506daaeb6d7670e522a718067333cd4e3b15620001f45780156200014257604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012357600080fd5b505af115801562000138573d6000803e3d6000fd5b50505050620001f4565b6001600160a01b03821615620001935760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000108565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050505b50505050620002126200020c6200027760201b60201c565b6200027b565b6008546001600160a01b031660a081905262000231906101f4620002cd565b6200024781620003d260201b62000efe1760201c565b6001600160a01b03908116608052600b80546001600160a01b031916949091169390931790925550620006929050565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620003415760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003995760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000338565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b0381166200042657604051632da4836960e21b815260040160405180910390fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200045557600080fd5b82516001600160a01b03811681146200046d57600080fd5b602084810151919350906001600160401b03808211156200048d57600080fd5b818601915086601f830112620004a257600080fd5b815181811115620004b757620004b76200042b565b604051601f8201601f19908116603f01168101908382118183101715620004e257620004e26200042b565b816040528281528986848701011115620004fb57600080fd5b600093505b828410156200051f578484018601518185018701529285019262000500565b60008684830101528096505050505050509250929050565b600181811c908216806200054c57607f821691505b6020821081036200056d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005c157600081815260208120601f850160051c810160208610156200059c5750805b601f850160051c820191505b81811015620005bd57828155600101620005a8565b5050505b505050565b81516001600160401b03811115620005e257620005e26200042b565b620005fa81620005f3845462000537565b8462000573565b602080601f831160018114620006325760008415620006195750858301515b600019600386901b1c1916600185901b178555620005bd565b600085815260208120601f198616915b82811015620006635788860151825594840194600190910190840162000642565b5085821015620006825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612605620006b86000396000610e2f01526000610e0601526126056000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000000000000000000000000000000000000000000006117e7565b610e537f0000000000000000000000000000000000000000000000000000000000000000611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000028d2c3e75ecf20aeee222af60e91fddf0b01c1126117e7565b610e537f000000000000000000000000d64e3c25b0cc9afb535157cbb96eb601a47650fa611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000
-----Decoded View---------------
Arg [0] : renderer_ (address): 0xb7849A7C0793aE20026ACC1198d6532BBd5DAd7E
Arg [1] : bTokenImage (bytes): 0x3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e
-----Encoded View---------------
129 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000fb2
Arg [3] : 3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d
Arg [4] : 2266756c6c22202020202076696577426f783d22302030203130302031303022
Arg [5] : 2020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230
Arg [6] : 30302f7376672220202020203e3c7374796c653e202020202e7374616e646172
Arg [7] : 64416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475
Arg [8] : 726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d
Arg [9] : 696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e69
Arg [10] : 6d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e697465
Arg [11] : 3b202020207d20202020406b65796672616d65732073797374656d4d6f74696f
Arg [12] : 6e207b2020202020202020333325207b2020202020202020202020207472616e
Arg [13] : 73666f726d3a206d617472697828312c302c302c312c302c31293b2020202020
Arg [14] : 2020207d2020202020202020363625207b202020202020202020202020747261
Arg [15] : 6e73666f726d3a206d617472697828312c302c302c312c302c2d31293b202020
Arg [16] : 20202020207d202020207d20202020406b65796672616d657320636c6f756441
Arg [17] : 6e696d6174696f6e30207b202020202020202066726f6d207b20202020202020
Arg [18] : 20202020206f7061636974793a2030253b202020202020202020202020207472
Arg [19] : 616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20
Arg [20] : 202020202020207d2020202020202020203125207b2020202020202020202020
Arg [21] : 206f7061636974793a20313030253b202020202020202020202020207472616e
Arg [22] : 73666f726d3a206d617472697828312c302c302c312c39302c3130293b202020
Arg [23] : 20202020207d2020202020202020393925207b2020202020202020202020206f
Arg [24] : 7061636974793a20313030253b202020202020202020202020207472616e7366
Arg [25] : 6f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020
Arg [26] : 202020207d2020202020202020746f207b2020202020202020202020206f7061
Arg [27] : 636974793a2030253b202020202020202020202020207472616e73666f726d3a
Arg [28] : 206d617472697828312c302c302c312c2d39302c3130293b2020202020202020
Arg [29] : 7d202020207d20202020406b65796672616d657320636c6f7564416e696d6174
Arg [30] : 696f6e31207b202020202020202066726f6d207b202020202020202020202020
Arg [31] : 6f7061636974793a2030253b202020202020202020202020207472616e73666f
Arg [32] : 726d3a206d617472697828312c302c302c312c39302c2d3230293b2020202020
Arg [33] : 2020207d2020202020202020203125207b2020202020202020202020206f7061
Arg [34] : 636974793a20313030253b202020202020202020202020207472616e73666f72
Arg [35] : 6d3a206d617472697828312c302c302c312c39302c2d3230293b202020202020
Arg [36] : 20207d2020202020202020393925207b2020202020202020202020206f706163
Arg [37] : 6974793a20313030253b202020202020202020202020207472616e73666f726d
Arg [38] : 3a206d617472697828312c302c302c312c2d39302c2d3230293b202020202020
Arg [39] : 20207d2020202020202020746f207b2020202020202020202020206f70616369
Arg [40] : 74793a2030253b202020202020202020202020207472616e73666f726d3a206d
Arg [41] : 617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d
Arg [42] : 202020207d20202020406b65796672616d657320636c6f7564416e696d617469
Arg [43] : 6f6e32207b202020202020202066726f6d207b2020202020202020202020206f
Arg [44] : 7061636974793a2030253b202020202020202020202020207472616e73666f72
Arg [45] : 6d3a206d617472697828312c302c302c312c39302c3330293b20202020202020
Arg [46] : 207d2020202020202020203125207b2020202020202020202020206f70616369
Arg [47] : 74793a20313030253b202020202020202020202020207472616e73666f726d3a
Arg [48] : 206d617472697828312c302c302c312c39302c3330293b20202020202020207d
Arg [49] : 2020202020202020393925207b2020202020202020202020206f706163697479
Arg [50] : 3a20313030253b202020202020202020202020207472616e73666f726d3a206d
Arg [51] : 617472697828312c302c302c312c2d39302c3330293b20202020202020207d20
Arg [52] : 20202020202020746f207b2020202020202020202020206f7061636974793a20
Arg [53] : 30253b202020202020202020202020207472616e73666f726d3a206d61747269
Arg [54] : 7828312c302c302c312c2d39302c3330293b20202020202020207d202020207d
Arg [55] : 202020202e737461727473496e76697369626c65207b6f7061636974793a2030
Arg [56] : 253b20202020207d2020202020202020202e636c6f75644d617373207b202020
Arg [57] : 202020202066696c6c3a2077686974653b20202020207d202020202020202020
Arg [58] : 2e636c6f7564416363656e74207b202020202020202066696c6c3a2023383743
Arg [59] : 4546413b20202020207d2020202023636c6f756430207b202020202020202061
Arg [60] : 6e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f
Arg [61] : 6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e
Arg [62] : 616d653a20636c6f7564416e696d6174696f6e303b202020207d202020202363
Arg [63] : 6c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f
Arg [64] : 6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020
Arg [65] : 202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d61
Arg [66] : 74696f6e313b202020207d2020202023636c6f756432207b2020202020202020
Arg [67] : 616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d617469
Arg [68] : 6f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d
Arg [69] : 6e616d653a20636c6f7564416e696d6174696f6e323b202020207d2020202023
Arg [70] : 73797374656d207b2020202020202020616e696d6174696f6e2d647572617469
Arg [71] : 6f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073
Arg [72] : 797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069
Arg [73] : 643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d
Arg [74] : 22234646464646462220643d224d3020304831303056313030483056305a2220
Arg [75] : 2f3e3c706174682069643d22626c7565736b792220636c6173733d2222206669
Arg [76] : 6c6c3d22233837434546412220643d224d302030483130305631303048305630
Arg [77] : 5a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64
Arg [78] : 617264416e696d6174696f6e20737461727473496e76697369626c6522206669
Arg [79] : 6c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c61
Arg [80] : 73733d22636c6f75644d617373222066696c6c3d222220643d224d3136203530
Arg [81] : 5635354832365635364834305635354835325635364836345635344837385635
Arg [82] : 3548383756353448393356343448383956343048383256333548363456333648
Arg [83] : 3538563431483532563433483531563338483439563335483432563333483330
Arg [84] : 5633354832345634314832305635304831365a22202f3e3c706174682069643d
Arg [85] : 22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e
Arg [86] : 74222066696c6c3d222220643d224d3336203338563430483430563434483433
Arg [87] : 5633384833365a4d37312034305634324837355634344837375634304837315a
Arg [88] : 4d35362034395635314837315634394835365a4d323320343856353048333556
Arg [89] : 34384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c61
Arg [90] : 73733d227374616e64617264416e696d6174696f6e20737461727473496e7669
Arg [91] : 7369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d
Arg [92] : 617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220
Arg [93] : 643d224d34312033335633354832385633394831365634344831325635334831
Arg [94] : 3656353748323856363048343056363148353556363048363556353748373356
Arg [95] : 35344838315634354837335634314836355633384835355633334834315a2220
Arg [96] : 2f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d
Arg [97] : 22636c6f7564416363656e74222066696c6c3d222220643d224d343620353256
Arg [98] : 35354835395635314835375635324834365a22202f3e3c2f673e3c672069643d
Arg [99] : 22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f
Arg [100] : 6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174
Arg [101] : 682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d61
Arg [102] : 7373222066696c6c3d222220643d224d31362035305635354832365635364834
Arg [103] : 3056353548353256353648363456353448373856353548383756353448393356
Arg [104] : 3434483839563430483832563335483634563336483538563431483532563433
Arg [105] : 4835315633384834395633354834325633334833305633354832345634314832
Arg [106] : 305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e
Arg [107] : 74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220
Arg [108] : 643d224d33362033385634304834305634344834335633384833365a4d373120
Arg [109] : 34305634324837355634344837375634304837315a4d35362034395635314837
Arg [110] : 315634394835365a4d32332034385635304833355634384832335a22202f3e3c
Arg [111] : 2f673e3c672069643d2273797374656d2220636c6173733d227374616e646172
Arg [112] : 64416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d2274
Arg [113] : 69746c6554657874222066696c6c3d22626c61636b2220643d224d3131203337
Arg [114] : 5635304831325633384831335634304831345634324831365634304831375633
Arg [115] : 3848313856353048323156333748313756333848313656343048313456333848
Arg [116] : 31335633374831315a204d323320333748323956333848323456343348323956
Arg [117] : 34344832355634394832395635304832335633374d3333203337563434483331
Arg [118] : 5635304833345634344833385635304833395633374833345633384833385634
Arg [119] : 334833345633374833335a4d3431203337483439563338483437563530483434
Arg [120] : 5633384834315633375a4d353120333748353256343248353356343148353456
Arg [121] : 3430483535563339483536563338483537563337483630563338483538563339
Arg [122] : 4835375634304835365634314835355634334836305635304835375634344835
Arg [123] : 335635304835315633375a4d3633203337563434483631563530483634563337
Arg [124] : 4836335a4d363520333756333848363856353048373156333848373456333748
Arg [125] : 36355a4d37352033375635304838325634394837385634344838325634334837
Arg [126] : 375633384838325633374837355a4d3834203337563434483839563439483836
Arg [127] : 5634364838345635304839305634334838355633384838395634304839305633
Arg [128] : 374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000
Deployed Bytecode Sourcemap
62475:6017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62764:49;;;;;;;;;;;;62803:10;62764:49;;;;;160:25:1;;;148:2;133:18;62764:49:0;;;;;;;;65759:398;;;;;;;;;;-1:-1:-1;65759:398:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;65759:398:0;582:187:1;49250:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;62877:29::-;;;;;;;;;;;;;;;;50223:46;;;;;;;;;;-1:-1:-1;50223:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;50223:46:0;;;;;;-1:-1:-1;;;;;1779:32:1;;;1761:51;;1749:2;1734:18;50223:46:0;1615:203:1;61530:157:0;;;;;;;;;;-1:-1:-1;61530:157:0;;;;;:::i;:::-;;:::i;:::-;;63799:208;;;;;;;;;;;;;:::i;62551:26::-;;;;;;;;;;;;;;;;48241:154;;;;;;;;;;;;;:::i;66195:191::-;;;;;;;;;;-1:-1:-1;66195:191:0;;;;;:::i;:::-;;:::i;61695:163::-;;;;;;;;;;-1:-1:-1;61695:163:0;;;;;:::i;:::-;;:::i;29525:442::-;;;;;;;;;;-1:-1:-1;29525:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3038:32:1;;;3020:51;;3102:2;3087:18;;3080:34;;;;2993:18;29525:442:0;2846:274:1;62699:41:0;;;;;;;;;;;;62736:4;62699:41;;64015:690;;;;;;;;;;;;;:::i;58663:143::-;;;;;;;;;;;;58763:42;58663:143;;61866:171;;;;;;;;;;-1:-1:-1;61866:171:0;;;;;:::i;:::-;;:::i;62644:48::-;;;;;;;;;;;;62689:3;62644:48;;49692:151;;;;;;;;;;-1:-1:-1;49692:151:0;;;;;:::i;:::-;;:::i;63138:134::-;;;;;;:::i;:::-;;:::i;49851:172::-;;;;;;;;;;-1:-1:-1;49851:172:0;;;;;:::i;:::-;;:::i;25408:103::-;;;;;;;;;;;;;:::i;24760:87::-;;;;;;;;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;24760:87;;49277:20;;;;;;;;;;;;;:::i;63649:142::-;;;;;;;;;;;;;:::i;61346:176::-;;;;;;;;;;-1:-1:-1;61346:176:0;;;;;:::i;:::-;;:::i;63280:161::-;;;;;;:::i;:::-;;:::i;63449:192::-;;;;;;;;;;;;;:::i;62045:230::-;;;;;;;;;;-1:-1:-1;62045:230:0;;;;;:::i;:::-;;:::i;64719:802::-;;;;;;;;;;-1:-1:-1;64719:802:0;;;;;:::i;:::-;;:::i;65529:222::-;;;;;;;;;;-1:-1:-1;65529:222:0;;;;;:::i;:::-;;:::i;62598:39::-;;;;;;;;;;;;62634:3;62598:39;;62820:48;;;;;;;;;;;;62859:9;62820:48;;47491:742;;;;;;;;;;;;;:::i;50278:68::-;;;;;;;;;;-1:-1:-1;50278:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:201;;;;;;;;;;-1:-1:-1;25666:201:0;;;;;:::i;:::-;;:::i;65759:398::-;65861:4;-1:-1:-1;;;;;;65885:41:0;;-1:-1:-1;;;65885:41:0;;:87;;-1:-1:-1;;;;;;;;;;65947:25:0;;;65885:87;:166;;;-1:-1:-1;;;;;;;;;;66026:25:0;;;65885:166;:264;;;;66113:36;66137:11;66113:23;:36::i;:::-;65878:271;65759:398;-1:-1:-1;;65759:398:0:o;49250:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61530:157::-;61626:8;60184:30;60205:8;60184:20;:30::i;:::-;61647:32:::1;61661:8;61671:7;61647:13;:32::i;:::-;61530:157:::0;;;:::o;63799:208::-;63855:7;63882:117;63931:11;;63976:21;:19;:21::i;:::-;63882:13;:117::i;:::-;63875:124;;63799:208;:::o;48241:154::-;48281:12;48298:7;24833:6;;-1:-1:-1;;;;;24833:6:0;;24760:87;48298:7;-1:-1:-1;;;;;48298:12:0;48318:21;48298:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48280:64;;;48363:7;48355:32;;;;-1:-1:-1;;;48355:32:0;;5874:2:1;48355:32:0;;;5856:21:1;5913:2;5893:18;;;5886:30;-1:-1:-1;;;5932:18:1;;;5925:42;5984:18;;48355:32:0;;;;;;;;;48269:126;48241:154::o;66195:191::-;24646:13;:11;:13::i;:::-;66293:14:::1;::::0;:19;66285:50:::1;;;::::0;-1:-1:-1;;;66285:50:0;;6215:2:1;66285:50:0::1;::::0;::::1;6197:21:1::0;6254:2;6234:18;;;6227:30;-1:-1:-1;;;6273:18:1;;;6266:48;6331:18;;66285:50:0::1;6013:342:1::0;66285:50:0::1;66346:14;:32:::0;66195:191::o;61695:163::-;61796:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61813:37:::1;61832:4;61838:2;61842:7;61813:18;:37::i;:::-;61695:163:::0;;;;:::o;29525:442::-;29622:7;29680:27;;;:17;:27;;;;;;;;29651:56;;;;;;;;;-1:-1:-1;;;;;29651:56:0;;;;;-1:-1:-1;;;29651:56:0;;;-1:-1:-1;;;;;29651:56:0;;;;;;;;29622:7;;29720:92;;-1:-1:-1;29771:29:0;;;;;;;;;29781:19;29771:29;-1:-1:-1;;;;;29771:29:0;;;;-1:-1:-1;;;29771:29:0;;-1:-1:-1;;;;;29771:29:0;;;;;29720:92;29862:23;;;;29824:21;;30333:5;;29849:36;;-1:-1:-1;;;;;29849:36:0;:10;:36;:::i;:::-;29848:58;;;;:::i;:::-;29927:16;;;;;-1:-1:-1;29525:442:0;;-1:-1:-1;;;;29525:442:0:o;64015:690::-;64095:379;;;;;;;;64155:42;64095:379;;64246:42;64095:379;;;;64337:42;64095:379;;;;;;;64429:42;64095:379;;;;64066:16;;;64499:191;64519:15;64515:1;:19;64499:191;;;64598:1;64561:8;64570:1;64561:11;;;;;;;:::i;:::-;;;;;64560:35;;-1:-1:-1;;;64560:35:0;;64584:10;64560:35;;;1761:51:1;-1:-1:-1;;;;;64560:23:0;;;;;;1734:18:1;;64560:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;64556:122;;;64634:4;64620:18;;64499:191;64084:621;64015:690;:::o;64556:122::-;64536:3;;;:::i;:::-;;;64499:191;;;;64084:621;64015:690;:::o;61866:171::-;61971:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61988:41:::1;62011:4;62017:2;62021:7;61988:22;:41::i;49692:151::-:0;49750:13;49793:12;;;:8;:12;;;;;;-1:-1:-1;;;;;49793:12:0;;49776:59;;;;-1:-1:-1;;;49776:59:0;;7682:2:1;49776:59:0;;;7664:21:1;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7740:18:1;;;7733:40;7790:18;;49776:59:0;7480:334:1;49776:59:0;49692:151;;;:::o;63138:134::-;63189:19;63228:36;63241:2;63257:5;63228:7;:36::i;49851:172::-;49914:7;-1:-1:-1;;;;;49942:19:0;;49934:44;;;;-1:-1:-1;;;49934:44:0;;8021:2:1;49934:44:0;;;8003:21:1;8060:2;8040:18;;;8033:30;-1:-1:-1;;;8079:18:1;;;8072:42;8131:18;;49934:44:0;7819:336:1;49934:44:0;-1:-1:-1;;;;;;49998:17:0;;;;;:10;:17;;;;;;;49851:172::o;25408:103::-;24646:13;:11;:13::i;:::-;25473:30:::1;25500:1;25473:18;:30::i;:::-;25408:103::o:0;49277:20::-;;;;;;;:::i;63649:142::-;63695:7;63722:61;63751:11;;63776:5;63722:13;:61::i;61346:176::-;61450:8;60184:30;60205:8;60184:20;:30::i;:::-;61471:43:::1;61495:8;61505;61471:23;:43::i;63280:161::-:0;63341:19;63380:52;63393:2;63409:21;:19;:21::i;:::-;63380:7;:52::i;63449:192::-;63540:14;;63497:4;;63573:20;;;;;63572:61;;;63617:15;63599;:33;63572:61;63565:68;;;63449:192;:::o;62045:230::-;62198:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;62220:47:::1;62243:4;62249:2;62253:7;62262:4;;62220:22;:47::i;:::-;62045:230:::0;;;;;;:::o;64719:802::-;64783:13;64829:11;;64819:7;:21;64811:46;;;;-1:-1:-1;;;64811:46:0;;8362:2:1;64811:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;64811:46:0;8160:336:1;64811:46:0;64895:9;;:35;;-1:-1:-1;;;64895:35:0;;;;;160:25:1;;;64868:24:0;;-1:-1:-1;;;;;64895:9:0;;:26;;133:18:1;;64895:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64895:35:0;;;;;;;;;;;;:::i;:::-;64868:62;;65028:1;65015:10;65009:17;65005:25;64993:10;64986:45;65142:369;65213:25;65230:7;65213:16;:25::i;:::-;65449:9;;:28;;-1:-1:-1;;;65449:28:0;;;;;160:25:1;;;65345:10:0;;65429:50;;-1:-1:-1;;;;;65449:9:0;;;;:19;;133:18:1;;65449:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65449:28:0;;;;;;;;;;;;:::i;:::-;65429:13;:50::i;:::-;65156:354;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65142:13;:369::i;:::-;65068:444;;;;;;;;:::i;:::-;;;;;;;;;;;;;65054:459;;;64719:802;;;:::o;65529:222::-;65595:13;65639:11;;65629:7;:21;65621:46;;;;-1:-1:-1;;;65621:46:0;;8362:2:1;65621:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;65621:46:0;8160:336:1;65621:46:0;65712:9;;:28;;-1:-1:-1;;;65712:28:0;;;;;160:25:1;;;65692:50:0;;-1:-1:-1;;;;;65712:9:0;;:19;;133:18:1;;65712:28:0;14:177:1;47491:742:0;47534:13;47664:559;47984:43;47998:28;48011:14;47998:12;:28::i;47984:43::-;48177:37;48197:16;48177:19;:37::i;:::-;47678:544;;;;;;;;;:::i;47664:559::-;47574:650;;;;;;;;:::i;:::-;;;;;;;;;;;;;47560:665;;47491:742;:::o;25666:201::-;24646:13;:11;:13::i;:::-;-1:-1:-1;;;;;25755:22:0;::::1;25747:73;;;::::0;-1:-1:-1;;;25747:73:0;;13785:2:1;25747:73:0::1;::::0;::::1;13767:21:1::0;13824:2;13804:18;;;13797:30;13863:34;13843:18;;;13836:62;-1:-1:-1;;;13914:18:1;;;13907:36;13960:19;;25747:73:0::1;13583:402:1::0;25747:73:0::1;25831:28;25850:8;25831:18;:28::i;18240:2436::-:0;18292:15;18447:4;18441:11;18589:1;18569:18;18565:26;20191:8;20187:2;20183:17;20136:24;20111:174;20088:4;20063:237;20438:2;20428:8;20424:17;20419:2;20413:4;20409:13;20406:1;20399:43;20526:32;;;-1:-1:-1;20388:54:0;-1:-1:-1;;;;;;20585:21:0;;20581:88;;20630:27;;-1:-1:-1;;;20630:27:0;;;;;;;;;;;29255:215;29357:4;-1:-1:-1;;;;;;29381:41:0;;-1:-1:-1;;;29381:41:0;;:81;;-1:-1:-1;;;;;;;;;;27986:40:0;;;29426:36;27877:157;60242:419;58763:42;60433:45;:49;60429:225;;60504:67;;-1:-1:-1;;;60504:67:0;;60555:4;60504:67;;;14202:34:1;-1:-1:-1;;;;;14272:15:1;;14252:18;;;14245:43;58763:42:0;;60504;;14137:18:1;;60504:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60499:144;;60599:28;;-1:-1:-1;;;60599:28:0;;-1:-1:-1;;;;;1779:32:1;;60599:28:0;;;1761:51:1;1734:18;;60599:28:0;1615:203:1;50849:290:0;50921:13;50937:12;;;:8;:12;;;;;;-1:-1:-1;;;;;50937:12:0;50970:10;:19;;;:58;;-1:-1:-1;;;;;;50993:23:0;;;;;;:16;:23;;;;;;;;51017:10;50993:35;;;;;;;;;;50970:58;50962:85;;;;-1:-1:-1;;;50962:85:0;;14751:2:1;50962:85:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;50962:85:0;14549:338:1;50962:85:0;51060:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;51060:25:0;-1:-1:-1;;;;;51060:25:0;;;;;;;;;51103:28;;51060:15;;51103:28;;;;;;;50910:229;50849:290;;:::o;67116:495::-;67199:7;67238:15;67257:10;67256:20;;67275:1;67256:20;;;67271:1;67256:20;67287:75;;;;;;;;62634:3;67287:75;;;62689:3;67287:75;;;;62736:4;67287:75;;;;;;;67238:38;;;;;;-1:-1:-1;67377:29:0;;67373:176;;;67430:1;67423:8;;;;;;67373:176;67477:14;;;;67462:29;;67458:91;;;67530:7;62803:10;67515:22;;;;;:::i;:::-;;67508:29;;;;;;67458:91;67581:7;62859:9;67566:22;;;;;:::i;:::-;;;67116:495;-1:-1:-1;;;;;67116:495:0:o;24925:132::-;24833:6;;-1:-1:-1;;;;;24833:6:0;23549:10;24989:23;24981:68;;;;-1:-1:-1;;;24981:68:0;;15094:2:1;24981:68:0;;;15076:21:1;;;15113:18;;;15106:30;15172:34;15152:18;;;15145:62;15224:18;;24981:68:0;14892:356:1;51362:768:0;51498:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;51490:20:0;;;51498:12;;51490:20;51482:43;;;;-1:-1:-1;;;51482:43:0;;15455:2:1;51482:43:0;;;15437:21:1;15494:2;15474:18;;;15467:30;-1:-1:-1;;;15513:18:1;;;15506:40;15563:18;;51482:43:0;15253:334:1;51482:43:0;-1:-1:-1;;;;;51546:16:0;;51538:46;;;;-1:-1:-1;;;51538:46:0;;15794:2:1;51538:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;51538:46:0;15592:341:1;51538:46:0;51619:10;-1:-1:-1;;;;;51619:18:0;;;;:56;;-1:-1:-1;;;;;;51641:22:0;;;;;;:16;:22;;;;;;;;51664:10;51641:34;;;;;;;;;;51619:56;:89;;;-1:-1:-1;51693:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;51693:15:0;51679:10;:29;51619:89;51597:153;;;;-1:-1:-1;;;51597:153:0;;14751:2:1;51597:153:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;51597:153:0;14549:338:1;51597:153:0;-1:-1:-1;;;;;51955:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;51955:18:0;;;51990:14;;;;;;;;;:16;;51955:18;51990:16;;;52030:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;52030:17:0;;;;;;;;52067:11;:15;;;;;;52060:22;;;;;;;;52100;;52039:2;;51990:14;51955:16;52100:22;;;51362:768;;;:::o;52138:409::-;52262:26;52275:4;52281:2;52285;52262:12;:26::i;:::-;-1:-1:-1;;;;;52323:14:0;;;:19;;:172;;-1:-1:-1;52363:66:0;;-1:-1:-1;;;52363:66:0;;;52404:10;52363:66;;;16243:34:1;-1:-1:-1;;;;;16313:15:1;;;16293:18;;;16286:43;16345:18;;;16338:34;;;16408:3;16388:18;;;16381:31;-1:-1:-1;16428:19:1;;;16421:30;52450:45:0;;52363:40;;;;52450:45;;16468:19:1;;52363:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52363:132:0;;52323:172;52301:238;;;;-1:-1:-1;;;52301:238:0;;16954:2:1;52301:238:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52301:238:0;16752:340:1;66429:679:0;66491:19;66531:18;:16;:18::i;:::-;:43;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;66553:10;:21;66531:43;66523:74;;;;-1:-1:-1;;;66523:74:0;;17299:2:1;66523:74:0;;;17281:21:1;17338:2;17318:18;;;17311:30;-1:-1:-1;;;17357:18:1;;;17350:48;17415:18;;66523:74:0;17097:342:1;66523:74:0;66626:11;;66608:15;66672:62;66626:11;66722:10;66672:13;:62::i;:::-;66648:86;;66765:11;66796:1;66780:13;:17;66779:51;;66829:1;66779:51;;;66813:13;66801:9;:25;;;;;:::i;:::-;;66779:51;66765:65;;66887:23;66897:3;66902:7;66887:9;:23::i;:::-;66926:9;66921:78;66941:3;66937:1;:7;66921:78;;;66966:20;66972:2;66976:9;;;;;;66966:5;:20::i;:::-;66946:3;;66921:78;;;-1:-1:-1;;;67041:11:0;:25;;;67023:7;66429:679;-1:-1:-1;;;66429:679:0:o;26027:191::-;26120:6;;;-1:-1:-1;;;;;26137:17:0;;;-1:-1:-1;;;;;;26137:17:0;;;;;;;26170:40;;26120:6;;;26137:17;26120:6;;26170:40;;26101:16;;26170:40;26090:128;26027:191;:::o;51147:207::-;51250:10;51233:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;51233:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;51233:49:0;;;;;;;;;;51300:46;;722:41:1;;;51233:38:0;;51250:10;51300:46;;695:18:1;51300:46:0;;;;;;;51147:207;;:::o;52555:441::-;52709:26;52722:4;52728:2;52732;52709:12;:26::i;:::-;-1:-1:-1;;;;;52770:14:0;;;:19;;:174;;-1:-1:-1;52810:68:0;;-1:-1:-1;;;52810:68:0;;;52899:45;-1:-1:-1;;;;;52810:40:0;;;52899:45;;52810:68;;52851:10;;52863:4;;52869:2;;52873:4;;;;52810:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52810:134:0;;52770:174;52748:240;;;;-1:-1:-1;;;52748:240:0;;16954:2:1;52748:240:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52748:240:0;16752:340:1;52748:240:0;52555:441;;;;;:::o;45157:716::-;45213:13;45264:14;45281:17;45292:5;45281:10;:17::i;:::-;45301:1;45281:21;45264:38;;45317:20;45351:6;45340:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45340:18:0;-1:-1:-1;45317:41:0;-1:-1:-1;45482:28:0;;;45498:2;45482:28;45539:288;-1:-1:-1;;45571:5:0;-1:-1:-1;;;45708:2:0;45697:14;;45692:30;45571:5;45679:44;45769:2;45760:11;;;-1:-1:-1;45790:21:0;45539:288;45790:21;45539:288;-1:-1:-1;45848:6:0;45157:716;-1:-1:-1;;;45157:716:0:o;7762:134::-;7820:20;7862:26;7869:4;7875:5;7882;7862:6;:26::i;20869:163::-;20923:12;20955:69;20968:7;18044:1;20990:33;18044:1;-1:-1:-1;;;;;20990:19:0;;;:33;:::i;:::-;20955:12;:69::i;46893:151::-;46951:13;46984:52;-1:-1:-1;;;;;46996:22:0;;45048:2;46984:11;:52::i;67619:870::-;67725:1;67712:10;:14;67704:64;;;;-1:-1:-1;;;67704:64:0;;18446:2:1;67704:64:0;;;18428:21:1;18485:2;18465:18;;;18458:30;18524:34;18504:18;;;18497:62;-1:-1:-1;;;18575:18:1;;;18568:35;18620:19;;67704:64:0;18244:401:1;67704:64:0;67872:25;;;62736:4;67972:17;;;67964:48;;;;-1:-1:-1;;;67964:48:0;;18852:2:1;67964:48:0;;;18834:21:1;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:48;18968:18;;67964:48:0;18650:342:1;67964:48:0;68027:10;68041:1;68027:15;68023:28;;68044:7;67619:870;;:::o;68023:28::-;68062:75;;;;;;;;62634:3;68062:75;;62689:3;68062:75;;;;62736:4;68062:75;;;;;;;:29;;68184:221;68204:18;68200:1;:22;68184:221;;;68291:11;68303:1;68291:14;;;;;;;:::i;:::-;;;;;68284:21;;;68264:11;68276:1;68264:14;;;;;;;:::i;:::-;;;;;68249:29;;68248:58;68244:150;;68350:4;68327:27;;68373:5;;68244:150;68224:3;;68184:221;;;;68424:20;68423:21;68415:51;;;;-1:-1:-1;;;68415:51:0;;19199:2:1;68415:51:0;;;19181:21:1;19238:2;19218:18;;;19211:30;-1:-1:-1;;;19257:18:1;;;19250:47;19314:18;;68415:51:0;18997:341:1;53730:384:0;-1:-1:-1;;;;;53805:16:0;;53797:46;;;;-1:-1:-1;;;53797:46:0;;15794:2:1;53797:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;53797:46:0;15592:341:1;53797:46:0;53888:1;53864:12;;;:8;:12;;;;;;-1:-1:-1;;;;;53864:12:0;:26;53856:53;;;;-1:-1:-1;;;53856:53:0;;19545:2:1;53856:53:0;;;19527:21:1;19584:2;19564:18;;;19557:30;-1:-1:-1;;;19603:18:1;;;19596:44;19657:18;;53856:53:0;19343:338:1;53856:53:0;-1:-1:-1;;;;;54003:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;54043:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;54043:17:0;;;;;54078:28;54052:2;;54003:14;;54078:28;;54003:14;;54078:28;53730:384;;:::o;42179:922::-;42232:7;;-1:-1:-1;;;42310:15:0;;42306:102;;-1:-1:-1;;;42346:15:0;;;-1:-1:-1;42390:2:0;42380:12;42306:102;42435:6;42426:5;:15;42422:102;;42471:6;42462:15;;;-1:-1:-1;42506:2:0;42496:12;42422:102;42551:6;42542:5;:15;42538:102;;42587:6;42578:15;;;-1:-1:-1;42622:2:0;42612:12;42538:102;42667:5;42658;:14;42654:99;;42702:5;42693:14;;;-1:-1:-1;42736:1:0;42726:11;42654:99;42780:5;42771;:14;42767:99;;42815:5;42806:14;;;-1:-1:-1;42849:1:0;42839:11;42767:99;42893:5;42884;:14;42880:99;;42928:5;42919:14;;;-1:-1:-1;42962:1:0;42952:11;42880:99;43006:5;42997;:14;42993:66;;43042:1;43032:11;43087:6;42179:922;-1:-1:-1;;42179:922:0:o;4693:2930::-;4809:20;4945:4;4939:11;4953:10;4915:2690;;;5159:1;5155;5143:10;5139:18;5135:26;5132:1;5128:34;5273:4;5267:11;5257:21;;5652:34;5646:4;5639:48;5780:6;5769:8;5762:16;5758:29;5722:34;5718:70;5712:4;5705:84;5898:4;5890:6;5886:17;5941:13;5936:3;5932:23;6034:624;6087:1;6081:4;6077:12;6069:20;;6150:4;6144:11;6295:4;6287:5;6283:2;6279:14;6275:25;6269:32;6264:3;6256:46;6371:4;6363:5;6359:2;6355:14;6351:25;6345:32;6341:1;6336:3;6332:11;6324:54;6446:4;6438:5;6435:1;6431:13;6427:24;6421:31;6417:1;6412:3;6408:11;6400:53;6513:4;6506:5;6502:16;6496:23;6492:1;6487:3;6483:11;6475:45;;6560:1;6555:3;6551:11;6544:18;;6624:3;6619;6616:12;6034:624;6606:33;6901:2;6883:12;-1:-1:-1;;6879:26:0;6873:4;6866:40;6951:1;6935:18;;6983:9;6973:456;;7143:4;7137:1;7130:9;7123:17;7118:3;7114:27;7106:42;7238:4;7232:1;7229;7226:8;7223:1;7219:16;7214:3;7210:26;7202:41;-1:-1:-1;;7354:29:0;;7405:5;;6973:456;7562:1;7559;7556:8;7551:1;7544:9;7537:17;7533:32;7518:13;7514:52;7506:6;7499:68;;;;4919:33;4693:2930;;;;;:::o;21810:984::-;22053:4;22047:11;;22483:2;22473:13;;-1:-1:-1;;22469:27:0;22459:38;;22446:52;;;22600:18;;;22477:4;22764:5;22759:2;22749:13;;22740:7;22728:48;21810:984;;;;;:::o;46289:447::-;46364:13;46390:19;46422:10;46426:6;46422:1;:10;:::i;:::-;:14;;46435:1;46422:14;:::i;:::-;46412:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46412:25:0;;46390:47;;-1:-1:-1;;;46448:6:0;46455:1;46448:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46448:15:0;;;;;;;;;-1:-1:-1;;;46474:6:0;46481:1;46474:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46474:15:0;;;;;;;;-1:-1:-1;46505:9:0;46517:10;46521:6;46517:1;:10;:::i;:::-;:14;;46530:1;46517:14;:::i;:::-;46505:26;;46500:131;46537:1;46533;:5;46500:131;;;-1:-1:-1;;;46581:5:0;46589:3;46581:11;46572:21;;;;;;;:::i;:::-;;;;46560:6;46567:1;46560:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;46560:33:0;;;;;;;;-1:-1:-1;46618:1:0;46608:11;;;;;46540:3;;;:::i;:::-;;;46500:131;;;-1:-1:-1;46649:10:0;;46641:55;;;;-1:-1:-1;;;46641:55:0;;20159:2:1;46641:55:0;;;20141:21:1;;;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;20289:18;;46641:55:0;19957:356:1;46641:55:0;46721:6;46289:447;-1:-1:-1;;;46289:447:0:o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:1;998:16;;991:27;774:250::o;1029:396::-;1178:2;1167:9;1160:21;1141:4;1210:6;1204:13;1253:6;1248:2;1237:9;1233:18;1226:34;1269:79;1341:6;1336:2;1325:9;1321:18;1316:2;1308:6;1304:15;1269:79;:::i;:::-;1409:2;1388:15;-1:-1:-1;;1384:29:1;1369:45;;;;1416:2;1365:54;;1029:396;-1:-1:-1;;1029:396:1:o;1430:180::-;1489:6;1542:2;1530:9;1521:7;1517:23;1513:32;1510:52;;;1558:1;1555;1548:12;1510:52;-1:-1:-1;1581:23:1;;1430:180;-1:-1:-1;1430:180:1:o;1823:173::-;1891:20;;-1:-1:-1;;;;;1940:31:1;;1930:42;;1920:70;;1986:1;1983;1976:12;2001:254;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:52;;;2146:1;2143;2136:12;2098:52;2169:29;2188:9;2169:29;:::i;:::-;2159:39;2245:2;2230:18;;;;2217:32;;-1:-1:-1;;;2001:254:1:o;2260:328::-;2337:6;2345;2353;2406:2;2394:9;2385:7;2381:23;2377:32;2374:52;;;2422:1;2419;2412:12;2374:52;2445:29;2464:9;2445:29;:::i;:::-;2435:39;;2493:38;2527:2;2516:9;2512:18;2493:38;:::i;:::-;2483:48;;2578:2;2567:9;2563:18;2550:32;2540:42;;2260:328;;;;;:::o;2593:248::-;2661:6;2669;2722:2;2710:9;2701:7;2697:23;2693:32;2690:52;;;2738:1;2735;2728:12;2690:52;-1:-1:-1;;2761:23:1;;;2831:2;2816:18;;;2803:32;;-1:-1:-1;2593:248:1:o;3365:186::-;3424:6;3477:2;3465:9;3456:7;3452:23;3448:32;3445:52;;;3493:1;3490;3483:12;3445:52;3516:29;3535:9;3516:29;:::i;3556:118::-;3642:5;3635:13;3628:21;3621:5;3618:32;3608:60;;3664:1;3661;3654:12;3679:315;3744:6;3752;3805:2;3793:9;3784:7;3780:23;3776:32;3773:52;;;3821:1;3818;3811:12;3773:52;3844:29;3863:9;3844:29;:::i;:::-;3834:39;;3923:2;3912:9;3908:18;3895:32;3936:28;3958:5;3936:28;:::i;:::-;3983:5;3973:15;;;3679:315;;;;;:::o;3999:808::-;4096:6;4104;4112;4120;4128;4181:3;4169:9;4160:7;4156:23;4152:33;4149:53;;;4198:1;4195;4188:12;4149:53;4221:29;4240:9;4221:29;:::i;:::-;4211:39;;4269:38;4303:2;4292:9;4288:18;4269:38;:::i;:::-;4259:48;;4354:2;4343:9;4339:18;4326:32;4316:42;;4409:2;4398:9;4394:18;4381:32;4432:18;4473:2;4465:6;4462:14;4459:34;;;4489:1;4486;4479:12;4459:34;4527:6;4516:9;4512:22;4502:32;;4572:7;4565:4;4561:2;4557:13;4553:27;4543:55;;4594:1;4591;4584:12;4543:55;4634:2;4621:16;4660:2;4652:6;4649:14;4646:34;;;4676:1;4673;4666:12;4646:34;4721:7;4716:2;4707:6;4703:2;4699:15;4695:24;4692:37;4689:57;;;4742:1;4739;4732:12;4689:57;3999:808;;;;-1:-1:-1;3999:808:1;;-1:-1:-1;4773:2:1;4765:11;;4795:6;3999:808;-1:-1:-1;;;3999:808:1:o;4812:260::-;4880:6;4888;4941:2;4929:9;4920:7;4916:23;4912:32;4909:52;;;4957:1;4954;4947:12;4909:52;4980:29;4999:9;4980:29;:::i;:::-;4970:39;;5028:38;5062:2;5051:9;5047:18;5028:38;:::i;:::-;5018:48;;4812:260;;;;;:::o;5077:380::-;5156:1;5152:12;;;;5199;;;5220:61;;5274:4;5266:6;5262:17;5252:27;;5220:61;5327:2;5319:6;5316:14;5296:18;5293:38;5290:161;;5373:10;5368:3;5364:20;5361:1;5354:31;5408:4;5405:1;5398:15;5436:4;5433:1;5426:15;5290:161;;5077:380;;;:::o;6360:127::-;6421:10;6416:3;6412:20;6409:1;6402:31;6452:4;6449:1;6442:15;6476:4;6473:1;6466:15;6492:168;6565:9;;;6596;;6613:15;;;6607:22;;6593:37;6583:71;;6634:18;;:::i;6665:127::-;6726:10;6721:3;6717:20;6714:1;6707:31;6757:4;6754:1;6747:15;6781:4;6778:1;6771:15;6797:217;6837:1;6863;6853:132;;6907:10;6902:3;6898:20;6895:1;6888:31;6942:4;6939:1;6932:15;6970:4;6967:1;6960:15;6853:132;-1:-1:-1;6999:9:1;;6797:217::o;7019:127::-;7080:10;7075:3;7071:20;7068:1;7061:31;7111:4;7108:1;7101:15;7135:4;7132:1;7125:15;7151:184;7221:6;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;-1:-1:-1;7313:16:1;;7151:184;-1:-1:-1;7151:184:1:o;7340:135::-;7379:3;7400:17;;;7397:43;;7420:18;;:::i;:::-;-1:-1:-1;7467:1:1;7456:13;;7340:135::o;8501:127::-;8562:10;8557:3;8553:20;8550:1;8543:31;8593:4;8590:1;8583:15;8617:4;8614:1;8607:15;8633:897;8713:6;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8815:9;8809:16;8844:18;8885:2;8877:6;8874:14;8871:34;;;8901:1;8898;8891:12;8871:34;8939:6;8928:9;8924:22;8914:32;;8984:7;8977:4;8973:2;8969:13;8965:27;8955:55;;9006:1;9003;8996:12;8955:55;9035:2;9029:9;9057:2;9053;9050:10;9047:36;;;9063:18;;:::i;:::-;9138:2;9132:9;9106:2;9192:13;;-1:-1:-1;;9188:22:1;;;9212:2;9184:31;9180:40;9168:53;;;9236:18;;;9256:22;;;9233:46;9230:72;;;9282:18;;:::i;:::-;9322:10;9318:2;9311:22;9357:2;9349:6;9342:18;9397:7;9392:2;9387;9383;9379:11;9375:20;9372:33;9369:53;;;9418:1;9415;9408:12;9369:53;9431:68;9496:2;9491;9483:6;9479:15;9474:2;9470;9466:11;9431:68;:::i;:::-;9518:6;8633:897;-1:-1:-1;;;;;;;8633:897:1:o;9665:1720::-;-1:-1:-1;;;10415:63:1;;10501:13;;10397:3;;10523:75;10501:13;10586:2;10577:12;;10570:4;10558:17;;10523:75;:::i;:::-;10662:66;10657:2;10617:16;;;10649:11;;;10642:87;-1:-1:-1;;;10753:2:1;10745:11;;10738:38;-1:-1:-1;;;10800:2:1;10792:11;;10785:67;10877:13;;10899:76;10877:13;10961:2;10953:11;;10946:4;10934:17;;10899:76;:::i;:::-;11040:66;11035:2;10994:17;;;;11027:11;;;11020:87;-1:-1:-1;;;11131:3:1;11123:12;;11116:30;11171:13;;11193:77;11171:13;11255:3;11247:12;;11240:4;11228:17;;11193:77;:::i;:::-;-1:-1:-1;;;11330:3:1;11289:17;;;;11322:12;;;11315:36;11375:3;11367:12;;9665:1720;-1:-1:-1;;;;;9665:1720:1:o;11390:461::-;11652:31;11647:3;11640:44;11622:3;11713:6;11707:13;11729:75;11797:6;11792:2;11787:3;11783:12;11776:4;11768:6;11764:17;11729:75;:::i;:::-;11824:16;;;;11842:2;11820:25;;11390:461;-1:-1:-1;;11390:461:1:o;11856:1722::-;12570:66;12565:3;12558:79;12667:66;12662:2;12657:3;12653:12;12646:88;12764:34;12759:2;12754:3;12750:12;12743:56;12829:34;12824:2;12819:3;12815:12;12808:56;12904:28;12899:3;12895:38;12889:3;12884;12880:13;12873:61;12965:28;12959:3;12954;12950:13;12943:51;12540:3;13023:6;13017:13;13039:74;13106:6;13100:3;13095;13091:13;13086:2;13078:6;13074:15;13039:74;:::i;:::-;-1:-1:-1;;;13172:3:1;13132:16;;;13164:12;;;13157:36;13223:66;13217:3;13209:12;;13202:88;-1:-1:-1;;;13314:3:1;13306:12;;13299:77;13401:13;;13423:75;13401:13;13483:3;13475:12;;13470:2;13458:15;;13423:75;:::i;:::-;13514:58;13567:3;13556:8;13552:2;13548:17;13544:27;-1:-1:-1;;;9600:27:1;;9652:1;9643:11;;9535:125;13514:58;13507:65;11856:1722;-1:-1:-1;;;;;;11856:1722:1:o;14299:245::-;14366:6;14419:2;14407:9;14398:7;14394:23;14390:32;14387:52;;;14435:1;14432;14425:12;14387:52;14467:9;14461:16;14486:28;14508:5;14486:28;:::i;16498:249::-;16567:6;16620:2;16608:9;16599:7;16595:23;16591:32;16588:52;;;16636:1;16633;16626:12;16588:52;16668:9;16662:16;16687:30;16711:5;16687:30;:::i;17444:662::-;-1:-1:-1;;;;;17723:15:1;;;17705:34;;17775:15;;17770:2;17755:18;;17748:43;17822:2;17807:18;;17800:34;;;17870:3;17865:2;17850:18;;17843:31;;;17890:19;;17883:35;;;17648:4;17911:6;17961;17685:3;17940:19;;17927:49;18026:1;18020:3;18011:6;18000:9;17996:22;17992:32;17985:43;18096:3;18089:2;18085:7;18080:2;18072:6;18068:15;18064:29;18053:9;18049:45;18045:55;18037:63;;17444:662;;;;;;;;:::o;18111:128::-;18178:9;;;18199:11;;;18196:37;;;18213:18;;:::i;19686:125::-;19751:9;;;19772:10;;;19769:36;;;19785:18;;:::i;19816:136::-;19855:3;19883:5;19873:39;;19892:18;;:::i;:::-;-1:-1:-1;;;19928:18:1;;19816:136::o
Swarm Source
ipfs://8780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd2358151
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.