Token Wild CRO Dog
Overview CRC721
Total Supply:
5,000 WCD
Holders:
330 addresses
Contract:
Balance
0 WCD
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WildCroDog
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-08-13 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: new.sol pragma solidity >=0.7.0 <0.9.0; contract WildCroDog is ERC721Enumerable, Ownable { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public whitelistClaimed; event PlayerJoined(address player); event PlayerWon(address player, uint amount); event Reflection(uint256 amount); string public baseURI; string public baseExtension = ".json"; string public notRevealedUri; uint256 public cost = 200 ether; uint256 public maxSupply = 5000; uint256 public maxMintAmount = 5; uint256 public nftPerAddressLimit = 1; bool public paused = true; bool public whitelistMintEnabled = false; bool public revealed = false; bool public onlyWhitelisted = true; address[] public whitelistedAddresses; uint256 public reflectionRate = 0; uint256 public currentReflection; uint256 public totalReflection; uint256 public COLLECTED_MINTFEE; mapping(uint256 => uint256) public lastReflections; mapping(address => uint256) public addressMintedBalance; address payable[] public players; uint public playersCounter; uint256 public playCounter = 0; uint256 public holderRewardCounter = 0; uint256 public volumeCounter = 0; bool public lotteryPaused = true; uint256 public playerLimit = 5; uint256 public ticketPrice = 1 ether; uint256 public royaltiesTEAM = 3; uint256 public royaltiesHOLDERS = 7; address public lotteryManager; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); lotteryManager = msg.sender; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } modifier onlylotteryManager{ require(msg.sender == lotteryManager); _; } function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable { // Verify whitelist requirements require(whitelistMintEnabled, 'The whitelist sale is not enabled!'); require(!whitelistClaimed[_msgSender()], 'Address already claimed!'); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!'); whitelistClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } // public function mint(uint256 _mintAmount) public payable { require(!paused, "the contract is paused"); uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); if (msg.sender != owner()) { if(onlyWhitelisted == true) { require(isWhitelisted(msg.sender), "user is not whitelisted"); uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); } require(msg.value >= cost * _mintAmount, "insufficient funds"); } for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, supply + i); lastReflections[supply + i] = currentReflection; } uint256 reflectionShare = (msg.value * reflectionRate) / 100; addRewards(reflectionShare); COLLECTED_MINTFEE += msg.value; } function playLottery() payable public{ require(msg.value == ticketPrice); require(!lotteryPaused, "Lottery is paused"); players.push(payable(msg.sender)); playersCounter++; volumeCounter += msg.value; emit PlayerJoined(msg.sender); if (playersCounter >= playerLimit){ drawWinner(); } } function addRewards(uint256 amount) private { totalReflection = totalReflection + amount; currentReflection += amount / totalSupply(); emit Reflection(amount); } function royalties() public payable { addRewards(msg.value); } function getRewards(uint256[] memory tokenIds) public view returns (uint256 rewards) { for (uint256 i = 0; i < tokenIds.length; i++) { rewards += currentReflection - lastReflections[tokenIds[i]]; } } function getRewardsToken(uint256 tokenIdsRewards) public view returns (uint256 rewards) { rewards += currentReflection - lastReflections[tokenIdsRewards]; } function claimRewards(uint256[] memory tokenIds) external { uint256 rewards = getRewards(tokenIds); for (uint256 i = 0; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Owner Invalid"); lastReflections[tokenIds[i]] = currentReflection; } payable(msg.sender).transfer(rewards); } function claimAllRewards() public { uint count = balanceOf(msg.sender); uint256 balance = 0; for(uint i = 0; i < count; i++){ uint tokenId = tokenOfOwnerByIndex(msg.sender, i); balance += (getRewardsToken(tokenId)); lastReflections[tokenId] = currentReflection; } payable(msg.sender).transfer(balance); } function getReflectionBalances(address _owner) public view returns (uint256) { uint count = balanceOf(_owner); uint256 total = 0; for(uint i = 0; i < count; i++){ uint tokenId = tokenOfOwnerByIndex(_owner, i); total += getRewardsToken(tokenId); } return total; } function isWhitelisted(address _user) public view returns (bool) { for (uint i = 0; i < whitelistedAddresses.length; i++) { if (whitelistedAddresses[i] == _user) { return true; } } return false; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function pause(bool _state) public onlyOwner { paused = _state; } function lotteryPauseSwitch() public onlylotteryManager { lotteryPaused = !lotteryPaused; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } function whitelistUsers(address[] calldata _users) public onlyOwner { delete whitelistedAddresses; whitelistedAddresses = _users; } function setReflectionRate(uint256 _reflectionRate) public onlyOwner { reflectionRate = _reflectionRate; } function setHolderRoyaltyRate(uint256 _royaltiesHOLDERS) public onlyOwner { royaltiesHOLDERS = _royaltiesHOLDERS; } function setTeamRoyaltyRate(uint256 _royaltiesTEAM) public onlyOwner { royaltiesTEAM = _royaltiesTEAM; } function setTicketPrice(uint256 _ticketPrice) public onlyOwner { ticketPrice = _ticketPrice; } function setplayerLimit(uint256 _playerLimit) public onlyOwner { playerLimit = _playerLimit; } function showPlayers() public view returns(address payable[] memory){ return players; } function forceDraw() public onlylotteryManager { require(msg.sender == lotteryManager); drawWinner(); } function drawWinner() private { uint256 index = random() % players.length; uint256 amount = ticketPrice * playerLimit; address payable winner = players[index]; uint256 holderReward = (amount * royaltiesHOLDERS) / 100; uint256 teamReward = (amount * royaltiesTEAM) / 100; uint256 totalFEES = holderReward + teamReward; uint256 winnerPrize = amount - totalFEES; addRewards(holderReward); payable(owner()).transfer(teamReward); winner.transfer(winnerPrize); players = new address payable[](0); playersCounter = 0; emit PlayerWon(winner, amount); playCounter++; holderRewardCounter += holderReward; } function random() private view returns(uint){ return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players))); } function withdraw() public onlyOwner { payable(msg.sender).transfer(COLLECTED_MINTFEE); COLLECTED_MINTFEE = 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"}],"name":"PlayerJoined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PlayerWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reflection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COLLECTED_MINTFEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getReflectionBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getRewards","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdsRewards","type":"uint256"}],"name":"getRewardsToken","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderRewardCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastReflections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryPauseSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lotteryPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playLottery","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"playerLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playersCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalties","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"royaltiesHOLDERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesTEAM","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltiesHOLDERS","type":"uint256"}],"name":"setHolderRoyaltyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionRate","type":"uint256"}],"name":"setReflectionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltiesTEAM","type":"uint256"}],"name":"setTeamRoyaltyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ticketPrice","type":"uint256"}],"name":"setTicketPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_playerLimit","type":"uint256"}],"name":"setplayerLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showPlayers","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"volumeCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526005608090815264173539b7b760d91b60a052600e90620000269082620002c4565b50680ad78ebc5ac620000060105561138860115560056012819055600160138190556014805463ffffffff1916630100000117905560006016819055601e819055601f8190556020556021805460ff19169091179055602255670de0b6b3a764000060235560036024556007602555348015620000a257600080fd5b5060405162003e3c38038062003e3c833981016040819052620000c59162000447565b83836000620000d58382620002c4565b506001620000e48282620002c4565b50505062000101620000fb6200013460201b60201c565b62000138565b6200010c826200018a565b6200011781620001a6565b5050602680546001600160a01b0319163317905550620005009050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000194620001be565b600d620001a28282620002c4565b5050565b620001b0620001be565b600f620001a28282620002c4565b600a546001600160a01b031633146200021d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200024a57607f821691505b6020821081036200026b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002bf57600081815260208120601f850160051c810160208610156200029a5750805b601f850160051c820191505b81811015620002bb57828155600101620002a6565b5050505b505050565b81516001600160401b03811115620002e057620002e06200021f565b620002f881620002f1845462000235565b8462000271565b602080601f831160018114620003305760008415620003175750858301515b600019600386901b1c1916600185901b178555620002bb565b600085815260208120601f198616915b82811015620003615788860151825594840194600190910190840162000340565b5085821015620003805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620003a257600080fd5b81516001600160401b0380821115620003bf57620003bf6200021f565b604051601f8301601f19908116603f01168101908282118183101715620003ea57620003ea6200021f565b816040528381526020925086838588010111156200040757600080fd5b600091505b838210156200042b57858201830151818301840152908201906200040c565b838211156200043d5760008385830101525b9695505050505050565b600080600080608085870312156200045e57600080fd5b84516001600160401b03808211156200047657600080fd5b620004848883890162000390565b955060208701519150808211156200049b57600080fd5b620004a98883890162000390565b94506040870151915080821115620004c057600080fd5b620004ce8883890162000390565b93506060870151915080821115620004e557600080fd5b50620004f48782880162000390565b91505092959194509250565b61392c80620005106000396000f3fe60806040526004361061047e5760003560e01c806367f3aa4011610255578063ba4e5c4911610144578063da3ef23f116100c1578063f2c4ce1e11610085578063f2c4ce1e14610d19578063f2fde38b14610d39578063f490177214610d59578063f68fc92914610d79578063f71d96cb14610d93578063f8bb7ec214610db357600080fd5b8063da3ef23f14610c58578063db4bec4414610c78578063e985e9c514610ca8578063edec5f2714610cf1578063f053dc5c14610d1157600080fd5b8063d0eb26b011610108578063d0eb26b014610bf1578063d2cab05614610c11578063d4cd77a314610c24578063d5abeb0114610c2c578063d791da3214610c4257600080fd5b8063ba4e5c4914610b59578063ba7d2c7614610b79578063bac9320314610b8f578063c668286214610bbc578063c87b56dd14610bd157600080fd5b80639163723e116101d2578063a0712d6811610196578063a0712d6814610ad1578063a22cb46514610ae4578063a475b5dd14610b04578063a708d40414610b19578063b88d4fde14610b3957600080fd5b80639163723e14610a4f57806395d89b4114610a645780639814e6fa14610a795780639c70b51214610a9b5780639e0413eb14610abc57600080fd5b806370a082311161021957806370a08231146109bc578063715018a6146109dc57806371e0a4bc146109f15780637f00c7a614610a115780638da5cb5b14610a3157600080fd5b806367f3aa40146109285780636c0360eb146109485780636caede3d1461095d5780636e118a021461097c5780636f8b44b01461099c57600080fd5b80632f745c59116103715780634f6ccce7116102ee57806355f804b3116102b257806355f804b314610898578063588bf34f146108b85780635c975abb146108ce5780635eac6239146108e85780636352211e1461090857600080fd5b80634f6ccce71461080c5780634f7b1f5f1461082c5780634f989520146108425780635183022714610862578063542aa2291461088257600080fd5b806342842e0e1161033557806342842e0e14610773578063438b63001461079357806344a0d68a146107c057806345571de5146107e05780634bad3710146107f657600080fd5b80632f745c59146106de5780633af32abf146106fe5780633c9527641461071e5780633ccfd60b1461073e5780633cd972ac1461075357600080fd5b806313faede6116103ff57806322849720116103c35780632284972014610666578063239c70ae1461067c57806323b872dd146106925780632619829d146106b25780632eb4a7ab146106c857600080fd5b806313faede6146105ce5780631523ad6d146105e4578063159816501461060457806318160ddd1461062457806318cae2691461063957600080fd5b8063095ea7b311610446578063095ea7b3146105495780630a1282de146105695780630b83a7271461058d578063118c0978146105a25780631209b1f6146105b857600080fd5b806301ffc9a71461048357806302329a29146104b857806306fdde03146104da578063081812fc146104fc578063081c8c4414610534575b600080fd5b34801561048f57600080fd5b506104a361049e366004612fb4565b610dc9565b60405190151581526020015b60405180910390f35b3480156104c457600080fd5b506104d86104d3366004612fe6565b610df4565b005b3480156104e657600080fd5b506104ef610e0f565b6040516104af9190613059565b34801561050857600080fd5b5061051c61051736600461306c565b610ea1565b6040516001600160a01b0390911681526020016104af565b34801561054057600080fd5b506104ef610ec8565b34801561055557600080fd5b506104d861056436600461309c565b610f56565b34801561057557600080fd5b5061057f601f5481565b6040519081526020016104af565b34801561059957600080fd5b506104d8611070565b3480156105ae57600080fd5b5061057f601d5481565b3480156105c457600080fd5b5061057f60235481565b3480156105da57600080fd5b5061057f60105481565b3480156105f057600080fd5b506104d86105ff36600461306c565b611102565b34801561061057600080fd5b506104d861061f36600461306c565b61110f565b34801561063057600080fd5b5060085461057f565b34801561064557600080fd5b5061057f6106543660046130c6565b601b6020526000908152604090205481565b34801561067257600080fd5b5061057f60185481565b34801561068857600080fd5b5061057f60125481565b34801561069e57600080fd5b506104d86106ad3660046130e1565b61111c565b3480156106be57600080fd5b5061057f60195481565b3480156106d457600080fd5b5061057f600b5481565b3480156106ea57600080fd5b5061057f6106f936600461309c565b61114d565b34801561070a57600080fd5b506104a36107193660046130c6565b6111e3565b34801561072a57600080fd5b506104d8610739366004612fe6565b61124c565b34801561074a57600080fd5b506104d8611272565b34801561075f57600080fd5b5061057f61076e36600461306c565b6112b0565b34801561077f57600080fd5b506104d861078e3660046130e1565b6112d6565b34801561079f57600080fd5b506107b36107ae3660046130c6565b6112f1565b6040516104af919061311d565b3480156107cc57600080fd5b506104d86107db36600461306c565b611393565b3480156107ec57600080fd5b5061057f60175481565b34801561080257600080fd5b5061057f60245481565b34801561081857600080fd5b5061057f61082736600461306c565b6113a0565b34801561083857600080fd5b5061057f601e5481565b34801561084e57600080fd5b5060265461051c906001600160a01b031681565b34801561086e57600080fd5b506014546104a39062010000900460ff1681565b34801561088e57600080fd5b5061057f60165481565b3480156108a457600080fd5b506104d86108b3366004613200565b611433565b3480156108c457600080fd5b5061057f60205481565b3480156108da57600080fd5b506014546104a39060ff1681565b3480156108f457600080fd5b506104d8610903366004613249565b61144b565b34801561091457600080fd5b5061051c61092336600461306c565b61151c565b34801561093457600080fd5b506104d861094336600461306c565b61157c565b34801561095457600080fd5b506104ef611589565b34801561096957600080fd5b506014546104a390610100900460ff1681565b34801561098857600080fd5b506104d861099736600461306c565b611596565b3480156109a857600080fd5b506104d86109b736600461306c565b6115a3565b3480156109c857600080fd5b5061057f6109d73660046130c6565b6115b0565b3480156109e857600080fd5b506104d8611636565b3480156109fd57600080fd5b506104d8610a0c36600461306c565b61164a565b348015610a1d57600080fd5b506104d8610a2c36600461306c565b611657565b348015610a3d57600080fd5b50600a546001600160a01b031661051c565b348015610a5b57600080fd5b506104d8611664565b348015610a7057600080fd5b506104ef61168f565b348015610a8557600080fd5b50610a8e61169e565b6040516104af91906132ef565b348015610aa757600080fd5b506014546104a3906301000000900460ff1681565b348015610ac857600080fd5b506104d86116ff565b6104d8610adf36600461306c565b611735565b348015610af057600080fd5b506104d8610aff366004613330565b611a82565b348015610b1057600080fd5b506104d8611a8d565b348015610b2557600080fd5b5061057f610b343660046130c6565b611aa8565b348015610b4557600080fd5b506104d8610b54366004613363565b611af9565b348015610b6557600080fd5b5061051c610b7436600461306c565b611b31565b348015610b8557600080fd5b5061057f60135481565b348015610b9b57600080fd5b5061057f610baa36600461306c565b601a6020526000908152604090205481565b348015610bc857600080fd5b506104ef611b5b565b348015610bdd57600080fd5b506104ef610bec36600461306c565b611b68565b348015610bfd57600080fd5b506104d8610c0c36600461306c565b611ced565b6104d8610c1f36600461342b565b611cfa565b6104d8611e97565b348015610c3857600080fd5b5061057f60115481565b348015610c4e57600080fd5b5061057f60255481565b348015610c6457600080fd5b506104d8610c73366004613200565b611f9d565b348015610c8457600080fd5b506104a3610c933660046130c6565b600c6020526000908152604090205460ff1681565b348015610cb457600080fd5b506104a3610cc3366004613477565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cfd57600080fd5b506104d8610d0c3660046134a1565b611fb1565b6104d8611fd1565b348015610d2557600080fd5b506104d8610d34366004613200565b611fda565b348015610d4557600080fd5b506104d8610d543660046130c6565b611fee565b348015610d6557600080fd5b5061057f610d74366004613249565b612067565b348015610d8557600080fd5b506021546104a39060ff1681565b348015610d9f57600080fd5b5061051c610dae36600461306c565b6120d2565b348015610dbf57600080fd5b5061057f60225481565b60006001600160e01b0319821663780e9d6360e01b1480610dee5750610dee826120e2565b92915050565b610dfc612132565b6014805460ff1916911515919091179055565b606060008054610e1e906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4a906134e3565b8015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050905090565b6000610eac8261218c565b506000908152600460205260409020546001600160a01b031690565b600f8054610ed5906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f01906134e3565b8015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b6000610f618261151c565b9050806001600160a01b0316836001600160a01b031603610fd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610fef5750610fef8133610cc3565b6110615760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610fca565b61106b83836121eb565b505050565b600061107b336115b0565b90506000805b828110156110d4576000611095338361114d565b90506110a0816112b0565b6110aa908461352d565b6017546000928352601a6020526040909220919091559150806110cc81613545565b915050611081565b50604051339082156108fc029083906000818181858888f1935050505015801561106b573d6000803e3d6000fd5b61110a612132565b602555565b611117612132565b602355565b6111263382612259565b6111425760405162461bcd60e51b8152600401610fca9061355e565b61106b8383836122d8565b6000611158836115b0565b82106111ba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b60155481101561124357826001600160a01b03166015828154811061120e5761120e6135ac565b6000918252602090912001546001600160a01b0316036112315750600192915050565b8061123b81613545565b9150506111e7565b50600092915050565b611254612132565b6014805491151563010000000263ff00000019909216919091179055565b61127a612132565b601954604051339180156108fc02916000818181858888f193505050501580156112a8573d6000803e3d6000fd5b506000601955565b6000818152601a60205260408120546017546112cc91906135c2565b610dee908261352d565b61106b83838360405180602001604052806000815250611af9565b606060006112fe836115b0565b905060008167ffffffffffffffff81111561131b5761131b613161565b604051908082528060200260200182016040528015611344578160200160208202803683370190505b50905060005b8281101561138b5761135c858261114d565b82828151811061136e5761136e6135ac565b60209081029190910101528061138381613545565b91505061134a565b509392505050565b61139b612132565b601055565b60006113ab60085490565b821061140e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fca565b60088281548110611421576114216135ac565b90600052602060002001549050919050565b61143b612132565b600d6114478282613627565b5050565b600061145682612067565b905060005b82518110156110d457336001600160a01b0316611490848381518110611483576114836135ac565b602002602001015161151c565b6001600160a01b0316146114d65760405162461bcd60e51b815260206004820152600d60248201526c13dddb995c88125b9d985b1a59609a1b6044820152606401610fca565b601754601a60008584815181106114ef576114ef6135ac565b6020026020010151815260200190815260200160002081905550808061151490613545565b91505061145b565b6000818152600260205260408120546001600160a01b031680610dee5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fca565b611584612132565b601655565b600d8054610ed5906134e3565b61159e612132565b602255565b6115ab612132565b601155565b60006001600160a01b03821661161a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610fca565b506001600160a01b031660009081526003602052604090205490565b61163e612132565b611648600061247f565b565b611652612132565b602455565b61165f612132565b601255565b6026546001600160a01b0316331461167b57600080fd5b6021805460ff19811660ff90911615179055565b606060018054610e1e906134e3565b6060601c805480602002602001604051908101604052809291908181526020018280548015610e9757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116d8575050505050905090565b6026546001600160a01b0316331461171657600080fd5b6026546001600160a01b0316331461172d57600080fd5b6116486124d1565b60145460ff16156117815760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610fca565b600061178c60085490565b9050600082116117de5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610fca565b60125482111561183c5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610fca565b601154611849838361352d565b11156118905760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610fca565b600a546001600160a01b031633146119cc576014546301000000900460ff16151560010361197a576118c1336111e3565b61190d5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610fca565b336000908152601b602052604090205460135461192a848361352d565b11156119785760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610fca565b505b8160105461198891906136e7565b3410156119cc5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610fca565b60015b828111611a3e57336000908152601b602052604081208054916119f183613545565b90915550611a0a905033611a05838561352d565b612697565b601754601a6000611a1b848661352d565b815260208101919091526040016000205580611a3681613545565b9150506119cf565b506000606460165434611a5191906136e7565b611a5b919061371c565b9050611a66816126b1565b3460196000828254611a78919061352d565b9091555050505050565b61144733838361271b565b611a95612132565b6014805462ff0000191662010000179055565b600080611ab4836115b0565b90506000805b8281101561138b576000611ace868361114d565b9050611ad9816112b0565b611ae3908461352d565b9250508080611af190613545565b915050611aba565b611b033383612259565b611b1f5760405162461bcd60e51b8152600401610fca9061355e565b611b2b848484846127e9565b50505050565b60158181548110611b4157600080fd5b6000918252602090912001546001600160a01b0316905081565b600e8054610ed5906134e3565b6000818152600260205260409020546060906001600160a01b0316611be75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610fca565b60145462010000900460ff161515600003611c8e57600f8054611c09906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c35906134e3565b8015611c825780601f10611c5757610100808354040283529160200191611c82565b820191906000526020600020905b815481529060010190602001808311611c6557829003601f168201915b50505050509050919050565b6000611c9861281c565b90506000815111611cb85760405180602001604052806000815250611ce6565b80611cc28461282b565b600e604051602001611cd693929190613730565b6040516020818303038152906040525b9392505050565b611cf5612132565b601355565b601454610100900460ff16611d5c5760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610fca565b336000908152600c602052604090205460ff1615611dbc5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610fca565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611e3683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54915084905061292c565b611e735760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610fca565b336000818152600c60205260409020805460ff19166001179055611b2b9085612697565b6023543414611ea557600080fd5b60215460ff1615611eec5760405162461bcd60e51b8152602060048201526011602482015270131bdd1d195c9e481a5cc81c185d5cd959607a1b6044820152606401610fca565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191633179055601d805491611f3b83613545565b91905055503460206000828254611f52919061352d565b90915550506040513381527f31e760aa525306aba638a784082a013b6a1cc0a9a1789f3f22281c0453b10b1f9060200160405180910390a1602254601d5410611648576116486124d1565b611fa5612132565b600e6114478282613627565b611fb9612132565b611fc560156000612eb3565b61106b60158383612ed1565b611648346126b1565b611fe2612132565b600f6114478282613627565b611ff6612132565b6001600160a01b03811661205b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fca565b6120648161247f565b50565b6000805b82518110156120cc57601a600084838151811061208a5761208a6135ac565b60200260200101518152602001908152602001600020546017546120ae91906135c2565b6120b8908361352d565b9150806120c481613545565b91505061206b565b50919050565b601c8181548110611b4157600080fd5b60006001600160e01b031982166380ac58cd60e01b148061211357506001600160e01b03198216635b5e139f60e01b145b80610dee57506301ffc9a760e01b6001600160e01b0319831614610dee565b600a546001600160a01b031633146116485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fca565b6000818152600260205260409020546001600160a01b03166120645760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fca565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122208261151c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806122658361151c565b9050806001600160a01b0316846001600160a01b031614806122ac57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806122d05750836001600160a01b03166122c584610ea1565b6001600160a01b0316145b949350505050565b826001600160a01b03166122eb8261151c565b6001600160a01b03161461234f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610fca565b6001600160a01b0382166123b15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fca565b6123bc838383612942565b6123c76000826121eb565b6001600160a01b03831660009081526003602052604081208054600192906123f09084906135c2565b90915550506001600160a01b038216600090815260036020526040812080546001929061241e90849061352d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601c546000906124df6129fa565b6124e991906137d0565b905060006022546023546124fd91906136e7565b90506000601c8381548110612514576125146135ac565b60009182526020822001546025546001600160a01b03909116925060649061253c90856136e7565b612546919061371c565b9050600060646024548561255a91906136e7565b612564919061371c565b90506000612572828461352d565b9050600061258082876135c2565b905061258b846126b1565b600a546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156125c5573d6000803e3d6000fd5b506040516001600160a01b0386169082156108fc029083906000818181858888f193505050501580156125fc573d6000803e3d6000fd5b50604080516000815260208101918290525161261a91601c91612f34565b506000601d55604080516001600160a01b0387168152602081018890527f6e0d11c40e939975aea1b614617340d694125da9ebed64c96cab216ca971564e910160405180910390a1601e805490600061267283613545565b919050555083601f6000828254612689919061352d565b909155505050505050505050565b611447828260405180602001604052806000815250612a30565b806018546126bf919061352d565b6018556008546126cf908261371c565b601760008282546126e0919061352d565b90915550506040518181527fbadc96f0b899bb720d18a25ea9fae343d6095c7f760d4a54ee0d65fe1c66ccd19060200160405180910390a150565b816001600160a01b0316836001600160a01b03160361277c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fca565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127f48484846122d8565b61280084848484612a63565b611b2b5760405162461bcd60e51b8152600401610fca906137e4565b6060600d8054610e1e906134e3565b6060816000036128525750506040805180820190915260018152600360fc1b602082015290565b8160005b811561287c578061286681613545565b91506128759050600a8361371c565b9150612856565b60008167ffffffffffffffff81111561289757612897613161565b6040519080825280601f01601f1916602001820160405280156128c1576020820181803683370190505b5090505b84156122d0576128d66001836135c2565b91506128e3600a866137d0565b6128ee90603061352d565b60f81b818381518110612903576129036135ac565b60200101906001600160f81b031916908160001a905350612925600a8661371c565b94506128c5565b6000826129398584612b64565b14949350505050565b6001600160a01b03831661299d5761299881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129c0565b816001600160a01b0316836001600160a01b0316146129c0576129c08382612ba9565b6001600160a01b0382166129d75761106b81612c46565b826001600160a01b0316826001600160a01b03161461106b5761106b8282612cf5565b60004442601c604051602001612a1293929190613836565b6040516020818303038152906040528051906020012060001c905090565b612a3a8383612d39565b612a476000848484612a63565b61106b5760405162461bcd60e51b8152600401610fca906137e4565b60006001600160a01b0384163b15612b5957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aa7903390899088908890600401613886565b6020604051808303816000875af1925050508015612ae2575060408051601f3d908101601f19168201909252612adf918101906138c3565b60015b612b3f573d808015612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b508051600003612b375760405162461bcd60e51b8152600401610fca906137e4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122d0565b506001949350505050565b600081815b845181101561138b57612b9582868381518110612b8857612b886135ac565b6020026020010151612e87565b915080612ba181613545565b915050612b69565b60006001612bb6846115b0565b612bc091906135c2565b600083815260076020526040902054909150808214612c13576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c58906001906135c2565b60008381526009602052604081205460088054939450909284908110612c8057612c806135ac565b906000526020600020015490508060088381548110612ca157612ca16135ac565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cd957612cd96138e0565b6001900381819060005260206000200160009055905550505050565b6000612d00836115b0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d8f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fca565b6000818152600260205260409020546001600160a01b031615612df45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fca565b612e0060008383612942565b6001600160a01b0382166000908152600360205260408120805460019290612e2990849061352d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612ea3576000828152602084905260409020611ce6565b5060009182526020526040902090565b50805460008255906000526020600020908101906120649190612f89565b828054828255906000526020600020908101928215612f24579160200282015b82811115612f245781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ef1565b50612f30929150612f89565b5090565b828054828255906000526020600020908101928215612f24579160200282015b82811115612f2457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f54565b5b80821115612f305760008155600101612f8a565b6001600160e01b03198116811461206457600080fd5b600060208284031215612fc657600080fd5b8135611ce681612f9e565b80358015158114612fe157600080fd5b919050565b600060208284031215612ff857600080fd5b611ce682612fd1565b60005b8381101561301c578181015183820152602001613004565b83811115611b2b5750506000910152565b60008151808452613045816020860160208601613001565b601f01601f19169290920160200192915050565b602081526000611ce6602083018461302d565b60006020828403121561307e57600080fd5b5035919050565b80356001600160a01b0381168114612fe157600080fd5b600080604083850312156130af57600080fd5b6130b883613085565b946020939093013593505050565b6000602082840312156130d857600080fd5b611ce682613085565b6000806000606084860312156130f657600080fd5b6130ff84613085565b925061310d60208501613085565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561315557835183529284019291840191600101613139565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131a0576131a0613161565b604052919050565b600067ffffffffffffffff8311156131c2576131c2613161565b6131d5601f8401601f1916602001613177565b90508281528383830111156131e957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561321257600080fd5b813567ffffffffffffffff81111561322957600080fd5b8201601f8101841361323a57600080fd5b6122d0848235602084016131a8565b6000602080838503121561325c57600080fd5b823567ffffffffffffffff8082111561327457600080fd5b818501915085601f83011261328857600080fd5b81358181111561329a5761329a613161565b8060051b91506132ab848301613177565b81815291830184019184810190888411156132c557600080fd5b938501935b838510156132e3578435825293850193908501906132ca565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131555783516001600160a01b03168352928401929184019160010161330b565b6000806040838503121561334357600080fd5b61334c83613085565b915061335a60208401612fd1565b90509250929050565b6000806000806080858703121561337957600080fd5b61338285613085565b935061339060208601613085565b925060408501359150606085013567ffffffffffffffff8111156133b357600080fd5b8501601f810187136133c457600080fd5b6133d3878235602084016131a8565b91505092959194509250565b60008083601f8401126133f157600080fd5b50813567ffffffffffffffff81111561340957600080fd5b6020830191508360208260051b850101111561342457600080fd5b9250929050565b60008060006040848603121561344057600080fd5b83359250602084013567ffffffffffffffff81111561345e57600080fd5b61346a868287016133df565b9497909650939450505050565b6000806040838503121561348a57600080fd5b61349383613085565b915061335a60208401613085565b600080602083850312156134b457600080fd5b823567ffffffffffffffff8111156134cb57600080fd5b6134d7858286016133df565b90969095509350505050565b600181811c908216806134f757607f821691505b6020821081036120cc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561354057613540613517565b500190565b60006001820161355757613557613517565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000828210156135d4576135d4613517565b500390565b601f82111561106b57600081815260208120601f850160051c810160208610156136005750805b601f850160051c820191505b8181101561361f5782815560010161360c565b505050505050565b815167ffffffffffffffff81111561364157613641613161565b6136558161364f84546134e3565b846135d9565b602080601f83116001811461368a57600084156136725750858301515b600019600386901b1c1916600185901b17855561361f565b600085815260208120601f198616915b828110156136b95788860151825594840194600190910190840161369a565b50858210156136d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081600019048311821515161561370157613701613517565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261372b5761372b613706565b500490565b6000845160206137438285838a01613001565b8551918401916137568184848a01613001565b8554920191600090613767816134e3565b6001828116801561377f5760018114613794576137c0565b60ff19841687528215158302870194506137c0565b896000528560002060005b848110156137b85781548982015290830190870161379f565b505082870194505b50929a9950505050505050505050565b6000826137df576137df613706565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b838152600060208481840152604083018454856000528260002060005b828110156138785781546001600160a01b031684529284019260019182019101613853565b509198975050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906138b99083018461302d565b9695505050505050565b6000602082840312156138d557600080fd5b8151611ce681612f9e565b634e487b7160e01b600052603160045260246000fdfea264697066735822122030a23ff862a3565ef9df6e0668f50c9c76365e2395c4dbdbf88ce212c124a0cf64736f6c634300080f0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c57696c642043524f20446f670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d65316a704c31354766456d55576d587970787243626a335741644b70634a53514c61704b38655a455868714a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061047e5760003560e01c806367f3aa4011610255578063ba4e5c4911610144578063da3ef23f116100c1578063f2c4ce1e11610085578063f2c4ce1e14610d19578063f2fde38b14610d39578063f490177214610d59578063f68fc92914610d79578063f71d96cb14610d93578063f8bb7ec214610db357600080fd5b8063da3ef23f14610c58578063db4bec4414610c78578063e985e9c514610ca8578063edec5f2714610cf1578063f053dc5c14610d1157600080fd5b8063d0eb26b011610108578063d0eb26b014610bf1578063d2cab05614610c11578063d4cd77a314610c24578063d5abeb0114610c2c578063d791da3214610c4257600080fd5b8063ba4e5c4914610b59578063ba7d2c7614610b79578063bac9320314610b8f578063c668286214610bbc578063c87b56dd14610bd157600080fd5b80639163723e116101d2578063a0712d6811610196578063a0712d6814610ad1578063a22cb46514610ae4578063a475b5dd14610b04578063a708d40414610b19578063b88d4fde14610b3957600080fd5b80639163723e14610a4f57806395d89b4114610a645780639814e6fa14610a795780639c70b51214610a9b5780639e0413eb14610abc57600080fd5b806370a082311161021957806370a08231146109bc578063715018a6146109dc57806371e0a4bc146109f15780637f00c7a614610a115780638da5cb5b14610a3157600080fd5b806367f3aa40146109285780636c0360eb146109485780636caede3d1461095d5780636e118a021461097c5780636f8b44b01461099c57600080fd5b80632f745c59116103715780634f6ccce7116102ee57806355f804b3116102b257806355f804b314610898578063588bf34f146108b85780635c975abb146108ce5780635eac6239146108e85780636352211e1461090857600080fd5b80634f6ccce71461080c5780634f7b1f5f1461082c5780634f989520146108425780635183022714610862578063542aa2291461088257600080fd5b806342842e0e1161033557806342842e0e14610773578063438b63001461079357806344a0d68a146107c057806345571de5146107e05780634bad3710146107f657600080fd5b80632f745c59146106de5780633af32abf146106fe5780633c9527641461071e5780633ccfd60b1461073e5780633cd972ac1461075357600080fd5b806313faede6116103ff57806322849720116103c35780632284972014610666578063239c70ae1461067c57806323b872dd146106925780632619829d146106b25780632eb4a7ab146106c857600080fd5b806313faede6146105ce5780631523ad6d146105e4578063159816501461060457806318160ddd1461062457806318cae2691461063957600080fd5b8063095ea7b311610446578063095ea7b3146105495780630a1282de146105695780630b83a7271461058d578063118c0978146105a25780631209b1f6146105b857600080fd5b806301ffc9a71461048357806302329a29146104b857806306fdde03146104da578063081812fc146104fc578063081c8c4414610534575b600080fd5b34801561048f57600080fd5b506104a361049e366004612fb4565b610dc9565b60405190151581526020015b60405180910390f35b3480156104c457600080fd5b506104d86104d3366004612fe6565b610df4565b005b3480156104e657600080fd5b506104ef610e0f565b6040516104af9190613059565b34801561050857600080fd5b5061051c61051736600461306c565b610ea1565b6040516001600160a01b0390911681526020016104af565b34801561054057600080fd5b506104ef610ec8565b34801561055557600080fd5b506104d861056436600461309c565b610f56565b34801561057557600080fd5b5061057f601f5481565b6040519081526020016104af565b34801561059957600080fd5b506104d8611070565b3480156105ae57600080fd5b5061057f601d5481565b3480156105c457600080fd5b5061057f60235481565b3480156105da57600080fd5b5061057f60105481565b3480156105f057600080fd5b506104d86105ff36600461306c565b611102565b34801561061057600080fd5b506104d861061f36600461306c565b61110f565b34801561063057600080fd5b5060085461057f565b34801561064557600080fd5b5061057f6106543660046130c6565b601b6020526000908152604090205481565b34801561067257600080fd5b5061057f60185481565b34801561068857600080fd5b5061057f60125481565b34801561069e57600080fd5b506104d86106ad3660046130e1565b61111c565b3480156106be57600080fd5b5061057f60195481565b3480156106d457600080fd5b5061057f600b5481565b3480156106ea57600080fd5b5061057f6106f936600461309c565b61114d565b34801561070a57600080fd5b506104a36107193660046130c6565b6111e3565b34801561072a57600080fd5b506104d8610739366004612fe6565b61124c565b34801561074a57600080fd5b506104d8611272565b34801561075f57600080fd5b5061057f61076e36600461306c565b6112b0565b34801561077f57600080fd5b506104d861078e3660046130e1565b6112d6565b34801561079f57600080fd5b506107b36107ae3660046130c6565b6112f1565b6040516104af919061311d565b3480156107cc57600080fd5b506104d86107db36600461306c565b611393565b3480156107ec57600080fd5b5061057f60175481565b34801561080257600080fd5b5061057f60245481565b34801561081857600080fd5b5061057f61082736600461306c565b6113a0565b34801561083857600080fd5b5061057f601e5481565b34801561084e57600080fd5b5060265461051c906001600160a01b031681565b34801561086e57600080fd5b506014546104a39062010000900460ff1681565b34801561088e57600080fd5b5061057f60165481565b3480156108a457600080fd5b506104d86108b3366004613200565b611433565b3480156108c457600080fd5b5061057f60205481565b3480156108da57600080fd5b506014546104a39060ff1681565b3480156108f457600080fd5b506104d8610903366004613249565b61144b565b34801561091457600080fd5b5061051c61092336600461306c565b61151c565b34801561093457600080fd5b506104d861094336600461306c565b61157c565b34801561095457600080fd5b506104ef611589565b34801561096957600080fd5b506014546104a390610100900460ff1681565b34801561098857600080fd5b506104d861099736600461306c565b611596565b3480156109a857600080fd5b506104d86109b736600461306c565b6115a3565b3480156109c857600080fd5b5061057f6109d73660046130c6565b6115b0565b3480156109e857600080fd5b506104d8611636565b3480156109fd57600080fd5b506104d8610a0c36600461306c565b61164a565b348015610a1d57600080fd5b506104d8610a2c36600461306c565b611657565b348015610a3d57600080fd5b50600a546001600160a01b031661051c565b348015610a5b57600080fd5b506104d8611664565b348015610a7057600080fd5b506104ef61168f565b348015610a8557600080fd5b50610a8e61169e565b6040516104af91906132ef565b348015610aa757600080fd5b506014546104a3906301000000900460ff1681565b348015610ac857600080fd5b506104d86116ff565b6104d8610adf36600461306c565b611735565b348015610af057600080fd5b506104d8610aff366004613330565b611a82565b348015610b1057600080fd5b506104d8611a8d565b348015610b2557600080fd5b5061057f610b343660046130c6565b611aa8565b348015610b4557600080fd5b506104d8610b54366004613363565b611af9565b348015610b6557600080fd5b5061051c610b7436600461306c565b611b31565b348015610b8557600080fd5b5061057f60135481565b348015610b9b57600080fd5b5061057f610baa36600461306c565b601a6020526000908152604090205481565b348015610bc857600080fd5b506104ef611b5b565b348015610bdd57600080fd5b506104ef610bec36600461306c565b611b68565b348015610bfd57600080fd5b506104d8610c0c36600461306c565b611ced565b6104d8610c1f36600461342b565b611cfa565b6104d8611e97565b348015610c3857600080fd5b5061057f60115481565b348015610c4e57600080fd5b5061057f60255481565b348015610c6457600080fd5b506104d8610c73366004613200565b611f9d565b348015610c8457600080fd5b506104a3610c933660046130c6565b600c6020526000908152604090205460ff1681565b348015610cb457600080fd5b506104a3610cc3366004613477565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cfd57600080fd5b506104d8610d0c3660046134a1565b611fb1565b6104d8611fd1565b348015610d2557600080fd5b506104d8610d34366004613200565b611fda565b348015610d4557600080fd5b506104d8610d543660046130c6565b611fee565b348015610d6557600080fd5b5061057f610d74366004613249565b612067565b348015610d8557600080fd5b506021546104a39060ff1681565b348015610d9f57600080fd5b5061051c610dae36600461306c565b6120d2565b348015610dbf57600080fd5b5061057f60225481565b60006001600160e01b0319821663780e9d6360e01b1480610dee5750610dee826120e2565b92915050565b610dfc612132565b6014805460ff1916911515919091179055565b606060008054610e1e906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4a906134e3565b8015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050905090565b6000610eac8261218c565b506000908152600460205260409020546001600160a01b031690565b600f8054610ed5906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f01906134e3565b8015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b6000610f618261151c565b9050806001600160a01b0316836001600160a01b031603610fd35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610fef5750610fef8133610cc3565b6110615760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610fca565b61106b83836121eb565b505050565b600061107b336115b0565b90506000805b828110156110d4576000611095338361114d565b90506110a0816112b0565b6110aa908461352d565b6017546000928352601a6020526040909220919091559150806110cc81613545565b915050611081565b50604051339082156108fc029083906000818181858888f1935050505015801561106b573d6000803e3d6000fd5b61110a612132565b602555565b611117612132565b602355565b6111263382612259565b6111425760405162461bcd60e51b8152600401610fca9061355e565b61106b8383836122d8565b6000611158836115b0565b82106111ba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610fca565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b60155481101561124357826001600160a01b03166015828154811061120e5761120e6135ac565b6000918252602090912001546001600160a01b0316036112315750600192915050565b8061123b81613545565b9150506111e7565b50600092915050565b611254612132565b6014805491151563010000000263ff00000019909216919091179055565b61127a612132565b601954604051339180156108fc02916000818181858888f193505050501580156112a8573d6000803e3d6000fd5b506000601955565b6000818152601a60205260408120546017546112cc91906135c2565b610dee908261352d565b61106b83838360405180602001604052806000815250611af9565b606060006112fe836115b0565b905060008167ffffffffffffffff81111561131b5761131b613161565b604051908082528060200260200182016040528015611344578160200160208202803683370190505b50905060005b8281101561138b5761135c858261114d565b82828151811061136e5761136e6135ac565b60209081029190910101528061138381613545565b91505061134a565b509392505050565b61139b612132565b601055565b60006113ab60085490565b821061140e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610fca565b60088281548110611421576114216135ac565b90600052602060002001549050919050565b61143b612132565b600d6114478282613627565b5050565b600061145682612067565b905060005b82518110156110d457336001600160a01b0316611490848381518110611483576114836135ac565b602002602001015161151c565b6001600160a01b0316146114d65760405162461bcd60e51b815260206004820152600d60248201526c13dddb995c88125b9d985b1a59609a1b6044820152606401610fca565b601754601a60008584815181106114ef576114ef6135ac565b6020026020010151815260200190815260200160002081905550808061151490613545565b91505061145b565b6000818152600260205260408120546001600160a01b031680610dee5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fca565b611584612132565b601655565b600d8054610ed5906134e3565b61159e612132565b602255565b6115ab612132565b601155565b60006001600160a01b03821661161a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610fca565b506001600160a01b031660009081526003602052604090205490565b61163e612132565b611648600061247f565b565b611652612132565b602455565b61165f612132565b601255565b6026546001600160a01b0316331461167b57600080fd5b6021805460ff19811660ff90911615179055565b606060018054610e1e906134e3565b6060601c805480602002602001604051908101604052809291908181526020018280548015610e9757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116d8575050505050905090565b6026546001600160a01b0316331461171657600080fd5b6026546001600160a01b0316331461172d57600080fd5b6116486124d1565b60145460ff16156117815760405162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b6044820152606401610fca565b600061178c60085490565b9050600082116117de5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610fca565b60125482111561183c5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610fca565b601154611849838361352d565b11156118905760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610fca565b600a546001600160a01b031633146119cc576014546301000000900460ff16151560010361197a576118c1336111e3565b61190d5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610fca565b336000908152601b602052604090205460135461192a848361352d565b11156119785760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610fca565b505b8160105461198891906136e7565b3410156119cc5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610fca565b60015b828111611a3e57336000908152601b602052604081208054916119f183613545565b90915550611a0a905033611a05838561352d565b612697565b601754601a6000611a1b848661352d565b815260208101919091526040016000205580611a3681613545565b9150506119cf565b506000606460165434611a5191906136e7565b611a5b919061371c565b9050611a66816126b1565b3460196000828254611a78919061352d565b9091555050505050565b61144733838361271b565b611a95612132565b6014805462ff0000191662010000179055565b600080611ab4836115b0565b90506000805b8281101561138b576000611ace868361114d565b9050611ad9816112b0565b611ae3908461352d565b9250508080611af190613545565b915050611aba565b611b033383612259565b611b1f5760405162461bcd60e51b8152600401610fca9061355e565b611b2b848484846127e9565b50505050565b60158181548110611b4157600080fd5b6000918252602090912001546001600160a01b0316905081565b600e8054610ed5906134e3565b6000818152600260205260409020546060906001600160a01b0316611be75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610fca565b60145462010000900460ff161515600003611c8e57600f8054611c09906134e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c35906134e3565b8015611c825780601f10611c5757610100808354040283529160200191611c82565b820191906000526020600020905b815481529060010190602001808311611c6557829003601f168201915b50505050509050919050565b6000611c9861281c565b90506000815111611cb85760405180602001604052806000815250611ce6565b80611cc28461282b565b600e604051602001611cd693929190613730565b6040516020818303038152906040525b9392505050565b611cf5612132565b601355565b601454610100900460ff16611d5c5760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610fca565b336000908152600c602052604090205460ff1615611dbc5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610fca565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611e3683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b54915084905061292c565b611e735760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610fca565b336000818152600c60205260409020805460ff19166001179055611b2b9085612697565b6023543414611ea557600080fd5b60215460ff1615611eec5760405162461bcd60e51b8152602060048201526011602482015270131bdd1d195c9e481a5cc81c185d5cd959607a1b6044820152606401610fca565b601c805460018101825560009182527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191633179055601d805491611f3b83613545565b91905055503460206000828254611f52919061352d565b90915550506040513381527f31e760aa525306aba638a784082a013b6a1cc0a9a1789f3f22281c0453b10b1f9060200160405180910390a1602254601d5410611648576116486124d1565b611fa5612132565b600e6114478282613627565b611fb9612132565b611fc560156000612eb3565b61106b60158383612ed1565b611648346126b1565b611fe2612132565b600f6114478282613627565b611ff6612132565b6001600160a01b03811661205b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fca565b6120648161247f565b50565b6000805b82518110156120cc57601a600084838151811061208a5761208a6135ac565b60200260200101518152602001908152602001600020546017546120ae91906135c2565b6120b8908361352d565b9150806120c481613545565b91505061206b565b50919050565b601c8181548110611b4157600080fd5b60006001600160e01b031982166380ac58cd60e01b148061211357506001600160e01b03198216635b5e139f60e01b145b80610dee57506301ffc9a760e01b6001600160e01b0319831614610dee565b600a546001600160a01b031633146116485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610fca565b6000818152600260205260409020546001600160a01b03166120645760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610fca565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122208261151c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806122658361151c565b9050806001600160a01b0316846001600160a01b031614806122ac57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806122d05750836001600160a01b03166122c584610ea1565b6001600160a01b0316145b949350505050565b826001600160a01b03166122eb8261151c565b6001600160a01b03161461234f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610fca565b6001600160a01b0382166123b15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610fca565b6123bc838383612942565b6123c76000826121eb565b6001600160a01b03831660009081526003602052604081208054600192906123f09084906135c2565b90915550506001600160a01b038216600090815260036020526040812080546001929061241e90849061352d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601c546000906124df6129fa565b6124e991906137d0565b905060006022546023546124fd91906136e7565b90506000601c8381548110612514576125146135ac565b60009182526020822001546025546001600160a01b03909116925060649061253c90856136e7565b612546919061371c565b9050600060646024548561255a91906136e7565b612564919061371c565b90506000612572828461352d565b9050600061258082876135c2565b905061258b846126b1565b600a546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156125c5573d6000803e3d6000fd5b506040516001600160a01b0386169082156108fc029083906000818181858888f193505050501580156125fc573d6000803e3d6000fd5b50604080516000815260208101918290525161261a91601c91612f34565b506000601d55604080516001600160a01b0387168152602081018890527f6e0d11c40e939975aea1b614617340d694125da9ebed64c96cab216ca971564e910160405180910390a1601e805490600061267283613545565b919050555083601f6000828254612689919061352d565b909155505050505050505050565b611447828260405180602001604052806000815250612a30565b806018546126bf919061352d565b6018556008546126cf908261371c565b601760008282546126e0919061352d565b90915550506040518181527fbadc96f0b899bb720d18a25ea9fae343d6095c7f760d4a54ee0d65fe1c66ccd19060200160405180910390a150565b816001600160a01b0316836001600160a01b03160361277c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610fca565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127f48484846122d8565b61280084848484612a63565b611b2b5760405162461bcd60e51b8152600401610fca906137e4565b6060600d8054610e1e906134e3565b6060816000036128525750506040805180820190915260018152600360fc1b602082015290565b8160005b811561287c578061286681613545565b91506128759050600a8361371c565b9150612856565b60008167ffffffffffffffff81111561289757612897613161565b6040519080825280601f01601f1916602001820160405280156128c1576020820181803683370190505b5090505b84156122d0576128d66001836135c2565b91506128e3600a866137d0565b6128ee90603061352d565b60f81b818381518110612903576129036135ac565b60200101906001600160f81b031916908160001a905350612925600a8661371c565b94506128c5565b6000826129398584612b64565b14949350505050565b6001600160a01b03831661299d5761299881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129c0565b816001600160a01b0316836001600160a01b0316146129c0576129c08382612ba9565b6001600160a01b0382166129d75761106b81612c46565b826001600160a01b0316826001600160a01b03161461106b5761106b8282612cf5565b60004442601c604051602001612a1293929190613836565b6040516020818303038152906040528051906020012060001c905090565b612a3a8383612d39565b612a476000848484612a63565b61106b5760405162461bcd60e51b8152600401610fca906137e4565b60006001600160a01b0384163b15612b5957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aa7903390899088908890600401613886565b6020604051808303816000875af1925050508015612ae2575060408051601f3d908101601f19168201909252612adf918101906138c3565b60015b612b3f573d808015612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b508051600003612b375760405162461bcd60e51b8152600401610fca906137e4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122d0565b506001949350505050565b600081815b845181101561138b57612b9582868381518110612b8857612b886135ac565b6020026020010151612e87565b915080612ba181613545565b915050612b69565b60006001612bb6846115b0565b612bc091906135c2565b600083815260076020526040902054909150808214612c13576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c58906001906135c2565b60008381526009602052604081205460088054939450909284908110612c8057612c806135ac565b906000526020600020015490508060088381548110612ca157612ca16135ac565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cd957612cd96138e0565b6001900381819060005260206000200160009055905550505050565b6000612d00836115b0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d8f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610fca565b6000818152600260205260409020546001600160a01b031615612df45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610fca565b612e0060008383612942565b6001600160a01b0382166000908152600360205260408120805460019290612e2990849061352d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818310612ea3576000828152602084905260409020611ce6565b5060009182526020526040902090565b50805460008255906000526020600020908101906120649190612f89565b828054828255906000526020600020908101928215612f24579160200282015b82811115612f245781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ef1565b50612f30929150612f89565b5090565b828054828255906000526020600020908101928215612f24579160200282015b82811115612f2457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f54565b5b80821115612f305760008155600101612f8a565b6001600160e01b03198116811461206457600080fd5b600060208284031215612fc657600080fd5b8135611ce681612f9e565b80358015158114612fe157600080fd5b919050565b600060208284031215612ff857600080fd5b611ce682612fd1565b60005b8381101561301c578181015183820152602001613004565b83811115611b2b5750506000910152565b60008151808452613045816020860160208601613001565b601f01601f19169290920160200192915050565b602081526000611ce6602083018461302d565b60006020828403121561307e57600080fd5b5035919050565b80356001600160a01b0381168114612fe157600080fd5b600080604083850312156130af57600080fd5b6130b883613085565b946020939093013593505050565b6000602082840312156130d857600080fd5b611ce682613085565b6000806000606084860312156130f657600080fd5b6130ff84613085565b925061310d60208501613085565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561315557835183529284019291840191600101613139565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131a0576131a0613161565b604052919050565b600067ffffffffffffffff8311156131c2576131c2613161565b6131d5601f8401601f1916602001613177565b90508281528383830111156131e957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561321257600080fd5b813567ffffffffffffffff81111561322957600080fd5b8201601f8101841361323a57600080fd5b6122d0848235602084016131a8565b6000602080838503121561325c57600080fd5b823567ffffffffffffffff8082111561327457600080fd5b818501915085601f83011261328857600080fd5b81358181111561329a5761329a613161565b8060051b91506132ab848301613177565b81815291830184019184810190888411156132c557600080fd5b938501935b838510156132e3578435825293850193908501906132ca565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131555783516001600160a01b03168352928401929184019160010161330b565b6000806040838503121561334357600080fd5b61334c83613085565b915061335a60208401612fd1565b90509250929050565b6000806000806080858703121561337957600080fd5b61338285613085565b935061339060208601613085565b925060408501359150606085013567ffffffffffffffff8111156133b357600080fd5b8501601f810187136133c457600080fd5b6133d3878235602084016131a8565b91505092959194509250565b60008083601f8401126133f157600080fd5b50813567ffffffffffffffff81111561340957600080fd5b6020830191508360208260051b850101111561342457600080fd5b9250929050565b60008060006040848603121561344057600080fd5b83359250602084013567ffffffffffffffff81111561345e57600080fd5b61346a868287016133df565b9497909650939450505050565b6000806040838503121561348a57600080fd5b61349383613085565b915061335a60208401613085565b600080602083850312156134b457600080fd5b823567ffffffffffffffff8111156134cb57600080fd5b6134d7858286016133df565b90969095509350505050565b600181811c908216806134f757607f821691505b6020821081036120cc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561354057613540613517565b500190565b60006001820161355757613557613517565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000828210156135d4576135d4613517565b500390565b601f82111561106b57600081815260208120601f850160051c810160208610156136005750805b601f850160051c820191505b8181101561361f5782815560010161360c565b505050505050565b815167ffffffffffffffff81111561364157613641613161565b6136558161364f84546134e3565b846135d9565b602080601f83116001811461368a57600084156136725750858301515b600019600386901b1c1916600185901b17855561361f565b600085815260208120601f198616915b828110156136b95788860151825594840194600190910190840161369a565b50858210156136d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081600019048311821515161561370157613701613517565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261372b5761372b613706565b500490565b6000845160206137438285838a01613001565b8551918401916137568184848a01613001565b8554920191600090613767816134e3565b6001828116801561377f5760018114613794576137c0565b60ff19841687528215158302870194506137c0565b896000528560002060005b848110156137b85781548982015290830190870161379f565b505082870194505b50929a9950505050505050505050565b6000826137df576137df613706565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b838152600060208481840152604083018454856000528260002060005b828110156138785781546001600160a01b031684529284019260019182019101613853565b509198975050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906138b99083018461302d565b9695505050505050565b6000602082840312156138d557600080fd5b8151611ce681612f9e565b634e487b7160e01b600052603160045260246000fdfea264697066735822122030a23ff862a3565ef9df6e0668f50c9c76365e2395c4dbdbf88ce212c124a0cf64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c57696c642043524f20446f670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000357434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d65316a704c31354766456d55576d587970787243626a335741644b70634a53514c61704b38655a455868714a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Wild CRO Dog
Arg [1] : _symbol (string): WCD
Arg [2] : _initBaseURI (string): ipfs://Qme1jpL15GfEmUWmXypxrCbj3WAdKpcJSQLapK8eZEXhqJ
Arg [3] : _initNotRevealedUri (string):
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 57696c642043524f20446f670000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5743440000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [9] : 697066733a2f2f516d65316a704c31354766456d55576d587970787243626a33
Arg [10] : 5741644b70634a53514c61704b38655a455868714a0000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
54966:9981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48735:224;;;;;;;;;;-1:-1:-1;48735:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;48735:224:0;;;;;;;;62628:73;;;;;;;;;;-1:-1:-1;62628:73:0;;;;;:::i;:::-;;:::i;:::-;;34389:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35902:171::-;;;;;;;;;;-1:-1:-1;35902:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2042:32:1;;;2024:51;;2012:2;1997:18;35902:171:0;1878:203:1;55334:28:0;;;;;;;;;;;;;:::i;35419:417::-;;;;;;;;;;-1:-1:-1;35419:417:0;;;;;:::i;:::-;;:::i;56077:38::-;;;;;;;;;;;;;;;;;;;2669:25:1;;;2657:2;2642:18;56077:38:0;2523:177:1;59956:359:0;;;;;;;;;;;;;:::i;56010:26::-;;;;;;;;;;;;;;;;56231:36;;;;;;;;;;;;;;;;55367:31;;;;;;;;;;;;;;;;63185:123;;;;;;;;;;-1:-1:-1;63185:123:0;;;;;:::i;:::-;;:::i;63434:102::-;;;;;;;;;;-1:-1:-1;63434:102:0;;;;;:::i;:::-;;:::i;49375:113::-;;;;;;;;;;-1:-1:-1;49463:10:0;:17;49375:113;;55911:55;;;;;;;;;;-1:-1:-1;55911:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;55782:30;;;;;;;;;;;;;;;;55439:32;;;;;;;;;;;;;;;;36602:336;;;;;;;;;;-1:-1:-1;36602:336:0;;;;;:::i;:::-;;:::i;55817:32::-;;;;;;;;;;;;;;;;55054:25;;;;;;;;;;;;;;;;49043:256;;;;;;;;;;-1:-1:-1;49043:256:0;;;;;:::i;:::-;;:::i;60651:239::-;;;;;;;;;;-1:-1:-1;60651:239:0;;;;;:::i;:::-;;:::i;62812:95::-;;;;;;;;;;-1:-1:-1;62812:95:0;;;;;:::i;:::-;;:::i;64819:125::-;;;;;;;;;;;;;:::i;59421:184::-;;;;;;;;;;-1:-1:-1;59421:184:0;;;;;:::i;:::-;;:::i;37009:185::-;;;;;;;;;;-1:-1:-1;37009:185:0;;;;;:::i;:::-;;:::i;60896:348::-;;;;;;;;;;-1:-1:-1;60896:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61958:80::-;;;;;;;;;;-1:-1:-1;61958:80:0;;;;;:::i;:::-;;:::i;55745:32::-;;;;;;;;;;;;;;;;56272;;;;;;;;;;;;;;;;49565:233;;;;;;;;;;-1:-1:-1;49565:233:0;;;;;:::i;:::-;;:::i;56041:30::-;;;;;;;;;;;;;;;;56349:29;;;;;;;;;;-1:-1:-1;56349:29:0;;;;-1:-1:-1;;;;;56349:29:0;;;55593:28;;;;;;;;;;-1:-1:-1;55593:28:0;;;;;;;;;;;55707:33;;;;;;;;;;;;;;;;62268:98;;;;;;;;;;-1:-1:-1;62268:98:0;;;;;:::i;:::-;;:::i;56121:32::-;;;;;;;;;;;;;;;;55518:25;;;;;;;;;;-1:-1:-1;55518:25:0;;;;;;;;59611:339;;;;;;;;;;-1:-1:-1;59611:339:0;;;;;:::i;:::-;;:::i;34100:222::-;;;;;;;;;;-1:-1:-1;34100:222:0;;;;;:::i;:::-;;:::i;63065:114::-;;;;;;;;;;-1:-1:-1;63065:114:0;;;;;:::i;:::-;;:::i;55266:21::-;;;;;;;;;;;;;:::i;55548:40::-;;;;;;;;;;-1:-1:-1;55548:40:0;;;;;;;;;;;63542:102;;;;;;;;;;-1:-1:-1;63542:102:0;;;;;:::i;:::-;;:::i;62046:94::-;;;;;;;;;;-1:-1:-1;62046:94:0;;;;;:::i;:::-;;:::i;33831:207::-;;;;;;;;;;-1:-1:-1;33831:207:0;;;;;:::i;:::-;;:::i;11501:103::-;;;;;;;;;;;;;:::i;63312:112::-;;;;;;;;;;-1:-1:-1;63312:112:0;;;;;:::i;:::-;;:::i;62146:116::-;;;;;;;;;;-1:-1:-1;62146:116:0;;;;;:::i;:::-;;:::i;10853:87::-;;;;;;;;;;-1:-1:-1;10926:6:0;;-1:-1:-1;;;;;10926:6:0;10853:87;;62705:99;;;;;;;;;;;;;:::i;34558:104::-;;;;;;;;;;;;;:::i;63656:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55626:34::-;;;;;;;;;;-1:-1:-1;55626:34:0;;;;;;;;;;;63758:118;;;;;;;;;;;;;:::i;57441:1125::-;;;;;;:::i;:::-;;:::i;36145:155::-;;;;;;;;;;-1:-1:-1;36145:155:0;;;;;:::i;:::-;;:::i;61773:65::-;;;;;;;;;;;;;:::i;60321:322::-;;;;;;;;;;-1:-1:-1;60321:322:0;;;;;:::i;:::-;;:::i;37265:323::-;;;;;;;;;;-1:-1:-1;37265:323:0;;;;;:::i;:::-;;:::i;55665:37::-;;;;;;;;;;-1:-1:-1;55665:37:0;;;;;:::i;:::-;;:::i;55476:::-;;;;;;;;;;;;;;;;55856:50;;;;;;;;;;-1:-1:-1;55856:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;55292:37;;;;;;;;;;;;;:::i;61250:497::-;;;;;;;;;;-1:-1:-1;61250:497:0;;;;;:::i;:::-;;:::i;61846:104::-;;;;;;;;;;-1:-1:-1;61846:104:0;;;;;:::i;:::-;;:::i;56901:521::-;;;;;;:::i;:::-;;:::i;58572:339::-;;;:::i;55403:31::-;;;;;;;;;;;;;;;;56309:35;;;;;;;;;;;;;;;;62372:122;;;;;;;;;;-1:-1:-1;62372:122:0;;;;;:::i;:::-;;:::i;55084:48::-;;;;;;;;;;-1:-1:-1;55084:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36371:164;;;;;;;;;;-1:-1:-1;36371:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36492:25:0;;;36468:4;36492:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36371:164;62915:144;;;;;;;;;;-1:-1:-1;62915:144:0;;;;;:::i;:::-;;:::i;59102:70::-;;;:::i;62502:120::-;;;;;;;;;;-1:-1:-1;62502:120:0;;;;;:::i;:::-;;:::i;11759:201::-;;;;;;;;;;-1:-1:-1;11759:201:0;;;;;:::i;:::-;;:::i;59178:237::-;;;;;;;;;;-1:-1:-1;59178:237:0;;;;;:::i;:::-;;:::i;56159:32::-;;;;;;;;;;-1:-1:-1;56159:32:0;;;;;;;;55973;;;;;;;;;;-1:-1:-1;55973:32:0;;;;;:::i;:::-;;:::i;56196:30::-;;;;;;;;;;;;;;;;48735:224;48837:4;-1:-1:-1;;;;;;48861:50:0;;-1:-1:-1;;;48861:50:0;;:90;;;48915:36;48939:11;48915:23;:36::i;:::-;48854:97;48735:224;-1:-1:-1;;48735:224:0:o;62628:73::-;10739:13;:11;:13::i;:::-;62680:6:::1;:15:::0;;-1:-1:-1;;62680:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62628:73::o;34389:100::-;34443:13;34476:5;34469:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34389:100;:::o;35902:171::-;35978:7;35998:23;36013:7;35998:14;:23::i;:::-;-1:-1:-1;36041:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36041:24:0;;35902:171::o;55334:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35419:417::-;35500:13;35516:23;35531:7;35516:14;:23::i;:::-;35500:39;;35564:5;-1:-1:-1;;;;;35558:11:0;:2;-1:-1:-1;;;;;35558:11:0;;35550:57;;;;-1:-1:-1;;;35550:57:0;;10289:2:1;35550:57:0;;;10271:21:1;10328:2;10308:18;;;10301:30;10367:34;10347:18;;;10340:62;-1:-1:-1;;;10418:18:1;;;10411:31;10459:19;;35550:57:0;;;;;;;;;9484:10;-1:-1:-1;;;;;35642:21:0;;;;:62;;-1:-1:-1;35667:37:0;35684:5;9484:10;36371:164;:::i;35667:37::-;35620:174;;;;-1:-1:-1;;;35620:174:0;;10691:2:1;35620:174:0;;;10673:21:1;10730:2;10710:18;;;10703:30;10769:34;10749:18;;;10742:62;10840:32;10820:18;;;10813:60;10890:19;;35620:174:0;10489:426:1;35620:174:0;35807:21;35816:2;35820:7;35807:8;:21::i;:::-;35489:347;35419:417;;:::o;59956:359::-;59997:10;60010:21;60020:10;60010:9;:21::i;:::-;59997:34;;60038:15;60068:6;60064:202;60084:5;60080:1;:9;60064:202;;;60106:12;60121:34;60141:10;60153:1;60121:19;:34::i;:::-;60106:49;;60178:24;60194:7;60178:15;:24::i;:::-;60166:37;;;;:::i;:::-;60241:17;;60214:24;;;;:15;:24;;;;;;:44;;;;60166:37;-1:-1:-1;60091:3:0;;;;:::i;:::-;;;;60064:202;;;-1:-1:-1;60272:37:0;;60280:10;;60272:37;;;;;60301:7;;60272:37;;;;60301:7;60280:10;60272:37;;;;;;;;;;;;;;;;;;;63185:123;10739:13;:11;:13::i;:::-;63266:16:::1;:36:::0;63185:123::o;63434:102::-;10739:13;:11;:13::i;:::-;63504:11:::1;:26:::0;63434:102::o;36602:336::-;36797:41;9484:10;36830:7;36797:18;:41::i;:::-;36789:100;;;;-1:-1:-1;;;36789:100:0;;;;;;;:::i;:::-;36902:28;36912:4;36918:2;36922:7;36902:9;:28::i;49043:256::-;49140:7;49176:23;49193:5;49176:16;:23::i;:::-;49168:5;:31;49160:87;;;;-1:-1:-1;;;49160:87:0;;11942:2:1;49160:87:0;;;11924:21:1;11981:2;11961:18;;;11954:30;12020:34;12000:18;;;11993:62;-1:-1:-1;;;12071:18:1;;;12064:41;12122:19;;49160:87:0;11740:407:1;49160:87:0;-1:-1:-1;;;;;;49265:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;49043:256::o;60651:239::-;60710:4;;60723:143;60744:20;:27;60740:31;;60723:143;;;60818:5;-1:-1:-1;;;;;60791:32:0;:20;60812:1;60791:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;60791:23:0;:32;60787:72;;-1:-1:-1;60845:4:0;;60651:239;-1:-1:-1;;60651:239:0:o;60787:72::-;60773:3;;;;:::i;:::-;;;;60723:143;;;-1:-1:-1;60879:5:0;;60651:239;-1:-1:-1;;60651:239:0:o;62812:95::-;10739:13;:11;:13::i;:::-;62877:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62877:24:0;;::::1;::::0;;;::::1;::::0;;62812:95::o;64819:125::-;10739:13;:11;:13::i;:::-;64892:17:::1;::::0;64863:47:::1;::::0;64871:10:::1;::::0;64863:47;::::1;;;::::0;::::1;::::0;;;64892:17;64871:10;64863:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;64937:1:0::1;64917:17;:21:::0;64819:125::o;59421:184::-;59507:15;59567:32;;;:15;:32;;;;;;59547:17;;:52;;59567:32;59547:52;:::i;:::-;59536:63;;;;:::i;37009:185::-;37147:39;37164:4;37170:2;37174:7;37147:39;;;;;;;;;;;;:16;:39::i;60896:348::-;60971:16;60999:23;61025:17;61035:6;61025:9;:17::i;:::-;60999:43;;61049:25;61091:15;61077:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61077:30:0;;61049:58;;61119:9;61114:103;61134:15;61130:1;:19;61114:103;;;61179:30;61199:6;61207:1;61179:19;:30::i;:::-;61165:8;61174:1;61165:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;61151:3;;;;:::i;:::-;;;;61114:103;;;-1:-1:-1;61230:8:0;60896:348;-1:-1:-1;;;60896:348:0:o;61958:80::-;10739:13;:11;:13::i;:::-;62017:4:::1;:15:::0;61958:80::o;49565:233::-;49640:7;49676:30;49463:10;:17;;49375:113;49676:30;49668:5;:38;49660:95;;;;-1:-1:-1;;;49660:95:0;;12616:2:1;49660:95:0;;;12598:21:1;12655:2;12635:18;;;12628:30;12694:34;12674:18;;;12667:62;-1:-1:-1;;;12745:18:1;;;12738:42;12797:19;;49660:95:0;12414:408:1;49660:95:0;49773:10;49784:5;49773:17;;;;;;;;:::i;:::-;;;;;;;;;49766:24;;49565:233;;;:::o;62268:98::-;10739:13;:11;:13::i;:::-;62339:7:::1;:21;62349:11:::0;62339:7;:21:::1;:::i;:::-;;62268:98:::0;:::o;59611:339::-;59676:15;59694:20;59705:8;59694:10;:20::i;:::-;59676:38;;59726:9;59721:180;59745:8;:15;59741:1;:19;59721:180;;;59808:10;-1:-1:-1;;;;;59784:34:0;:20;59792:8;59801:1;59792:11;;;;;;;;:::i;:::-;;;;;;;59784:7;:20::i;:::-;-1:-1:-1;;;;;59784:34:0;;59776:60;;;;-1:-1:-1;;;59776:60:0;;15233:2:1;59776:60:0;;;15215:21:1;15272:2;15252:18;;;15245:30;-1:-1:-1;;;15291:18:1;;;15284:43;15344:18;;59776:60:0;15031:337:1;59776:60:0;59876:17;;59845:15;:28;59861:8;59870:1;59861:11;;;;;;;;:::i;:::-;;;;;;;59845:28;;;;;;;;;;;:48;;;;59762:3;;;;;:::i;:::-;;;;59721:180;;34100:222;34172:7;34208:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34208:16:0;;34235:56;;;;-1:-1:-1;;;34235:56:0;;15575:2:1;34235:56:0;;;15557:21:1;15614:2;15594:18;;;15587:30;-1:-1:-1;;;15633:18:1;;;15626:54;15697:18;;34235:56:0;15373:348:1;63065:114:0;10739:13;:11;:13::i;:::-;63141:14:::1;:32:::0;63065:114::o;55266:21::-;;;;;;;:::i;63542:102::-;10739:13;:11;:13::i;:::-;63612:11:::1;:26:::0;63542:102::o;62046:94::-;10739:13;:11;:13::i;:::-;62112:9:::1;:22:::0;62046:94::o;33831:207::-;33903:7;-1:-1:-1;;;;;33931:19:0;;33923:73;;;;-1:-1:-1;;;33923:73:0;;15928:2:1;33923:73:0;;;15910:21:1;15967:2;15947:18;;;15940:30;16006:34;15986:18;;;15979:62;-1:-1:-1;;;16057:18:1;;;16050:39;16106:19;;33923:73:0;15726:405:1;33923:73:0;-1:-1:-1;;;;;;34014:16:0;;;;;:9;:16;;;;;;;33831:207::o;11501:103::-;10739:13;:11;:13::i;:::-;11566:30:::1;11593:1;11566:18;:30::i;:::-;11501:103::o:0;63312:112::-;10739:13;:11;:13::i;:::-;63388::::1;:30:::0;63312:112::o;62146:116::-;10739:13;:11;:13::i;:::-;62223::::1;:33:::0;62146:116::o;62705:99::-;56856:14;;-1:-1:-1;;;;;56856:14:0;56842:10;:28;56834:37;;;;;;62785:13:::1;::::0;;-1:-1:-1;;62768:30:0;::::1;62785:13;::::0;;::::1;62784:14;62768:30;::::0;;62705:99::o;34558:104::-;34614:13;34647:7;34640:14;;;;;:::i;63656:96::-;63699:24;63739:7;63732:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63732:14:0;;;;;;;;;;;;;;;;;;;;;;63656:96;:::o;63758:118::-;56856:14;;-1:-1:-1;;;;;56856:14:0;56842:10;:28;56834:37;;;;;;63835:14:::1;::::0;-1:-1:-1;;;;;63835:14:0::1;63821:10;:28;63813:37;;;::::0;::::1;;63858:12;:10;:12::i;57441:1125::-:0;57507:6;;;;57506:7;57498:42;;;;-1:-1:-1;;;57498:42:0;;16338:2:1;57498:42:0;;;16320:21:1;16377:2;16357:18;;;16350:30;-1:-1:-1;;;16396:18:1;;;16389:52;16458:18;;57498:42:0;16136:346:1;57498:42:0;57547:14;57564:13;49463:10;:17;;49375:113;57564:13;57547:30;;57606:1;57592:11;:15;57584:55;;;;-1:-1:-1;;;57584:55:0;;16689:2:1;57584:55:0;;;16671:21:1;16728:2;16708:18;;;16701:30;16767:29;16747:18;;;16740:57;16814:18;;57584:55:0;16487:351:1;57584:55:0;57669:13;;57654:11;:28;;57646:77;;;;-1:-1:-1;;;57646:77:0;;17045:2:1;57646:77:0;;;17027:21:1;17084:2;17064:18;;;17057:30;17123:34;17103:18;;;17096:62;-1:-1:-1;;;17174:18:1;;;17167:34;17218:19;;57646:77:0;16843:400:1;57646:77:0;57762:9;;57738:20;57747:11;57738:6;:20;:::i;:::-;:33;;57730:68;;;;-1:-1:-1;;;57730:68:0;;17450:2:1;57730:68:0;;;17432:21:1;17489:2;17469:18;;;17462:30;-1:-1:-1;;;17508:18:1;;;17501:52;17570:18;;57730:68:0;17248:346:1;57730:68:0;10926:6;;-1:-1:-1;;;;;10926:6:0;57811:10;:21;57807:416;;57848:15;;;;;;;:23;;57867:4;57848:23;57845:298;;57896:25;57910:10;57896:13;:25::i;:::-;57888:61;;;;-1:-1:-1;;;57888:61:0;;17801:2:1;57888:61:0;;;17783:21:1;17840:2;17820:18;;;17813:30;17879:25;17859:18;;;17852:53;17922:18;;57888:61:0;17599:347:1;57888:61:0;58012:10;57964:24;57991:32;;;:20;:32;;;;;;58080:18;;58046:30;58065:11;57991:32;58046:30;:::i;:::-;:52;;58038:93;;;;-1:-1:-1;;;58038:93:0;;18153:2:1;58038:93:0;;;18135:21:1;18192:2;18172:18;;;18165:30;18231;18211:18;;;18204:58;18279:18;;58038:93:0;17951:352:1;58038:93:0;57873:270;57845:298;58181:11;58174:4;;:18;;;;:::i;:::-;58161:9;:31;;58153:62;;;;-1:-1:-1;;;58153:62:0;;18683:2:1;58153:62:0;;;18665:21:1;18722:2;18702:18;;;18695:30;-1:-1:-1;;;18741:18:1;;;18734:48;18799:18;;58153:62:0;18481:342:1;58153:62:0;58248:1;58231:192;58256:11;58251:1;:16;58231:192;;58304:10;58283:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;58326:33:0;;-1:-1:-1;58336:10:0;58348;58357:1;58348:6;:10;:::i;:::-;58326:9;:33::i;:::-;58398:17;;58368:15;:27;58384:10;58393:1;58384:6;:10;:::i;:::-;58368:27;;;;;;;;;;;-1:-1:-1;58368:27:0;:47;58269:3;;;;:::i;:::-;;;;58231:192;;;;58429:23;58486:3;58468:14;;58456:9;:26;;;;:::i;:::-;58455:34;;;;:::i;:::-;58429:60;;58496:27;58507:15;58496:10;:27::i;:::-;58551:9;58530:17;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;57441:1125:0:o;36145:155::-;36240:52;9484:10;36273:8;36283;36240:18;:52::i;61773:65::-;10739:13;:11;:13::i;:::-;61817:8:::1;:15:::0;;-1:-1:-1;;61817:15:0::1;::::0;::::1;::::0;;61773:65::o;60321:322::-;60389:7;60407:10;60420:17;60430:6;60420:9;:17::i;:::-;60407:30;;60446:13;60476:6;60472:145;60492:5;60488:1;:9;60472:145;;;60516:12;60531:30;60551:6;60559:1;60531:19;:30::i;:::-;60516:45;;60583:24;60599:7;60583:15;:24::i;:::-;60574:33;;;;:::i;:::-;;;60503:114;60499:3;;;;;:::i;:::-;;;;60472:145;;37265:323;37439:41;9484:10;37472:7;37439:18;:41::i;:::-;37431:100;;;;-1:-1:-1;;;37431:100:0;;;;;;;:::i;:::-;37542:38;37556:4;37562:2;37566:7;37575:4;37542:13;:38::i;:::-;37265:323;;;;:::o;55665:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55665:37:0;;-1:-1:-1;55665:37:0;:::o;55292:::-;;;;;;;:::i;61250:497::-;39160:4;39184:16;;;:7;:16;;;;;;61348:13;;-1:-1:-1;;;;;39184:16:0;61373:97;;;;-1:-1:-1;;;61373:97:0;;19287:2:1;61373:97:0;;;19269:21:1;19326:2;19306:18;;;19299:30;19365:34;19345:18;;;19338:62;-1:-1:-1;;;19416:18:1;;;19409:45;19471:19;;61373:97:0;19085:411:1;61373:97:0;61486:8;;;;;;;:17;;61498:5;61486:17;61483:62;;61523:14;61516:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61250:497;;;:::o;61483:62::-;61553:28;61584:10;:8;:10::i;:::-;61553:41;;61639:1;61614:14;61608:28;:32;:133;;;;;;;;;;;;;;;;;61676:14;61692:18;:7;:16;:18::i;:::-;61712:13;61659:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61608:133;61601:140;61250:497;-1:-1:-1;;;61250:497:0:o;61846:104::-;10739:13;:11;:13::i;:::-;61917:18:::1;:27:::0;61846:104::o;56901:521::-;57046:20;;;;;;;57038:67;;;;-1:-1:-1;;;57038:67:0;;20938:2:1;57038:67:0;;;20920:21:1;20977:2;20957:18;;;20950:30;21016:34;20996:18;;;20989:62;-1:-1:-1;;;21067:18:1;;;21060:32;21109:19;;57038:67:0;20736:398:1;57038:67:0;9484:10;57121:30;;;;:16;:30;;;;;;;;57120:31;57112:68;;;;-1:-1:-1;;;57112:68:0;;21341:2:1;57112:68:0;;;21323:21:1;21380:2;21360:18;;;21353:30;21419:26;21399:18;;;21392:54;21463:18;;57112:68:0;21139:348:1;57112:68:0;57212:30;;-1:-1:-1;;9484:10:0;21641:2:1;21637:15;21633:53;57212:30:0;;;21621:66:1;57187:12:0;;21703::1;;57212:30:0;;;;;;;;;;;;57202:41;;;;;;57187:56;;57258:50;57277:12;;57258:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57291:10:0;;;-1:-1:-1;57303:4:0;;-1:-1:-1;57258:18:0;:50::i;:::-;57250:77;;;;-1:-1:-1;;;57250:77:0;;21928:2:1;57250:77:0;;;21910:21:1;21967:2;21947:18;;;21940:30;-1:-1:-1;;;21986:18:1;;;21979:44;22040:18;;57250:77:0;21726:338:1;57250:77:0;9484:10;57336:30;;;;:16;:30;;;;;:37;;-1:-1:-1;;57336:37:0;57369:4;57336:37;;;57380:36;;57404:11;57380:9;:36::i;58572:339::-;58637:11;;58624:9;:24;58616:33;;;;;;58665:13;;;;58664:14;58656:44;;;;-1:-1:-1;;;58656:44:0;;22271:2:1;58656:44:0;;;22253:21:1;22310:2;22290:18;;;22283:30;-1:-1:-1;;;22329:18:1;;;22322:47;22386:18;;58656:44:0;22069:341:1;58656:44:0;58707:7;:33;;;;;;;-1:-1:-1;58707:33:0;;;;;;;-1:-1:-1;;;;;;58707:33:0;58728:10;58707:33;;;58747:14;:16;;;;;;:::i;:::-;;;;;;58787:9;58770:13;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;58808:24:0;;58821:10;2024:51:1;;58808:24:0;;2012:2:1;1997:18;58808:24:0;;;;;;;58863:11;;58845:14;;:29;58841:65;;58886:12;:10;:12::i;62372:122::-;10739:13;:11;:13::i;:::-;62455::::1;:33;62471:17:::0;62455:13;:33:::1;:::i;62915:144::-:0;10739:13;:11;:13::i;:::-;62990:27:::1;62997:20;;62990:27;:::i;:::-;63024:29;:20;63047:6:::0;;63024:29:::1;:::i;59102:70::-:0;59145:21;59156:9;59145:10;:21::i;62502:120::-;10739:13;:11;:13::i;:::-;62584:14:::1;:32;62601:15:::0;62584:14;:32:::1;:::i;11759:201::-:0;10739:13;:11;:13::i;:::-;-1:-1:-1;;;;;11848:22:0;::::1;11840:73;;;::::0;-1:-1:-1;;;11840:73:0;;22617:2:1;11840:73:0::1;::::0;::::1;22599:21:1::0;22656:2;22636:18;;;22629:30;22695:34;22675:18;;;22668:62;-1:-1:-1;;;22746:18:1;;;22739:36;22792:19;;11840:73:0::1;22415:402:1::0;11840:73:0::1;11924:28;11943:8;11924:18;:28::i;:::-;11759:201:::0;:::o;59178:237::-;59261:15;;59288:122;59312:8;:15;59308:1;:19;59288:122;;;59374:15;:28;59390:8;59399:1;59390:11;;;;;;;;:::i;:::-;;;;;;;59374:28;;;;;;;;;;;;59354:17;;:48;;;;:::i;:::-;59343:59;;;;:::i;:::-;;-1:-1:-1;59329:3:0;;;;:::i;:::-;;;;59288:122;;;;59178:237;;;:::o;55973:32::-;;;;;;;;;;;;33462:305;33564:4;-1:-1:-1;;;;;;33601:40:0;;-1:-1:-1;;;33601:40:0;;:105;;-1:-1:-1;;;;;;;33658:48:0;;-1:-1:-1;;;33658:48:0;33601:105;:158;;;-1:-1:-1;;;;;;;;;;26313:40:0;;;33723:36;26204:157;11018:132;10926:6;;-1:-1:-1;;;;;10926:6:0;9484:10;11082:23;11074:68;;;;-1:-1:-1;;;11074:68:0;;23024:2:1;11074:68:0;;;23006:21:1;;;23043:18;;;23036:30;23102:34;23082:18;;;23075:62;23154:18;;11074:68:0;22822:356:1;43877:135:0;39160:4;39184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39184:16:0;43951:53;;;;-1:-1:-1;;;43951:53:0;;15575:2:1;43951:53:0;;;15557:21:1;15614:2;15594:18;;;15587:30;-1:-1:-1;;;15633:18:1;;;15626:54;15697:18;;43951:53:0;15373:348:1;43156:174:0;43231:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43231:29:0;-1:-1:-1;;;;;43231:29:0;;;;;;;;:24;;43285:23;43231:24;43285:14;:23::i;:::-;-1:-1:-1;;;;;43276:46:0;;;;;;;;;;;43156:174;;:::o;39389:264::-;39482:4;39499:13;39515:23;39530:7;39515:14;:23::i;:::-;39499:39;;39568:5;-1:-1:-1;;;;;39557:16:0;:7;-1:-1:-1;;;;;39557:16:0;;:52;;;-1:-1:-1;;;;;;36492:25:0;;;36468:4;36492:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39577:32;39557:87;;;;39637:7;-1:-1:-1;;;;;39613:31:0;:20;39625:7;39613:11;:20::i;:::-;-1:-1:-1;;;;;39613:31:0;;39557:87;39549:96;39389:264;-1:-1:-1;;;;39389:264:0:o;42412:625::-;42571:4;-1:-1:-1;;;;;42544:31:0;:23;42559:7;42544:14;:23::i;:::-;-1:-1:-1;;;;;42544:31:0;;42536:81;;;;-1:-1:-1;;;42536:81:0;;23385:2:1;42536:81:0;;;23367:21:1;23424:2;23404:18;;;23397:30;23463:34;23443:18;;;23436:62;-1:-1:-1;;;23514:18:1;;;23507:35;23559:19;;42536:81:0;23183:401:1;42536:81:0;-1:-1:-1;;;;;42636:16:0;;42628:65;;;;-1:-1:-1;;;42628:65:0;;23791:2:1;42628:65:0;;;23773:21:1;23830:2;23810:18;;;23803:30;23869:34;23849:18;;;23842:62;-1:-1:-1;;;23920:18:1;;;23913:34;23964:19;;42628:65:0;23589:400:1;42628:65:0;42706:39;42727:4;42733:2;42737:7;42706:20;:39::i;:::-;42810:29;42827:1;42831:7;42810:8;:29::i;:::-;-1:-1:-1;;;;;42852:15:0;;;;;;:9;:15;;;;;:20;;42871:1;;42852:15;:20;;42871:1;;42852:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42883:13:0;;;;;;:9;:13;;;;;:18;;42900:1;;42883:13;:18;;42900:1;;42883:18;:::i;:::-;;;;-1:-1:-1;;42912:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42912:21:0;-1:-1:-1;;;;;42912:21:0;;;;;;;;;42951:27;;42912:16;;42951:27;;;;;;;35489:347;35419:417;;:::o;12120:191::-;12213:6;;;-1:-1:-1;;;;;12230:17:0;;;-1:-1:-1;;;;;;12230:17:0;;;;;;;12263:40;;12213:6;;;12230:17;12213:6;;12263:40;;12194:16;;12263:40;12183:128;12120:191;:::o;63886:765::-;63954:7;:14;63927:13;;63943:8;:6;:8::i;:::-;:25;;;;:::i;:::-;63927:41;;63979:14;64010:11;;63996;;:25;;;;:::i;:::-;63979:42;;64034:22;64059:7;64067:5;64059:14;;;;;;;;:::i;:::-;;;;;;;;;;64127:16;;-1:-1:-1;;;;;64059:14:0;;;;-1:-1:-1;64147:3:0;;64118:25;;:6;:25;:::i;:::-;64117:33;;;;:::i;:::-;64094:56;;64161:18;64209:3;64192:13;;64183:6;:22;;;;:::i;:::-;64182:30;;;;:::i;:::-;64161:51;-1:-1:-1;64223:17:0;64243:25;64161:51;64243:12;:25;:::i;:::-;64223:45;-1:-1:-1;64279:19:0;64301:18;64223:45;64301:6;:18;:::i;:::-;64279:40;;64332:24;64343:12;64332:10;:24::i;:::-;10926:6;;64367:37;;-1:-1:-1;;;;;10926:6:0;;;;64367:37;;;;;64393:10;;64367:37;;;;64393:10;10926:6;64367:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64415:28:0;;-1:-1:-1;;;;;64415:15:0;;;:28;;;;;64431:11;;64415:28;;;;64431:11;64415:15;:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64477:24:0;;;64499:1;64477:24;;;;;;;;;64467:34;;;:7;;:34;:::i;:::-;-1:-1:-1;64529:1:0;64512:14;:18;64548:25;;;-1:-1:-1;;;;;24311:32:1;;24293:51;;24375:2;24360:18;;24353:34;;;64548:25:0;;24266:18:1;64548:25:0;;;;;;;64584:11;:13;;;:11;:13;;;:::i;:::-;;;;;;64631:12;64608:19;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;63886:765:0:o;39995:110::-;40071:26;40081:2;40085:7;40071:26;;;;;;;;;;;;:9;:26::i;58917:179::-;59004:6;58986:15;;:24;;;;:::i;:::-;58968:15;:42;49463:10;:17;59038:22;;:6;:22;:::i;:::-;59017:17;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;59072:18:0;;2669:25:1;;;59072:18:0;;2657:2:1;2642:18;59072::0;;;;;;;58917:179;:::o;43473:315::-;43628:8;-1:-1:-1;;;;;43619:17:0;:5;-1:-1:-1;;;;;43619:17:0;;43611:55;;;;-1:-1:-1;;;43611:55:0;;24600:2:1;43611:55:0;;;24582:21:1;24639:2;24619:18;;;24612:30;24678:27;24658:18;;;24651:55;24723:18;;43611:55:0;24398:349:1;43611:55:0;-1:-1:-1;;;;;43677:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43677:46:0;;;;;;;;;;43739:41;;540::1;;;43739::0;;513:18:1;43739:41:0;;;;;;;43473:315;;;:::o;38469:313::-;38625:28;38635:4;38641:2;38645:7;38625:9;:28::i;:::-;38672:47;38695:4;38701:2;38705:7;38714:4;38672:22;:47::i;:::-;38664:110;;;;-1:-1:-1;;;38664:110:0;;;;;;;:::i;56691:102::-;56751:13;56780:7;56773:14;;;;;:::i;22355:723::-;22411:13;22632:5;22641:1;22632:10;22628:53;;-1:-1:-1;;22659:10:0;;;;;;;;;;;;-1:-1:-1;;;22659:10:0;;;;;22355:723::o;22628:53::-;22706:5;22691:12;22747:78;22754:9;;22747:78;;22780:8;;;;:::i;:::-;;-1:-1:-1;22803:10:0;;-1:-1:-1;22811:2:0;22803:10;;:::i;:::-;;;22747:78;;;22835:19;22867:6;22857:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22857:17:0;;22835:39;;22885:154;22892:10;;22885:154;;22919:11;22929:1;22919:11;;:::i;:::-;;-1:-1:-1;22988:10:0;22996:2;22988:5;:10;:::i;:::-;22975:24;;:2;:24;:::i;:::-;22962:39;;22945:6;22952;22945:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22945:56:0;;;;;;;;-1:-1:-1;23016:11:0;23025:2;23016:11;;:::i;:::-;;;22885:154;;1219:190;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;;1219:190;-1:-1:-1;;;;1219:190:0:o;50411:589::-;-1:-1:-1;;;;;50617:18:0;;50613:187;;50652:40;50684:7;51827:10;:17;;51800:24;;;;:15;:24;;;;;:44;;;51855:24;;;;;;;;;;;;51723:164;50652:40;50613:187;;;50722:2;-1:-1:-1;;;;;50714:10:0;:4;-1:-1:-1;;;;;50714:10:0;;50710:90;;50741:47;50774:4;50780:7;50741:32;:47::i;:::-;-1:-1:-1;;;;;50814:16:0;;50810:183;;50847:45;50884:7;50847:36;:45::i;50810:183::-;50920:4;-1:-1:-1;;;;;50914:10:0;:2;-1:-1:-1;;;;;50914:10:0;;50910:83;;50941:40;50969:2;50973:7;50941:27;:40::i;64659:147::-;64698:4;64753:16;64771:15;64788:7;64736:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64726:71;;;;;;64721:77;;64714:84;;64659:147;:::o;40332:319::-;40461:18;40467:2;40471:7;40461:5;:18::i;:::-;40512:53;40543:1;40547:2;40551:7;40560:4;40512:22;:53::i;:::-;40490:153;;;;-1:-1:-1;;;40490:153:0;;;;;;;:::i;44576:853::-;44730:4;-1:-1:-1;;;;;44751:13:0;;14900:19;:23;44747:675;;44787:71;;-1:-1:-1;;;44787:71:0;;-1:-1:-1;;;;;44787:36:0;;;;;:71;;9484:10;;44838:4;;44844:7;;44853:4;;44787:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44787:71:0;;;;;;;;-1:-1:-1;;44787:71:0;;;;;;;;;;;;:::i;:::-;;;44783:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45028:6;:13;45045:1;45028:18;45024:328;;45071:60;;-1:-1:-1;;;45071:60:0;;;;;;;:::i;45024:328::-;45302:6;45296:13;45287:6;45283:2;45279:15;45272:38;44783:584;-1:-1:-1;;;;;;44909:51:0;-1:-1:-1;;;44909:51:0;;-1:-1:-1;44902:58:0;;44747:675;-1:-1:-1;45406:4:0;44576:853;;;;;;:::o;2086:296::-;2169:7;2212:4;2169:7;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;2300:9;:33::i;:::-;2285:48;-1:-1:-1;2265:3:0;;;;:::i;:::-;;;;2227:118;;52514:988;52780:22;52830:1;52805:22;52822:4;52805:16;:22::i;:::-;:26;;;;:::i;:::-;52842:18;52863:26;;;:17;:26;;;;;;52780:51;;-1:-1:-1;52996:28:0;;;52992:328;;-1:-1:-1;;;;;53063:18:0;;53041:19;53063:18;;;:12;:18;;;;;;;;:34;;;;;;;;;53114:30;;;;;;:44;;;53231:30;;:17;:30;;;;;:43;;;52992:328;-1:-1:-1;53416:26:0;;;;:17;:26;;;;;;;;53409:33;;;-1:-1:-1;;;;;53460:18:0;;;;;:12;:18;;;;;:34;;;;;;;53453:41;52514:988::o;53797:1079::-;54075:10;:17;54050:22;;54075:21;;54095:1;;54075:21;:::i;:::-;54107:18;54128:24;;;:15;:24;;;;;;54501:10;:26;;54050:46;;-1:-1:-1;54128:24:0;;54050:46;;54501:26;;;;;;:::i;:::-;;;;;;;;;54479:48;;54565:11;54540:10;54551;54540:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;54645:28;;;:15;:28;;;;;;;:41;;;54817:24;;;;;54810:31;54852:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;53868:1008;;;53797:1079;:::o;51301:221::-;51386:14;51403:20;51420:2;51403:16;:20::i;:::-;-1:-1:-1;;;;;51434:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;51479:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;51301:221:0:o;40987:439::-;-1:-1:-1;;;;;41067:16:0;;41059:61;;;;-1:-1:-1;;;41059:61:0;;26996:2:1;41059:61:0;;;26978:21:1;;;27015:18;;;27008:30;27074:34;27054:18;;;27047:62;27126:18;;41059:61:0;26794:356:1;41059:61:0;39160:4;39184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39184:16:0;:30;41131:58;;;;-1:-1:-1;;;41131:58:0;;27357:2:1;41131:58:0;;;27339:21:1;27396:2;27376:18;;;27369:30;27435;27415:18;;;27408:58;27483:18;;41131:58:0;27155:352:1;41131:58:0;41202:45;41231:1;41235:2;41239:7;41202:20;:45::i;:::-;-1:-1:-1;;;;;41260:13:0;;;;;;:9;:13;;;;;:18;;41277:1;;41260:13;:18;;41277:1;;41260:18;:::i;:::-;;;;-1:-1:-1;;41289:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41289:21:0;-1:-1:-1;;;;;41289:21:0;;;;;;;;41328:33;;41289:16;;;41328:33;;41289:16;;41328:33;62339:21:::1;62268:98:::0;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8518:13;8612:15;;;8648:4;8641:15;;;8695:4;8679:21;;8383:51;;;-1:-1:-1;8518:13:0;8612:15;;;8648:4;8641:15;8695:4;8679:21;;;8293:149::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;686:60;592:160;;;:::o;757:180::-;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:258::-;1014:1;1024:113;1038:6;1035:1;1032:13;1024:113;;;1114:11;;;1108:18;1095:11;;;1088:39;1060:2;1053:10;1024:113;;;1155:6;1152:1;1149:13;1146:48;;;-1:-1:-1;;1190:1:1;1172:16;;1165:27;942:258::o;1205:::-;1247:3;1285:5;1279:12;1312:6;1307:3;1300:19;1328:63;1384:6;1377:4;1372:3;1368:14;1361:4;1354:5;1350:16;1328:63;:::i;:::-;1445:2;1424:15;-1:-1:-1;;1420:29:1;1411:39;;;;1452:4;1407:50;;1205:258;-1:-1:-1;;1205:258:1:o;1468:220::-;1617:2;1606:9;1599:21;1580:4;1637:45;1678:2;1667:9;1663:18;1655:6;1637:45;:::i;1693:180::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;-1:-1:-1;1844:23:1;;1693:180;-1:-1:-1;1693:180:1:o;2086:173::-;2154:20;;-1:-1:-1;;;;;2203:31:1;;2193:42;;2183:70;;2249:1;2246;2239:12;2264:254;2332:6;2340;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2432:29;2451:9;2432:29;:::i;:::-;2422:39;2508:2;2493:18;;;;2480:32;;-1:-1:-1;;;2264:254:1:o;2705:186::-;2764:6;2817:2;2805:9;2796:7;2792:23;2788:32;2785:52;;;2833:1;2830;2823:12;2785:52;2856:29;2875:9;2856:29;:::i;2896:328::-;2973:6;2981;2989;3042:2;3030:9;3021:7;3017:23;3013:32;3010:52;;;3058:1;3055;3048:12;3010:52;3081:29;3100:9;3081:29;:::i;:::-;3071:39;;3129:38;3163:2;3152:9;3148:18;3129:38;:::i;:::-;3119:48;;3214:2;3203:9;3199:18;3186:32;3176:42;;2896:328;;;;;:::o;3411:632::-;3582:2;3634:21;;;3704:13;;3607:18;;;3726:22;;;3553:4;;3582:2;3805:15;;;;3779:2;3764:18;;;3553:4;3848:169;3862:6;3859:1;3856:13;3848:169;;;3923:13;;3911:26;;3992:15;;;;3957:12;;;;3884:1;3877:9;3848:169;;;-1:-1:-1;4034:3:1;;3411:632;-1:-1:-1;;;;;;3411:632:1:o;4048:127::-;4109:10;4104:3;4100:20;4097:1;4090:31;4140:4;4137:1;4130:15;4164:4;4161:1;4154:15;4180:275;4251:2;4245:9;4316:2;4297:13;;-1:-1:-1;;4293:27:1;4281:40;;4351:18;4336:34;;4372:22;;;4333:62;4330:88;;;4398:18;;:::i;:::-;4434:2;4427:22;4180:275;;-1:-1:-1;4180:275:1:o;4460:407::-;4525:5;4559:18;4551:6;4548:30;4545:56;;;4581:18;;:::i;:::-;4619:57;4664:2;4643:15;;-1:-1:-1;;4639:29:1;4670:4;4635:40;4619:57;:::i;:::-;4610:66;;4699:6;4692:5;4685:21;4739:3;4730:6;4725:3;4721:16;4718:25;4715:45;;;4756:1;4753;4746:12;4715:45;4805:6;4800:3;4793:4;4786:5;4782:16;4769:43;4859:1;4852:4;4843:6;4836:5;4832:18;4828:29;4821:40;4460:407;;;;;:::o;4872:451::-;4941:6;4994:2;4982:9;4973:7;4969:23;4965:32;4962:52;;;5010:1;5007;5000:12;4962:52;5050:9;5037:23;5083:18;5075:6;5072:30;5069:50;;;5115:1;5112;5105:12;5069:50;5138:22;;5191:4;5183:13;;5179:27;-1:-1:-1;5169:55:1;;5220:1;5217;5210:12;5169:55;5243:74;5309:7;5304:2;5291:16;5286:2;5282;5278:11;5243:74;:::i;5328:946::-;5412:6;5443:2;5486;5474:9;5465:7;5461:23;5457:32;5454:52;;;5502:1;5499;5492:12;5454:52;5542:9;5529:23;5571:18;5612:2;5604:6;5601:14;5598:34;;;5628:1;5625;5618:12;5598:34;5666:6;5655:9;5651:22;5641:32;;5711:7;5704:4;5700:2;5696:13;5692:27;5682:55;;5733:1;5730;5723:12;5682:55;5769:2;5756:16;5791:2;5787;5784:10;5781:36;;;5797:18;;:::i;:::-;5843:2;5840:1;5836:10;5826:20;;5866:28;5890:2;5886;5882:11;5866:28;:::i;:::-;5928:15;;;5998:11;;;5994:20;;;5959:12;;;;6026:19;;;6023:39;;;6058:1;6055;6048:12;6023:39;6082:11;;;;6102:142;6118:6;6113:3;6110:15;6102:142;;;6184:17;;6172:30;;6135:12;;;;6222;;;;6102:142;;;6263:5;5328:946;-1:-1:-1;;;;;;;;5328:946:1:o;6279:674::-;6466:2;6518:21;;;6588:13;;6491:18;;;6610:22;;;6437:4;;6466:2;6689:15;;;;6663:2;6648:18;;;6437:4;6732:195;6746:6;6743:1;6740:13;6732:195;;;6811:13;;-1:-1:-1;;;;;6807:39:1;6795:52;;6902:15;;;;6867:12;;;;6843:1;6761:9;6732:195;;6958:254;7023:6;7031;7084:2;7072:9;7063:7;7059:23;7055:32;7052:52;;;7100:1;7097;7090:12;7052:52;7123:29;7142:9;7123:29;:::i;:::-;7113:39;;7171:35;7202:2;7191:9;7187:18;7171:35;:::i;:::-;7161:45;;6958:254;;;;;:::o;7217:667::-;7312:6;7320;7328;7336;7389:3;7377:9;7368:7;7364:23;7360:33;7357:53;;;7406:1;7403;7396:12;7357:53;7429:29;7448:9;7429:29;:::i;:::-;7419:39;;7477:38;7511:2;7500:9;7496:18;7477:38;:::i;:::-;7467:48;;7562:2;7551:9;7547:18;7534:32;7524:42;;7617:2;7606:9;7602:18;7589:32;7644:18;7636:6;7633:30;7630:50;;;7676:1;7673;7666:12;7630:50;7699:22;;7752:4;7744:13;;7740:27;-1:-1:-1;7730:55:1;;7781:1;7778;7771:12;7730:55;7804:74;7870:7;7865:2;7852:16;7847:2;7843;7839:11;7804:74;:::i;:::-;7794:84;;;7217:667;;;;;;;:::o;7889:367::-;7952:8;7962:6;8016:3;8009:4;8001:6;7997:17;7993:27;7983:55;;8034:1;8031;8024:12;7983:55;-1:-1:-1;8057:20:1;;8100:18;8089:30;;8086:50;;;8132:1;8129;8122:12;8086:50;8169:4;8161:6;8157:17;8145:29;;8229:3;8222:4;8212:6;8209:1;8205:14;8197:6;8193:27;8189:38;8186:47;8183:67;;;8246:1;8243;8236:12;8183:67;7889:367;;;;;:::o;8261:505::-;8356:6;8364;8372;8425:2;8413:9;8404:7;8400:23;8396:32;8393:52;;;8441:1;8438;8431:12;8393:52;8477:9;8464:23;8454:33;;8538:2;8527:9;8523:18;8510:32;8565:18;8557:6;8554:30;8551:50;;;8597:1;8594;8587:12;8551:50;8636:70;8698:7;8689:6;8678:9;8674:22;8636:70;:::i;:::-;8261:505;;8725:8;;-1:-1:-1;8610:96:1;;-1:-1:-1;;;;8261:505:1:o;8771:260::-;8839:6;8847;8900:2;8888:9;8879:7;8875:23;8871:32;8868:52;;;8916:1;8913;8906:12;8868:52;8939:29;8958:9;8939:29;:::i;:::-;8929:39;;8987:38;9021:2;9010:9;9006:18;8987:38;:::i;9036:437::-;9122:6;9130;9183:2;9171:9;9162:7;9158:23;9154:32;9151:52;;;9199:1;9196;9189:12;9151:52;9239:9;9226:23;9272:18;9264:6;9261:30;9258:50;;;9304:1;9301;9294:12;9258:50;9343:70;9405:7;9396:6;9385:9;9381:22;9343:70;:::i;:::-;9432:8;;9317:96;;-1:-1:-1;9036:437:1;-1:-1:-1;;;;9036:437:1:o;9702:380::-;9781:1;9777:12;;;;9824;;;9845:61;;9899:4;9891:6;9887:17;9877:27;;9845:61;9952:2;9944:6;9941:14;9921:18;9918:38;9915:161;;9998:10;9993:3;9989:20;9986:1;9979:31;10033:4;10030:1;10023:15;10061:4;10058:1;10051:15;10920:127;10981:10;10976:3;10972:20;10969:1;10962:31;11012:4;11009:1;11002:15;11036:4;11033:1;11026:15;11052:128;11092:3;11123:1;11119:6;11116:1;11113:13;11110:39;;;11129:18;;:::i;:::-;-1:-1:-1;11165:9:1;;11052:128::o;11185:135::-;11224:3;11245:17;;;11242:43;;11265:18;;:::i;:::-;-1:-1:-1;11312:1:1;11301:13;;11185:135::o;11325:410::-;11527:2;11509:21;;;11566:2;11546:18;;;11539:30;11605:34;11600:2;11585:18;;11578:62;-1:-1:-1;;;11671:2:1;11656:18;;11649:44;11725:3;11710:19;;11325:410::o;12152:127::-;12213:10;12208:3;12204:20;12201:1;12194:31;12244:4;12241:1;12234:15;12268:4;12265:1;12258:15;12284:125;12324:4;12352:1;12349;12346:8;12343:34;;;12357:18;;:::i;:::-;-1:-1:-1;12394:9:1;;12284:125::o;12953:545::-;13055:2;13050:3;13047:11;13044:448;;;13091:1;13116:5;13112:2;13105:17;13161:4;13157:2;13147:19;13231:2;13219:10;13215:19;13212:1;13208:27;13202:4;13198:38;13267:4;13255:10;13252:20;13249:47;;;-1:-1:-1;13290:4:1;13249:47;13345:2;13340:3;13336:12;13333:1;13329:20;13323:4;13319:31;13309:41;;13400:82;13418:2;13411:5;13408:13;13400:82;;;13463:17;;;13444:1;13433:13;13400:82;;;13404:3;;;12953:545;;;:::o;13674:1352::-;13800:3;13794:10;13827:18;13819:6;13816:30;13813:56;;;13849:18;;:::i;:::-;13878:97;13968:6;13928:38;13960:4;13954:11;13928:38;:::i;:::-;13922:4;13878:97;:::i;:::-;14030:4;;14094:2;14083:14;;14111:1;14106:663;;;;14813:1;14830:6;14827:89;;;-1:-1:-1;14882:19:1;;;14876:26;14827:89;-1:-1:-1;;13631:1:1;13627:11;;;13623:24;13619:29;13609:40;13655:1;13651:11;;;13606:57;14929:81;;14076:944;;14106:663;12900:1;12893:14;;;12937:4;12924:18;;-1:-1:-1;;14142:20:1;;;14260:236;14274:7;14271:1;14268:14;14260:236;;;14363:19;;;14357:26;14342:42;;14455:27;;;;14423:1;14411:14;;;;14290:19;;14260:236;;;14264:3;14524:6;14515:7;14512:19;14509:201;;;14585:19;;;14579:26;-1:-1:-1;;14668:1:1;14664:14;;;14680:3;14660:24;14656:37;14652:42;14637:58;14622:74;;14509:201;-1:-1:-1;;;;;14756:1:1;14740:14;;;14736:22;14723:36;;-1:-1:-1;13674:1352:1:o;18308:168::-;18348:7;18414:1;18410;18406:6;18402:14;18399:1;18396:21;18391:1;18384:9;18377:17;18373:45;18370:71;;;18421:18;;:::i;:::-;-1:-1:-1;18461:9:1;;18308:168::o;18828:127::-;18889:10;18884:3;18880:20;18877:1;18870:31;18920:4;18917:1;18910:15;18944:4;18941:1;18934:15;18960:120;19000:1;19026;19016:35;;19031:18;;:::i;:::-;-1:-1:-1;19065:9:1;;18960:120::o;19501:1230::-;19725:3;19763:6;19757:13;19789:4;19802:51;19846:6;19841:3;19836:2;19828:6;19824:15;19802:51;:::i;:::-;19916:13;;19875:16;;;;19938:55;19916:13;19875:16;19960:15;;;19938:55;:::i;:::-;20082:13;;20015:20;;;20055:1;;20120:36;20082:13;20120:36;:::i;:::-;20175:1;20192:18;;;20219:141;;;;20374:1;20369:337;;;;20185:521;;20219:141;-1:-1:-1;;20254:24:1;;20240:39;;20331:16;;20324:24;20310:39;;20299:51;;;-1:-1:-1;20219:141:1;;20369:337;20400:6;20397:1;20390:17;20448:2;20445:1;20435:16;20473:1;20487:169;20501:8;20498:1;20495:15;20487:169;;;20583:14;;20568:13;;;20561:37;20626:16;;;;20518:10;;20487:169;;;20491:3;;20687:8;20680:5;20676:20;20669:27;;20185:521;-1:-1:-1;20722:3:1;;19501:1230;-1:-1:-1;;;;;;;;;;19501:1230:1:o;23994:112::-;24026:1;24052;24042:35;;24057:18;;:::i;:::-;-1:-1:-1;24091:9:1;;23994:112::o;24752:414::-;24954:2;24936:21;;;24993:2;24973:18;;;24966:30;25032:34;25027:2;25012:18;;25005:62;-1:-1:-1;;;25098:2:1;25083:18;;25076:48;25156:3;25141:19;;24752:414::o;25171:738::-;25431:6;25426:3;25419:19;25401:3;25457:2;25489:6;25484:2;25479:3;25475:12;25468:28;25527:2;25522:3;25518:12;25559:6;25553:13;25608:6;25605:1;25598:17;25651:2;25648:1;25638:16;25672:1;25682:200;25696:6;25693:1;25690:13;25682:200;;;25763:13;;-1:-1:-1;;;;;25759:39:1;25745:54;;25821:14;;;;25795:1;25858:14;;;;25711:9;25682:200;;;-1:-1:-1;25898:5:1;;25171:738;-1:-1:-1;;;;;;;;25171:738:1:o;25914:489::-;-1:-1:-1;;;;;26183:15:1;;;26165:34;;26235:15;;26230:2;26215:18;;26208:43;26282:2;26267:18;;26260:34;;;26330:3;26325:2;26310:18;;26303:31;;;26108:4;;26351:46;;26377:19;;26369:6;26351:46;:::i;:::-;26343:54;25914:489;-1:-1:-1;;;;;;25914:489:1:o;26408:249::-;26477:6;26530:2;26518:9;26509:7;26505:23;26501:32;26498:52;;;26546:1;26543;26536:12;26498:52;26578:9;26572:16;26597:30;26621:5;26597:30;:::i;26662:127::-;26723:10;26718:3;26714:20;26711:1;26704:31;26754:4;26751:1;26744:15;26778:4;26775:1;26768:15
Swarm Source
ipfs://30a23ff862a3565ef9df6e0668f50c9c76365e2395c4dbdbf88ce212c124a0cf