ERC-721
Overview
Max Total Supply
1,444 LUMINALUNIVERSE
Holders
497
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 LUMINALUNIVERSELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LuminalUniverse
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-16 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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; } } // OpenZeppelin Contracts v4.4.0 (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); } // OpenZeppelin Contracts v4.4.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`, 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 be 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // OpenZeppelin Contracts v4.4.0 (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); } // OpenZeppelin Contracts v4.4.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 tokenId); /** * @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); } // OpenZeppelin Contracts v4.4.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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.0 (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; } } pragma solidity ^0.8.6; library Address { function isContract(address account) internal view returns (bool) { uint size; assembly { size := extcodesize(account) } return size > 0; } } // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPIs 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); } } pragma solidity ^0.8.7; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private _name; string private _symbol; // Mapping from token ID to owner address address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; 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 (uint) { require( owner != address(0), "ERC721: balance query for the zero address" ); uint count; for (uint i; i < _owners.length; ++i) { if (owner == _owners[i]) ++count; } return count; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); _owners.push(to); emit Transfer(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); _owners[tokenId] = address(0); emit Transfer(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 of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } pragma solidity ^0.8.7; /** * @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 but rips out the core of the gas-wasting processing that comes from OpenZeppelin. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { /** * @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-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < _owners.length, "ERC721Enumerable: global index out of bounds" ); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require( index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); uint count; for (uint i; i < _owners.length; i++) { if (owner == _owners[i]) { if (count == index) return i; else count++; } } revert("ERC721Enumerable: owner index out of bounds"); } } // OpenZeppelin Contracts v4.4.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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees 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. */ 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 Returns the rebuilt hash obtained by traversing a Merklee 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256( abi.encodePacked(computedHash, proofElement) ); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256( abi.encodePacked(proofElement, computedHash) ); } } return computedHash; } } pragma solidity ^0.8.11; pragma abicoder v2; contract LuminalUniverse is ERC721Enumerable, Ownable { using MerkleProof for bytes32[]; string public baseURI; mapping(address => bool) public whitelistAllowance; mapping(address => uint256)public genesisFreeClaimed; mapping(address => uint256) public genesisAllowance; mapping(address => uint256) public publicAllowance; bytes32 public allowlistMerkleRoot; bytes32 public genesisMerkleRoot; bool public whitelistSaleIsActive; bool public genesisSaleIsActive; bool public publicSaleIsActive; uint public constant MAX_TOKENS = 1445; uint public constant MAX_TOKEN_PER_TXN = 2; uint public constant TOKEN_PRICE = 0.04 ether; uint public constant maxAllowListSupply = 1001; uint public constant maxGenesisSupply = 445; uint public allowListMinted = 0; uint public genesisClaimMinted = 0; modifier blockContracts() { require(tx.origin == msg.sender, "No smart contracts are allowed"); _; } constructor() ERC721("Luminal Universe", "LUMINALUNIVERSE") { setAllowListRoot( 0x3435f0bb641e0f7bce96bd6096693a5e349d7ed4f3afe056f686639b0ecdfbea ); setGenesisRoot( 0xfe4954196fa78174190adcdc10c6d6bac285a4a4edefbd1823c878e174512264 ); setBaseURI( "ipfs://QmfYtu5ASZnfYdghiJTqYYN3maCVpuJPrvJRHbu3ZbkvZL/" ); } //withdraw function function withdraw() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Your balance is zero"); address localOwner = payable(msg.sender); (bool ownerSuccess, ) = localOwner.call{value: balance}(""); require(ownerSuccess, "Failed to send to Owner"); } //setBaseURI function setBaseURI(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } //flipWhitelistSale function flipWhiteListSaleState() external onlyOwner { whitelistSaleIsActive = !whitelistSaleIsActive; } //flipGenesisSale function flipGenesisSaleState() external onlyOwner { genesisSaleIsActive = !genesisSaleIsActive; } //flipPublicSale function flipPublicSaleState() external onlyOwner { publicSaleIsActive = !publicSaleIsActive; } //setAllowListRoot for allowlist function setAllowListRoot(bytes32 _root) public onlyOwner { allowlistMerkleRoot = _root; } //setGenesisRoot for genesis holder function setGenesisRoot(bytes32 _root) public onlyOwner { genesisMerkleRoot = _root; } //leaf for allowlist merkle root function _allowlistLeaf(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } //leaf for genesis merkle root function _genesisLeaf(address account, uint numberOfFreeClaims) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account, numberOfFreeClaims)); } //verify function for merkle root function _verify( bytes32 _leaf, bytes32[] memory _proof, bytes32 root ) internal pure returns (bool) { return MerkleProof.verify(_proof, root, _leaf); } //airdrop function airdrop(address _to, uint256 numberOfTokens) external onlyOwner { uint256 supply = totalSupply(); require( supply + numberOfTokens < MAX_TOKENS, "Purchase would exceed the max supply" ); for (uint256 i; i < numberOfTokens; i++) { _safeMint(_to, supply + i); } } //whitelistMint function whitelistMint(bytes32[] memory _proof) external payable blockContracts { uint supply = totalSupply(); require(whitelistSaleIsActive, "Whitelist sale is not active"); require( _verify(_allowlistLeaf(msg.sender), _proof, allowlistMerkleRoot), "You are not whitelisted" ); require( !whitelistAllowance[msg.sender], "You can only mint one for WL" ); require(allowListMinted + 1 < maxAllowListSupply, "Exceeds allowlist supply"); require(msg.value == TOKEN_PRICE, "Ether sent is not correct"); allowListMinted += 1; whitelistAllowance[msg.sender] = true; _mint(msg.sender, supply); } function genesisFreeClaim( uint _numberOfTokens, uint _numberOfFreeClaims, bytes32[] memory _proof ) external blockContracts { uint supply = totalSupply(); require( whitelistSaleIsActive, "Free uinverse claim for genesis is not active" ); require( _verify( _genesisLeaf(msg.sender, _numberOfFreeClaims), _proof, genesisMerkleRoot ), "You are not allowed to claim free universe" ); require( genesisFreeClaimed[msg.sender] + _numberOfTokens <= _numberOfFreeClaims, "Exceeds claim allowance" ); require( genesisClaimMinted + _numberOfTokens < maxGenesisSupply, "Claim would exceed max supply" ); genesisClaimMinted += _numberOfTokens; genesisFreeClaimed[msg.sender] += _numberOfTokens; for (uint i; i < _numberOfTokens; i++) { _mint(msg.sender, supply + i); } } function genesisMint( uint _numberOfTokens, uint _numberOfFreeClaims, bytes32[] memory _proof ) external payable blockContracts { uint supply = totalSupply(); require( genesisSaleIsActive, "Genesis sale to mint universe is not active" ); require( _verify( _genesisLeaf(msg.sender, _numberOfFreeClaims), _proof, genesisMerkleRoot ), "You are not allowed to mint for Stage 2" ); require( genesisAllowance[msg.sender] + _numberOfTokens <= MAX_TOKEN_PER_TXN, "Genesis holder can only mint 2 Universe per address" ); require( supply + _numberOfTokens < MAX_TOKENS, "Purchase would exceed max supply" ); require( msg.value == TOKEN_PRICE * _numberOfTokens, "Ether sent is not correct" ); genesisAllowance[msg.sender] += _numberOfTokens; for (uint i; i < _numberOfTokens; i++) { _mint(msg.sender, supply + i); } } function publicMint(uint _numberOfTokens) external payable blockContracts { uint supply = totalSupply(); require( publicSaleIsActive, "Public sale to mint uinverse is not active" ); require( _numberOfTokens <= MAX_TOKEN_PER_TXN, "For public mint only 2 token per transaction are allowed" ); require( publicAllowance[msg.sender] < MAX_TOKEN_PER_TXN, "You can only mint 2 max per wallet per address" ); require( supply + _numberOfTokens < MAX_TOKENS, "Purchase would exceed max supply" ); require( msg.value == TOKEN_PRICE * _numberOfTokens, "Ether sent is not correct" ); publicAllowance[msg.sender] += _numberOfTokens; for (uint i; i < _numberOfTokens; i++) { _mint(msg.sender, supply + i); } } //tokenURI for nft function tokenURI(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId), "Token does not exist"); return string(abi.encodePacked(baseURI, Strings.toString(_tokenId))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipGenesisSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhiteListSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisClaimMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_numberOfFreeClaims","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"genesisFreeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisFreeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_numberOfFreeClaims","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"genesisMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"genesisSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowListSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGenesisSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setAllowListRoot","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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setGenesisRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600e556000600f553480156200001b57600080fd5b50604080518082018252601081526f4c756d696e616c20556e69766572736560801b60208083019182528351808501909452600f84526e4c554d494e414c554e49564552534560881b9084015281519192916200007b916000916200028c565b508051620000919060019060208401906200028c565b505050620000ae620000a86200012e60201b60201c565b62000132565b620000d97f3435f0bb641e0f7bce96bd6096693a5e349d7ed4f3afe056f686639b0ecdfbea62000184565b620001047ffe4954196fa78174190adcdc10c6d6bac285a4a4edefbd1823c878e174512264620001d8565b620001286040518060600160405280603681526020016200318b6036913962000228565b6200036f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001d35760405162461bcd60e51b815260206004820181905260248201526000805160206200316b83398151915260448201526064015b60405180910390fd5b600b55565b6005546001600160a01b03163314620002235760405162461bcd60e51b815260206004820181905260248201526000805160206200316b8339815191526044820152606401620001ca565b600c55565b6005546001600160a01b03163314620002735760405162461bcd60e51b815260206004820181905260248201526000805160206200316b8339815191526044820152606401620001ca565b8051620002889060069060208401906200028c565b5050565b8280546200029a9062000332565b90600052602060002090601f016020900481019282620002be576000855562000309565b82601f10620002d957805160ff191683800117855562000309565b8280016001018555821562000309579182015b8281111562000309578251825591602001919060010190620002ec565b50620003179291506200031b565b5090565b5b808211156200031757600081556001016200031c565b600181811c908216806200034757607f821691505b602082108114156200036957634e487b7160e01b600052602260045260246000fd5b50919050565b612dec806200037f6000396000f3fe6080604052600436106102935760003560e01c80636c0360eb1161015a578063b88d4fde116100c1578063d2d8cb671161007a578063d2d8cb6714610792578063e985e9c5146107ad578063ed62900f146107f6578063f2fde38b1461080c578063f41c01001461082c578063f47c84c51461083f57600080fd5b8063b88d4fde146106cf578063bdeb7a85146106ef578063c6210e551461070f578063c87b56dd1461073c578063ca406bee1461075c578063cf5a13f61461077c57600080fd5b80638da5cb5b116101135780638da5cb5b1461063257806395d89b41146106505780639fd2076e14610665578063a10866ef1461067b578063a22cb46514610690578063a51068a7146106b057600080fd5b80636c0360eb1461058557806370a082311461059a578063715018a6146105ba578063842b83fa146105cf5780638ba4cc3c146105e55780638d1e2f9d1461060557600080fd5b80632db11544116101fe5780634f6ccce7116101b75780634f6ccce7146104e557806355f804b314610505578063634da63a146105255780636352211e1461053a57806363ed880a1461055a578063662111ae1461056f57600080fd5b80632db115441461043d5780632f745c5914610450578063372f657c146104705780633ccfd60b146104835780634089c7781461049857806342842e0e146104c557600080fd5b80630fcf2e75116102505780630fcf2e751461038e57806310b5454d146103ae578063162c2e42146103c857806318160ddd146103e857806323b872dd14610407578063293108e01461042757600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063084ec67c14610327578063095ea7b3146103575780630acc857414610379575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125dd565b610855565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610880565b6040516102c49190612659565b3480156102fb57600080fd5b5061030f61030a36600461266c565b610912565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102b86103423660046126a1565b60076020526000908152604090205460ff1681565b34801561036357600080fd5b506103776103723660046126bc565b61099f565b005b34801561038557600080fd5b50610377610ab5565b34801561039a57600080fd5b50600d546102b89062010000900460ff1681565b3480156103ba57600080fd5b50600d546102b89060ff1681565b3480156103d457600080fd5b506103776103e33660046127ad565b610af3565b3480156103f457600080fd5b506002545b6040519081526020016102c4565b34801561041357600080fd5b506103776104223660046127fd565b610d39565b34801561043357600080fd5b506103f9600b5481565b61037761044b36600461266c565b610d6a565b34801561045c57600080fd5b506103f961046b3660046126bc565b610fc8565b61037761047e366004612839565b61107b565b34801561048f57600080fd5b506103776112af565b3480156104a457600080fd5b506103f96104b33660046126a1565b60086020526000908152604090205481565b3480156104d157600080fd5b506103776104e03660046127fd565b6113b8565b3480156104f157600080fd5b506103f961050036600461266c565b6113d3565b34801561051157600080fd5b506103776105203660046128c6565b611440565b34801561053157600080fd5b506103f9600281565b34801561054657600080fd5b5061030f61055536600461266c565b61147d565b34801561056657600080fd5b50610377611509565b34801561057b57600080fd5b506103f9600c5481565b34801561059157600080fd5b506102e2611550565b3480156105a657600080fd5b506103f96105b53660046126a1565b6115de565b3480156105c657600080fd5b506103776116ac565b3480156105db57600080fd5b506103f96101bd81565b3480156105f157600080fd5b506103776106003660046126bc565b6116e2565b34801561061157600080fd5b506103f96106203660046126a1565b600a6020526000908152604090205481565b34801561063e57600080fd5b506005546001600160a01b031661030f565b34801561065c57600080fd5b506102e26117b5565b34801561067157600080fd5b506103f9600f5481565b34801561068757600080fd5b506103776117c4565b34801561069c57600080fd5b506103776106ab36600461290f565b61180d565b3480156106bc57600080fd5b50600d546102b890610100900460ff1681565b3480156106db57600080fd5b506103776106ea36600461294b565b6118d2565b3480156106fb57600080fd5b5061037761070a36600461266c565b611904565b34801561071b57600080fd5b506103f961072a3660046126a1565b60096020526000908152604090205481565b34801561074857600080fd5b506102e261075736600461266c565b611933565b34801561076857600080fd5b5061037761077736600461266c565b6119b3565b34801561078857600080fd5b506103f9600e5481565b34801561079e57600080fd5b506103f9668e1bc9bf04000081565b3480156107b957600080fd5b506102b86107c83660046129c7565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561080257600080fd5b506103f96103e981565b34801561081857600080fd5b506103776108273660046126a1565b6119e2565b61037761083a3660046127ad565b611a7d565b34801561084b57600080fd5b506103f96105a581565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a82611cdf565b92915050565b60606000805461088f906129fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906129fa565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091d82611d2f565b6109835760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006109aa8261147d565b9050806001600160a01b0316836001600160a01b03161415610a185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097a565b336001600160a01b0382161480610a345750610a3481336107c8565b610aa65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097a565b610ab08383611d79565b505050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b815260040161097a90612a35565b600d805460ff19811660ff90911615179055565b323314610b125760405162461bcd60e51b815260040161097a90612a6a565b6000610b1d60025490565b600d5490915060ff16610b885760405162461bcd60e51b815260206004820152602d60248201527f467265652075696e766572736520636c61696d20666f722067656e657369732060448201526c6973206e6f742061637469766560981b606482015260840161097a565b610b9e610b953385611de7565b83600c54611e2e565b610bfd5760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420616c6c6f77656420746f20636c61696d206672656044820152696520756e69766572736560b01b606482015260840161097a565b336000908152600860205260409020548390610c1a908690612ab7565b1115610c685760405162461bcd60e51b815260206004820152601760248201527f4578636565647320636c61696d20616c6c6f77616e6365000000000000000000604482015260640161097a565b6101bd84600f54610c799190612ab7565b10610cc65760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20776f756c6420657863656564206d617820737570706c79000000604482015260640161097a565b83600f6000828254610cd89190612ab7565b90915550503360009081526008602052604081208054869290610cfc908490612ab7565b90915550600090505b84811015610d3257610d2033610d1b8385612ab7565b611e43565b80610d2a81612acf565b915050610d05565b5050505050565b610d433382611f6b565b610d5f5760405162461bcd60e51b815260040161097a90612aea565b610ab0838383612051565b323314610d895760405162461bcd60e51b815260040161097a90612a6a565b6000610d9460025490565b600d5490915062010000900460ff16610e025760405162461bcd60e51b815260206004820152602a60248201527f5075626c69632073616c6520746f206d696e742075696e7665727365206973206044820152696e6f742061637469766560b01b606482015260840161097a565b6002821115610e795760405162461bcd60e51b815260206004820152603860248201527f466f72207075626c6963206d696e74206f6e6c79203220746f6b656e2070657260448201527f207472616e73616374696f6e2061726520616c6c6f7765640000000000000000606482015260840161097a565b336000908152600a6020526040902054600211610eef5760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e206f6e6c79206d696e742032206d6178207065722077616c6c60448201526d657420706572206164647265737360901b606482015260840161097a565b6105a5610efc8383612ab7565b10610f495760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b610f5a82668e1bc9bf040000612b3b565b3414610f785760405162461bcd60e51b815260040161097a90612b5a565b336000908152600a602052604081208054849290610f97908490612ab7565b90915550600090505b82811015610ab057610fb633610d1b8385612ab7565b80610fc081612acf565b915050610fa0565b6000610fd3836115de565b8210610ff15760405162461bcd60e51b815260040161097a90612b91565b6000805b600254811015611062576002818154811061101257611012612bdc565b6000918252602090912001546001600160a01b0386811691161415611050578382141561104257915061087a9050565b8161104c81612acf565b9250505b8061105a81612acf565b915050610ff5565b5060405162461bcd60e51b815260040161097a90612b91565b32331461109a5760405162461bcd60e51b815260040161097a90612a6a565b60006110a560025490565b600d5490915060ff166110fa5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f742061637469766500000000604482015260640161097a565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113e9083600b54611e2e565b61118a5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604482015260640161097a565b3360009081526007602052604090205460ff16156111ea5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206f6e6c79206d696e74206f6e6520666f7220574c00000000604482015260640161097a565b6103e9600e5460016111fc9190612ab7565b106112495760405162461bcd60e51b815260206004820152601860248201527f4578636565647320616c6c6f776c69737420737570706c790000000000000000604482015260640161097a565b668e1bc9bf040000341461126f5760405162461bcd60e51b815260040161097a90612b5a565b6001600e60008282546112829190612ab7565b9091555050336000818152600760205260409020805460ff191660011790556112ab9082611e43565b5050565b6005546001600160a01b031633146112d95760405162461bcd60e51b815260040161097a90612a35565b478061131e5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b604482015260640161097a565b6040513390600090829084908381818185875af1925050503d8060008114611362576040519150601f19603f3d011682016040523d82523d6000602084013e611367565b606091505b5050905080610ab05760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2073656e6420746f204f776e6572000000000000000000604482015260640161097a565b610ab0838383604051806020016040528060008152506118d2565b600254600090821061143c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161097a565b5090565b6005546001600160a01b0316331461146a5760405162461bcd60e51b815260040161097a90612a35565b80516112ab906006906020840190612537565b6000806002838154811061149357611493612bdc565b6000918252602090912001546001600160a01b031690508061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097a565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161097a90612a35565b600d805461ff001981166101009182900460ff1615909102179055565b6006805461155d906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611589906129fa565b80156115d65780601f106115ab576101008083540402835291602001916115d6565b820191906000526020600020905b8154815290600101906020018083116115b957829003601f168201915b505050505081565b60006001600160a01b0382166116495760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097a565b6000805b6002548110156116a5576002818154811061166a5761166a612bdc565b6000918252602090912001546001600160a01b03858116911614156116955761169282612acf565b91505b61169e81612acf565b905061164d565b5092915050565b6005546001600160a01b031633146116d65760405162461bcd60e51b815260040161097a90612a35565b6116e060006121a7565b565b6005546001600160a01b0316331461170c5760405162461bcd60e51b815260040161097a90612a35565b600061171760025490565b90506105a56117268383612ab7565b1061177f5760405162461bcd60e51b8152602060048201526024808201527f507572636861736520776f756c642065786365656420746865206d617820737560448201526370706c7960e01b606482015260840161097a565b60005b828110156117af5761179d846117988385612ab7565b6121f9565b806117a781612acf565b915050611782565b50505050565b60606001805461088f906129fa565b6005546001600160a01b031633146117ee5760405162461bcd60e51b815260040161097a90612a35565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118dc3383611f6b565b6118f85760405162461bcd60e51b815260040161097a90612aea565b6117af84848484612213565b6005546001600160a01b0316331461192e5760405162461bcd60e51b815260040161097a90612a35565b600b55565b606061193e82611d2f565b6119815760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161097a565b600661198c83612246565b60405160200161199d929190612c0e565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146119dd5760405162461bcd60e51b815260040161097a90612a35565b600c55565b6005546001600160a01b03163314611a0c5760405162461bcd60e51b815260040161097a90612a35565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b611a7a816121a7565b50565b323314611a9c5760405162461bcd60e51b815260040161097a90612a6a565b6000611aa760025490565b600d54909150610100900460ff16611b155760405162461bcd60e51b815260206004820152602b60248201527f47656e657369732073616c6520746f206d696e7420756e69766572736520697360448201526a206e6f742061637469766560a81b606482015260840161097a565b611b22610b953385611de7565b611b7e5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060448201526629ba30b3b2901960c91b606482015260840161097a565b33600090815260096020526040902054600290611b9c908690612ab7565b1115611c065760405162461bcd60e51b815260206004820152603360248201527f47656e6573697320686f6c6465722063616e206f6e6c79206d696e74203220556044820152726e69766572736520706572206164647265737360681b606482015260840161097a565b6105a5611c138583612ab7565b10611c605760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b611c7184668e1bc9bf040000612b3b565b3414611c8f5760405162461bcd60e51b815260040161097a90612b5a565b3360009081526009602052604081208054869290611cae908490612ab7565b90915550600090505b84811015610d3257611ccd33610d1b8385612ab7565b80611cd781612acf565b915050611cb7565b60006001600160e01b031982166380ac58cd60e01b1480611d1057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b6002546000908210801561087a575060006001600160a01b031660028381548110611d5c57611d5c612bdc565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dae8261147d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6000611e3b838386612344565b949350505050565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097a565b611ea281611d2f565b15611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097a565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611f7682611d2f565b611fd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097a565b6000611fe28361147d565b9050806001600160a01b0316846001600160a01b0316148061201d5750836001600160a01b031661201284610912565b6001600160a01b0316145b80611e3b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16611e3b565b826001600160a01b03166120648261147d565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097a565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b612139600082611d79565b816002828154811061214d5761214d612bdc565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112ab82826040518060200160405280600081525061235a565b61221e848484612051565b61222a8484848461238d565b6117af5760405162461bcd60e51b815260040161097a90612cb5565b60608161226a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612294578061227e81612acf565b915061228d9050600a83612d1d565b915061226e565b60008167ffffffffffffffff8111156122af576122af6126e6565b6040519080825280601f01601f1916602001820160405280156122d9576020820181803683370190505b5090505b8415611e3b576122ee600183612d31565b91506122fb600a86612d48565b612306906030612ab7565b60f81b81838151811061231b5761231b612bdc565b60200101906001600160f81b031916908160001a90535061233d600a86612d1d565b94506122dd565b600082612351858461248b565b14949350505050565b6123648383611e43565b612371600084848461238d565b610ab05760405162461bcd60e51b815260040161097a90612cb5565b60006001600160a01b0384163b1561248057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123d1903390899088908890600401612d5c565b6020604051808303816000875af192505050801561240c575060408051601f3d908101601f1916820190925261240991810190612d99565b60015b612466573d80801561243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b50805161245e5760405162461bcd60e51b815260040161097a90612cb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3b565b506001949350505050565b600081815b845181101561252f5760008582815181106124ad576124ad612bdc565b602002602001015190508083116124ef57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061251c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252781612acf565b915050612490565b509392505050565b828054612543906129fa565b90600052602060002090601f01602090048101928261256557600085556125ab565b82601f1061257e57805160ff19168380011785556125ab565b828001600101855582156125ab579182015b828111156125ab578251825591602001919060010190612590565b5061143c9291505b8082111561143c57600081556001016125b3565b6001600160e01b031981168114611a7a57600080fd5b6000602082840312156125ef57600080fd5b81356125fa816125c7565b9392505050565b60005b8381101561261c578181015183820152602001612604565b838111156117af5750506000910152565b60008151808452612645816020860160208601612601565b601f01601f19169290920160200192915050565b6020815260006125fa602083018461262d565b60006020828403121561267e57600080fd5b5035919050565b80356001600160a01b038116811461269c57600080fd5b919050565b6000602082840312156126b357600080fd5b6125fa82612685565b600080604083850312156126cf57600080fd5b6126d883612685565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612725576127256126e6565b604052919050565b600082601f83011261273e57600080fd5b8135602067ffffffffffffffff82111561275a5761275a6126e6565b8160051b6127698282016126fc565b928352848101820192828101908785111561278357600080fd5b83870192505b848310156127a257823582529183019190830190612789565b979650505050505050565b6000806000606084860312156127c257600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156127e757600080fd5b6127f38682870161272d565b9150509250925092565b60008060006060848603121561281257600080fd5b61281b84612685565b925061282960208501612685565b9150604084013590509250925092565b60006020828403121561284b57600080fd5b813567ffffffffffffffff81111561286257600080fd5b611e3b8482850161272d565b600067ffffffffffffffff831115612888576128886126e6565b61289b601f8401601f19166020016126fc565b90508281528383830111156128af57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128d857600080fd5b813567ffffffffffffffff8111156128ef57600080fd5b8201601f8101841361290057600080fd5b611e3b8482356020840161286e565b6000806040838503121561292257600080fd5b61292b83612685565b91506020830135801515811461294057600080fd5b809150509250929050565b6000806000806080858703121561296157600080fd5b61296a85612685565b935061297860208601612685565b925060408501359150606085013567ffffffffffffffff81111561299b57600080fd5b8501601f810187136129ac57600080fd5b6129bb8782356020840161286e565b91505092959194509250565b600080604083850312156129da57600080fd5b6129e383612685565b91506129f160208401612685565b90509250929050565b600181811c90821680612a0e57607f821691505b60208210811415612a2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f4e6f20736d61727420636f6e7472616374732061726520616c6c6f7765640000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aca57612aca612aa1565b500190565b6000600019821415612ae357612ae3612aa1565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615612b5557612b55612aa1565b500290565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008151612c04818560208601612601565b9290920192915050565b600080845481600182811c915080831680612c2a57607f831692505b6020808410821415612c4a57634e487b7160e01b86526022600452602486fd5b818015612c5e5760018114612c6f57612c9c565b60ff19861689528489019650612c9c565b60008b81526020902060005b86811015612c945781548b820152908501908301612c7b565b505084890196505b505050505050612cac8185612bf2565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d2c57612d2c612d07565b500490565b600082821015612d4357612d43612aa1565b500390565b600082612d5757612d57612d07565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d8f9083018461262d565b9695505050505050565b600060208284031215612dab57600080fd5b81516125fa816125c756fea264697066735822122020b0e994b7a562204581b33a6dbedd27a9cfac74fd4abcae33a6f2741ea2411564736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572697066733a2f2f516d665974753541535a6e6659646768694a547159594e336d61435670754a5072764a52486275335a626b765a4c2f
Deployed Bytecode
0x6080604052600436106102935760003560e01c80636c0360eb1161015a578063b88d4fde116100c1578063d2d8cb671161007a578063d2d8cb6714610792578063e985e9c5146107ad578063ed62900f146107f6578063f2fde38b1461080c578063f41c01001461082c578063f47c84c51461083f57600080fd5b8063b88d4fde146106cf578063bdeb7a85146106ef578063c6210e551461070f578063c87b56dd1461073c578063ca406bee1461075c578063cf5a13f61461077c57600080fd5b80638da5cb5b116101135780638da5cb5b1461063257806395d89b41146106505780639fd2076e14610665578063a10866ef1461067b578063a22cb46514610690578063a51068a7146106b057600080fd5b80636c0360eb1461058557806370a082311461059a578063715018a6146105ba578063842b83fa146105cf5780638ba4cc3c146105e55780638d1e2f9d1461060557600080fd5b80632db11544116101fe5780634f6ccce7116101b75780634f6ccce7146104e557806355f804b314610505578063634da63a146105255780636352211e1461053a57806363ed880a1461055a578063662111ae1461056f57600080fd5b80632db115441461043d5780632f745c5914610450578063372f657c146104705780633ccfd60b146104835780634089c7781461049857806342842e0e146104c557600080fd5b80630fcf2e75116102505780630fcf2e751461038e57806310b5454d146103ae578063162c2e42146103c857806318160ddd146103e857806323b872dd14610407578063293108e01461042757600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063084ec67c14610327578063095ea7b3146103575780630acc857414610379575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125dd565b610855565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610880565b6040516102c49190612659565b3480156102fb57600080fd5b5061030f61030a36600461266c565b610912565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102b86103423660046126a1565b60076020526000908152604090205460ff1681565b34801561036357600080fd5b506103776103723660046126bc565b61099f565b005b34801561038557600080fd5b50610377610ab5565b34801561039a57600080fd5b50600d546102b89062010000900460ff1681565b3480156103ba57600080fd5b50600d546102b89060ff1681565b3480156103d457600080fd5b506103776103e33660046127ad565b610af3565b3480156103f457600080fd5b506002545b6040519081526020016102c4565b34801561041357600080fd5b506103776104223660046127fd565b610d39565b34801561043357600080fd5b506103f9600b5481565b61037761044b36600461266c565b610d6a565b34801561045c57600080fd5b506103f961046b3660046126bc565b610fc8565b61037761047e366004612839565b61107b565b34801561048f57600080fd5b506103776112af565b3480156104a457600080fd5b506103f96104b33660046126a1565b60086020526000908152604090205481565b3480156104d157600080fd5b506103776104e03660046127fd565b6113b8565b3480156104f157600080fd5b506103f961050036600461266c565b6113d3565b34801561051157600080fd5b506103776105203660046128c6565b611440565b34801561053157600080fd5b506103f9600281565b34801561054657600080fd5b5061030f61055536600461266c565b61147d565b34801561056657600080fd5b50610377611509565b34801561057b57600080fd5b506103f9600c5481565b34801561059157600080fd5b506102e2611550565b3480156105a657600080fd5b506103f96105b53660046126a1565b6115de565b3480156105c657600080fd5b506103776116ac565b3480156105db57600080fd5b506103f96101bd81565b3480156105f157600080fd5b506103776106003660046126bc565b6116e2565b34801561061157600080fd5b506103f96106203660046126a1565b600a6020526000908152604090205481565b34801561063e57600080fd5b506005546001600160a01b031661030f565b34801561065c57600080fd5b506102e26117b5565b34801561067157600080fd5b506103f9600f5481565b34801561068757600080fd5b506103776117c4565b34801561069c57600080fd5b506103776106ab36600461290f565b61180d565b3480156106bc57600080fd5b50600d546102b890610100900460ff1681565b3480156106db57600080fd5b506103776106ea36600461294b565b6118d2565b3480156106fb57600080fd5b5061037761070a36600461266c565b611904565b34801561071b57600080fd5b506103f961072a3660046126a1565b60096020526000908152604090205481565b34801561074857600080fd5b506102e261075736600461266c565b611933565b34801561076857600080fd5b5061037761077736600461266c565b6119b3565b34801561078857600080fd5b506103f9600e5481565b34801561079e57600080fd5b506103f9668e1bc9bf04000081565b3480156107b957600080fd5b506102b86107c83660046129c7565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561080257600080fd5b506103f96103e981565b34801561081857600080fd5b506103776108273660046126a1565b6119e2565b61037761083a3660046127ad565b611a7d565b34801561084b57600080fd5b506103f96105a581565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a82611cdf565b92915050565b60606000805461088f906129fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906129fa565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091d82611d2f565b6109835760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006109aa8261147d565b9050806001600160a01b0316836001600160a01b03161415610a185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097a565b336001600160a01b0382161480610a345750610a3481336107c8565b610aa65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097a565b610ab08383611d79565b505050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b815260040161097a90612a35565b600d805460ff19811660ff90911615179055565b323314610b125760405162461bcd60e51b815260040161097a90612a6a565b6000610b1d60025490565b600d5490915060ff16610b885760405162461bcd60e51b815260206004820152602d60248201527f467265652075696e766572736520636c61696d20666f722067656e657369732060448201526c6973206e6f742061637469766560981b606482015260840161097a565b610b9e610b953385611de7565b83600c54611e2e565b610bfd5760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420616c6c6f77656420746f20636c61696d206672656044820152696520756e69766572736560b01b606482015260840161097a565b336000908152600860205260409020548390610c1a908690612ab7565b1115610c685760405162461bcd60e51b815260206004820152601760248201527f4578636565647320636c61696d20616c6c6f77616e6365000000000000000000604482015260640161097a565b6101bd84600f54610c799190612ab7565b10610cc65760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20776f756c6420657863656564206d617820737570706c79000000604482015260640161097a565b83600f6000828254610cd89190612ab7565b90915550503360009081526008602052604081208054869290610cfc908490612ab7565b90915550600090505b84811015610d3257610d2033610d1b8385612ab7565b611e43565b80610d2a81612acf565b915050610d05565b5050505050565b610d433382611f6b565b610d5f5760405162461bcd60e51b815260040161097a90612aea565b610ab0838383612051565b323314610d895760405162461bcd60e51b815260040161097a90612a6a565b6000610d9460025490565b600d5490915062010000900460ff16610e025760405162461bcd60e51b815260206004820152602a60248201527f5075626c69632073616c6520746f206d696e742075696e7665727365206973206044820152696e6f742061637469766560b01b606482015260840161097a565b6002821115610e795760405162461bcd60e51b815260206004820152603860248201527f466f72207075626c6963206d696e74206f6e6c79203220746f6b656e2070657260448201527f207472616e73616374696f6e2061726520616c6c6f7765640000000000000000606482015260840161097a565b336000908152600a6020526040902054600211610eef5760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e206f6e6c79206d696e742032206d6178207065722077616c6c60448201526d657420706572206164647265737360901b606482015260840161097a565b6105a5610efc8383612ab7565b10610f495760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b610f5a82668e1bc9bf040000612b3b565b3414610f785760405162461bcd60e51b815260040161097a90612b5a565b336000908152600a602052604081208054849290610f97908490612ab7565b90915550600090505b82811015610ab057610fb633610d1b8385612ab7565b80610fc081612acf565b915050610fa0565b6000610fd3836115de565b8210610ff15760405162461bcd60e51b815260040161097a90612b91565b6000805b600254811015611062576002818154811061101257611012612bdc565b6000918252602090912001546001600160a01b0386811691161415611050578382141561104257915061087a9050565b8161104c81612acf565b9250505b8061105a81612acf565b915050610ff5565b5060405162461bcd60e51b815260040161097a90612b91565b32331461109a5760405162461bcd60e51b815260040161097a90612a6a565b60006110a560025490565b600d5490915060ff166110fa5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f742061637469766500000000604482015260640161097a565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113e9083600b54611e2e565b61118a5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604482015260640161097a565b3360009081526007602052604090205460ff16156111ea5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206f6e6c79206d696e74206f6e6520666f7220574c00000000604482015260640161097a565b6103e9600e5460016111fc9190612ab7565b106112495760405162461bcd60e51b815260206004820152601860248201527f4578636565647320616c6c6f776c69737420737570706c790000000000000000604482015260640161097a565b668e1bc9bf040000341461126f5760405162461bcd60e51b815260040161097a90612b5a565b6001600e60008282546112829190612ab7565b9091555050336000818152600760205260409020805460ff191660011790556112ab9082611e43565b5050565b6005546001600160a01b031633146112d95760405162461bcd60e51b815260040161097a90612a35565b478061131e5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b604482015260640161097a565b6040513390600090829084908381818185875af1925050503d8060008114611362576040519150601f19603f3d011682016040523d82523d6000602084013e611367565b606091505b5050905080610ab05760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2073656e6420746f204f776e6572000000000000000000604482015260640161097a565b610ab0838383604051806020016040528060008152506118d2565b600254600090821061143c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161097a565b5090565b6005546001600160a01b0316331461146a5760405162461bcd60e51b815260040161097a90612a35565b80516112ab906006906020840190612537565b6000806002838154811061149357611493612bdc565b6000918252602090912001546001600160a01b031690508061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097a565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161097a90612a35565b600d805461ff001981166101009182900460ff1615909102179055565b6006805461155d906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611589906129fa565b80156115d65780601f106115ab576101008083540402835291602001916115d6565b820191906000526020600020905b8154815290600101906020018083116115b957829003601f168201915b505050505081565b60006001600160a01b0382166116495760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097a565b6000805b6002548110156116a5576002818154811061166a5761166a612bdc565b6000918252602090912001546001600160a01b03858116911614156116955761169282612acf565b91505b61169e81612acf565b905061164d565b5092915050565b6005546001600160a01b031633146116d65760405162461bcd60e51b815260040161097a90612a35565b6116e060006121a7565b565b6005546001600160a01b0316331461170c5760405162461bcd60e51b815260040161097a90612a35565b600061171760025490565b90506105a56117268383612ab7565b1061177f5760405162461bcd60e51b8152602060048201526024808201527f507572636861736520776f756c642065786365656420746865206d617820737560448201526370706c7960e01b606482015260840161097a565b60005b828110156117af5761179d846117988385612ab7565b6121f9565b806117a781612acf565b915050611782565b50505050565b60606001805461088f906129fa565b6005546001600160a01b031633146117ee5760405162461bcd60e51b815260040161097a90612a35565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118dc3383611f6b565b6118f85760405162461bcd60e51b815260040161097a90612aea565b6117af84848484612213565b6005546001600160a01b0316331461192e5760405162461bcd60e51b815260040161097a90612a35565b600b55565b606061193e82611d2f565b6119815760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161097a565b600661198c83612246565b60405160200161199d929190612c0e565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146119dd5760405162461bcd60e51b815260040161097a90612a35565b600c55565b6005546001600160a01b03163314611a0c5760405162461bcd60e51b815260040161097a90612a35565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b611a7a816121a7565b50565b323314611a9c5760405162461bcd60e51b815260040161097a90612a6a565b6000611aa760025490565b600d54909150610100900460ff16611b155760405162461bcd60e51b815260206004820152602b60248201527f47656e657369732073616c6520746f206d696e7420756e69766572736520697360448201526a206e6f742061637469766560a81b606482015260840161097a565b611b22610b953385611de7565b611b7e5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060448201526629ba30b3b2901960c91b606482015260840161097a565b33600090815260096020526040902054600290611b9c908690612ab7565b1115611c065760405162461bcd60e51b815260206004820152603360248201527f47656e6573697320686f6c6465722063616e206f6e6c79206d696e74203220556044820152726e69766572736520706572206164647265737360681b606482015260840161097a565b6105a5611c138583612ab7565b10611c605760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b611c7184668e1bc9bf040000612b3b565b3414611c8f5760405162461bcd60e51b815260040161097a90612b5a565b3360009081526009602052604081208054869290611cae908490612ab7565b90915550600090505b84811015610d3257611ccd33610d1b8385612ab7565b80611cd781612acf565b915050611cb7565b60006001600160e01b031982166380ac58cd60e01b1480611d1057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b6002546000908210801561087a575060006001600160a01b031660028381548110611d5c57611d5c612bdc565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dae8261147d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6000611e3b838386612344565b949350505050565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097a565b611ea281611d2f565b15611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097a565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611f7682611d2f565b611fd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097a565b6000611fe28361147d565b9050806001600160a01b0316846001600160a01b0316148061201d5750836001600160a01b031661201284610912565b6001600160a01b0316145b80611e3b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16611e3b565b826001600160a01b03166120648261147d565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097a565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b612139600082611d79565b816002828154811061214d5761214d612bdc565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112ab82826040518060200160405280600081525061235a565b61221e848484612051565b61222a8484848461238d565b6117af5760405162461bcd60e51b815260040161097a90612cb5565b60608161226a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612294578061227e81612acf565b915061228d9050600a83612d1d565b915061226e565b60008167ffffffffffffffff8111156122af576122af6126e6565b6040519080825280601f01601f1916602001820160405280156122d9576020820181803683370190505b5090505b8415611e3b576122ee600183612d31565b91506122fb600a86612d48565b612306906030612ab7565b60f81b81838151811061231b5761231b612bdc565b60200101906001600160f81b031916908160001a90535061233d600a86612d1d565b94506122dd565b600082612351858461248b565b14949350505050565b6123648383611e43565b612371600084848461238d565b610ab05760405162461bcd60e51b815260040161097a90612cb5565b60006001600160a01b0384163b1561248057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123d1903390899088908890600401612d5c565b6020604051808303816000875af192505050801561240c575060408051601f3d908101601f1916820190925261240991810190612d99565b60015b612466573d80801561243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b50805161245e5760405162461bcd60e51b815260040161097a90612cb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3b565b506001949350505050565b600081815b845181101561252f5760008582815181106124ad576124ad612bdc565b602002602001015190508083116124ef57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061251c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252781612acf565b915050612490565b509392505050565b828054612543906129fa565b90600052602060002090601f01602090048101928261256557600085556125ab565b82601f1061257e57805160ff19168380011785556125ab565b828001600101855582156125ab579182015b828111156125ab578251825591602001919060010190612590565b5061143c9291505b8082111561143c57600081556001016125b3565b6001600160e01b031981168114611a7a57600080fd5b6000602082840312156125ef57600080fd5b81356125fa816125c7565b9392505050565b60005b8381101561261c578181015183820152602001612604565b838111156117af5750506000910152565b60008151808452612645816020860160208601612601565b601f01601f19169290920160200192915050565b6020815260006125fa602083018461262d565b60006020828403121561267e57600080fd5b5035919050565b80356001600160a01b038116811461269c57600080fd5b919050565b6000602082840312156126b357600080fd5b6125fa82612685565b600080604083850312156126cf57600080fd5b6126d883612685565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612725576127256126e6565b604052919050565b600082601f83011261273e57600080fd5b8135602067ffffffffffffffff82111561275a5761275a6126e6565b8160051b6127698282016126fc565b928352848101820192828101908785111561278357600080fd5b83870192505b848310156127a257823582529183019190830190612789565b979650505050505050565b6000806000606084860312156127c257600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156127e757600080fd5b6127f38682870161272d565b9150509250925092565b60008060006060848603121561281257600080fd5b61281b84612685565b925061282960208501612685565b9150604084013590509250925092565b60006020828403121561284b57600080fd5b813567ffffffffffffffff81111561286257600080fd5b611e3b8482850161272d565b600067ffffffffffffffff831115612888576128886126e6565b61289b601f8401601f19166020016126fc565b90508281528383830111156128af57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128d857600080fd5b813567ffffffffffffffff8111156128ef57600080fd5b8201601f8101841361290057600080fd5b611e3b8482356020840161286e565b6000806040838503121561292257600080fd5b61292b83612685565b91506020830135801515811461294057600080fd5b809150509250929050565b6000806000806080858703121561296157600080fd5b61296a85612685565b935061297860208601612685565b925060408501359150606085013567ffffffffffffffff81111561299b57600080fd5b8501601f810187136129ac57600080fd5b6129bb8782356020840161286e565b91505092959194509250565b600080604083850312156129da57600080fd5b6129e383612685565b91506129f160208401612685565b90509250929050565b600181811c90821680612a0e57607f821691505b60208210811415612a2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f4e6f20736d61727420636f6e7472616374732061726520616c6c6f7765640000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aca57612aca612aa1565b500190565b6000600019821415612ae357612ae3612aa1565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615612b5557612b55612aa1565b500290565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008151612c04818560208601612601565b9290920192915050565b600080845481600182811c915080831680612c2a57607f831692505b6020808410821415612c4a57634e487b7160e01b86526022600452602486fd5b818015612c5e5760018114612c6f57612c9c565b60ff19861689528489019650612c9c565b60008b81526020902060005b86811015612c945781548b820152908501908301612c7b565b505084890196505b505050505050612cac8185612bf2565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d2c57612d2c612d07565b500490565b600082821015612d4357612d43612aa1565b500390565b600082612d5757612d57612d07565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d8f9083018461262d565b9695505050505050565b600060208284031215612dab57600080fd5b81516125fa816125c756fea264697066735822122020b0e994b7a562204581b33a6dbedd27a9cfac74fd4abcae33a6f2741ea2411564736f6c634300080b0033
Deployed Bytecode Sourcemap
32465:8053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26148:300;;;;;;;;;;-1:-1:-1;26148:300:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;26148:300:0;;;;;;;;14767:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15579:308::-;;;;;;;;;;-1:-1:-1;15579:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;15579:308:0;1550:203:1;32594:50:0;;;;;;;;;;-1:-1:-1;32594:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15102:411;;;;;;;;;;-1:-1:-1;15102:411:0;;;;;:::i;:::-;;:::i;:::-;;34417:118;;;;;;;;;;;;;:::i;32988:30::-;;;;;;;;;;-1:-1:-1;32988:30:0;;;;;;;;;;;32910:33;;;;;;;;;;-1:-1:-1;32910:33:0;;;;;;;;36991:1110;;;;;;;;;;-1:-1:-1;36991:1110:0;;;;;:::i;:::-;;:::i;26524:110::-;;;;;;;;;;-1:-1:-1;26612:7:0;:14;26524:110;;;4150:25:1;;;4138:2;4123:18;26524:110:0;4004:177:1;16638:376:0;;;;;;;;;;-1:-1:-1;16638:376:0;;;;;:::i;:::-;;:::i;32828:34::-;;;;;;;;;;;;;;;;39293:968;;;;;;:::i;:::-;;:::i;27087:582::-;;;;;;;;;;-1:-1:-1;27087:582:0;;;;;:::i;:::-;;:::i;36208:775::-;;;;;;:::i;:::-;;:::i;33928:332::-;;;;;;;;;;;;;:::i;32651:53::-;;;;;;;;;;-1:-1:-1;32651:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;17085:185;;;;;;;;;;-1:-1:-1;17085:185:0;;;;;:::i;:::-;;:::i;26711:292::-;;;;;;;;;;-1:-1:-1;26711:292:0;;;;;:::i;:::-;;:::i;34286:98::-;;;;;;;;;;-1:-1:-1;34286:98:0;;;;;:::i;:::-;;:::i;33072:42::-;;;;;;;;;;;;33113:1;33072:42;;14374:326;;;;;;;;;;-1:-1:-1;14374:326:0;;;;;:::i;:::-;;:::i;34566:112::-;;;;;;;;;;;;;:::i;32869:32::-;;;;;;;;;;;;;;;;32564:21;;;;;;;;;;;;;:::i;13901:411::-;;;;;;;;;;-1:-1:-1;13901:411:0;;;;;:::i;:::-;;:::i;29355:103::-;;;;;;;;;;;;;:::i;33228:43::-;;;;;;;;;;;;33268:3;33228:43;;35820:359;;;;;;;;;;-1:-1:-1;35820:359:0;;;;;:::i;:::-;;:::i;32769:50::-;;;;;;;;;;-1:-1:-1;32769:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;28704:87;;;;;;;;;;-1:-1:-1;28777:6:0;;-1:-1:-1;;;;;28777:6:0;28704:87;;14936:104;;;;;;;;;;;;;:::i;33316:34::-;;;;;;;;;;;;;;;;34708:109;;;;;;;;;;;;;:::i;15959:327::-;;;;;;;;;;-1:-1:-1;15959:327:0;;;;;:::i;:::-;;:::i;32950:31::-;;;;;;;;;;-1:-1:-1;32950:31:0;;;;;;;;;;;17341:365;;;;;;;;;;-1:-1:-1;17341:365:0;;;;;:::i;:::-;;:::i;34863:104::-;;;;;;;;;;-1:-1:-1;34863:104:0;;;;;:::i;:::-;;:::i;32711:51::-;;;;;;;;;;-1:-1:-1;32711:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;40293:222;;;;;;;;;;-1:-1:-1;40293:222:0;;;;;:::i;:::-;;:::i;35016:100::-;;;;;;;;;;-1:-1:-1;35016:100:0;;;;;:::i;:::-;;:::i;33278:31::-;;;;;;;;;;;;;;;;33121:45;;;;;;;;;;;;33156:10;33121:45;;16357:214;;;;;;;;;;-1:-1:-1;16357:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;16528:25:0;;;16499:4;16528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;16357:214;33175:46;;;;;;;;;;;;33217:4;33175:46;;29613:238;;;;;;;;;;-1:-1:-1;29613:238:0;;;;;:::i;:::-;;:::i;38109:1176::-;;;;;;:::i;:::-;;:::i;33027:38::-;;;;;;;;;;;;33061:4;33027:38;;26148:300;26295:4;-1:-1:-1;;;;;;26337:50:0;;-1:-1:-1;;;26337:50:0;;:103;;;26404:36;26428:11;26404:23;:36::i;:::-;26317:123;26148:300;-1:-1:-1;;26148:300:0:o;14767:100::-;14821:13;14854:5;14847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:100;:::o;15579:308::-;15700:7;15747:16;15755:7;15747;:16::i;:::-;15725:110;;;;-1:-1:-1;;;15725:110:0;;7983:2:1;15725:110:0;;;7965:21:1;8022:2;8002:18;;;7995:30;8061:34;8041:18;;;8034:62;-1:-1:-1;;;8112:18:1;;;8105:42;8164:19;;15725:110:0;;;;;;;;;-1:-1:-1;15855:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15855:24:0;;15579:308::o;15102:411::-;15183:13;15199:23;15214:7;15199:14;:23::i;:::-;15183:39;;15247:5;-1:-1:-1;;;;;15241:11:0;:2;-1:-1:-1;;;;;15241:11:0;;;15233:57;;;;-1:-1:-1;;;15233:57:0;;8396:2:1;15233:57:0;;;8378:21:1;8435:2;8415:18;;;8408:30;8474:34;8454:18;;;8447:62;-1:-1:-1;;;8525:18:1;;;8518:31;8566:19;;15233:57:0;8194:397:1;15233:57:0;738:10;-1:-1:-1;;;;;15325:21:0;;;;:62;;-1:-1:-1;15350:37:0;15367:5;738:10;16357:214;:::i;15350:37::-;15303:168;;;;-1:-1:-1;;;15303:168:0;;8798:2:1;15303:168:0;;;8780:21:1;8837:2;8817:18;;;8810:30;8876:34;8856:18;;;8849:62;8947:26;8927:18;;;8920:54;8991:19;;15303:168:0;8596:420:1;15303:168:0;15484:21;15493:2;15497:7;15484:8;:21::i;:::-;15172:341;15102:411;;:::o;34417:118::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34506:21:::1;::::0;;-1:-1:-1;;34481:46:0;::::1;34506:21;::::0;;::::1;34505:22;34481:46;::::0;;34417:118::o;36991:1110::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;37159:11:::1;37173:13;26612:7:::0;:14;;26524:110;37173:13:::1;37219:21;::::0;37159:27;;-1:-1:-1;37219:21:0::1;;37197:116;;;::::0;-1:-1:-1;;;37197:116:0;;9943:2:1;37197:116:0::1;::::0;::::1;9925:21:1::0;9982:2;9962:18;;;9955:30;10021:34;10001:18;;;9994:62;-1:-1:-1;;;10072:18:1;;;10065:43;10125:19;;37197:116:0::1;9741:409:1::0;37197:116:0::1;37346:147;37372:45;37385:10;37397:19;37372:12;:45::i;:::-;37436:6;37461:17;;37346:7;:147::i;:::-;37324:239;;;::::0;-1:-1:-1;;;37324:239:0;;10357:2:1;37324:239:0::1;::::0;::::1;10339:21:1::0;10396:2;10376:18;;;10369:30;10435:34;10415:18;;;10408:62;-1:-1:-1;;;10486:18:1;;;10479:40;10536:19;;37324:239:0::1;10155:406:1::0;37324:239:0::1;37615:10;37596:30;::::0;;;:18:::1;:30;::::0;;;;;37665:19;;37596:48:::1;::::0;37629:15;;37596:48:::1;:::i;:::-;:88;;37574:161;;;::::0;-1:-1:-1;;;37574:161:0;;11033:2:1;37574:161:0::1;::::0;::::1;11015:21:1::0;11072:2;11052:18;;;11045:30;11111:25;11091:18;;;11084:53;11154:18;;37574:161:0::1;10831:347:1::0;37574:161:0::1;33268:3;37789:15;37768:18;;:36;;;;:::i;:::-;:55;37746:134;;;::::0;-1:-1:-1;;;37746:134:0;;11385:2:1;37746:134:0::1;::::0;::::1;11367:21:1::0;11424:2;11404:18;;;11397:30;11463:31;11443:18;;;11436:59;11512:18;;37746:134:0::1;11183:353:1::0;37746:134:0::1;37913:15;37891:18;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37958:10:0::1;37939:30;::::0;;;:18:::1;:30;::::0;;;;:49;;37973:15;;37939:30;:49:::1;::::0;37973:15;;37939:49:::1;:::i;:::-;::::0;;;-1:-1:-1;38004:6:0::1;::::0;-1:-1:-1;37999:95:0::1;38016:15;38012:1;:19;37999:95;;;38053:29;38059:10;38071;38080:1:::0;38071:6;:10:::1;:::i;:::-;38053:5;:29::i;:::-;38033:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37999:95;;;;37148:953;36991:1110:::0;;;:::o;16638:376::-;16847:41;738:10;16880:7;16847:18;:41::i;:::-;16825:140;;;;-1:-1:-1;;;16825:140:0;;;;;;;:::i;:::-;16978:28;16988:4;16994:2;16998:7;16978:9;:28::i;39293:968::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;39378:11:::1;39392:13;26612:7:::0;:14;;26524:110;39392:13:::1;39438:18;::::0;39378:27;;-1:-1:-1;39438:18:0;;::::1;;;39416:110;;;::::0;-1:-1:-1;;;39416:110:0;;12301:2:1;39416:110:0::1;::::0;::::1;12283:21:1::0;12340:2;12320:18;;;12313:30;12379:34;12359:18;;;12352:62;-1:-1:-1;;;12430:18:1;;;12423:40;12480:19;;39416:110:0::1;12099:406:1::0;39416:110:0::1;33113:1;39559:15;:36;;39537:142;;;::::0;-1:-1:-1;;;39537:142:0;;12712:2:1;39537:142:0::1;::::0;::::1;12694:21:1::0;12751:2;12731:18;;;12724:30;12790:34;12770:18;;;12763:62;12861:26;12841:18;;;12834:54;12905:19;;39537:142:0::1;12510:420:1::0;39537:142:0::1;39728:10;39712:27;::::0;;;:15:::1;:27;::::0;;;;;33113:1:::1;-1:-1:-1::0;39690:143:0::1;;;::::0;-1:-1:-1;;;39690:143:0;;13137:2:1;39690:143:0::1;::::0;::::1;13119:21:1::0;13176:2;13156:18;;;13149:30;13215:34;13195:18;;;13188:62;-1:-1:-1;;;13266:18:1;;;13259:44;13320:19;;39690:143:0::1;12935:410:1::0;39690:143:0::1;33061:4;39866:24;39875:15:::0;39866:6;:24:::1;:::i;:::-;:37;39844:119;;;::::0;-1:-1:-1;;;39844:119:0;;13552:2:1;39844:119:0::1;::::0;::::1;13534:21:1::0;;;13571:18;;;13564:30;13630:34;13610:18;;;13603:62;13682:18;;39844:119:0::1;13350:356:1::0;39844:119:0::1;40009:29;40023:15:::0;33156:10:::1;40009:29;:::i;:::-;39996:9;:42;39974:117;;;;-1:-1:-1::0;;;39974:117:0::1;;;;;;;:::i;:::-;40118:10;40102:27;::::0;;;:15:::1;:27;::::0;;;;:46;;40133:15;;40102:27;:46:::1;::::0;40133:15;;40102:46:::1;:::i;:::-;::::0;;;-1:-1:-1;40164:6:0::1;::::0;-1:-1:-1;40159:95:0::1;40176:15;40172:1;:19;40159:95;;;40213:29;40219:10;40231;40240:1:::0;40231:6;:10:::1;:::i;40213:29::-;40193:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40159:95;;27087:582:::0;27229:15;27292:16;27302:5;27292:9;:16::i;:::-;27284:5;:24;27262:117;;;;-1:-1:-1;;;27262:117:0;;;;;;;:::i;:::-;27392:10;27418:6;27413:183;27430:7;:14;27426:18;;27413:183;;;27479:7;27487:1;27479:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27470:19:0;;;27479:10;;27470:19;27466:119;;;27523:5;27514;:14;27510:59;;;27537:1;-1:-1:-1;27530:8:0;;-1:-1:-1;27530:8:0;27510:59;27562:7;;;;:::i;:::-;;;;27510:59;27446:3;;;;:::i;:::-;;;;27413:183;;;;27608:53;;-1:-1:-1;;;27608:53:0;;;;;;;:::i;36208:775::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;36331:11:::1;36345:13;26612:7:::0;:14;;26524:110;36345:13:::1;36377:21;::::0;36331:27;;-1:-1:-1;36377:21:0::1;;36369:62;;;::::0;-1:-1:-1;;;36369:62:0;;14984:2:1;36369:62:0::1;::::0;::::1;14966:21:1::0;15023:2;15003:18;;;14996:30;15062;15042:18;;;15035:58;15110:18;;36369:62:0::1;14782:352:1::0;36369:62:0::1;35263:25:::0;;;36487:10:::1;24990:2:1::0;24986:15;-1:-1:-1;;24982:53:1;35263:25:0;;;;24970:66:1;;;;35263:25:0;;;;;;;;;25052:12:1;;;;35263:25:0;;;35253:36;;;;;36464:64:::1;::::0;36500:6:::1;36508:19;;36464:7;:64::i;:::-;36442:137;;;::::0;-1:-1:-1;;;36442:137:0;;15341:2:1;36442:137:0::1;::::0;::::1;15323:21:1::0;15380:2;15360:18;;;15353:30;15419:25;15399:18;;;15392:53;15462:18;;36442:137:0::1;15139:347:1::0;36442:137:0::1;36632:10;36613:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;36612:31;36590:109;;;::::0;-1:-1:-1;;;36590:109:0;;15693:2:1;36590:109:0::1;::::0;::::1;15675:21:1::0;15732:2;15712:18;;;15705:30;15771;15751:18;;;15744:58;15819:18;;36590:109:0::1;15491:352:1::0;36590:109:0::1;33217:4;36718:15;;36736:1;36718:19;;;;:::i;:::-;:40;36710:77;;;::::0;-1:-1:-1;;;36710:77:0;;16050:2:1;36710:77:0::1;::::0;::::1;16032:21:1::0;16089:2;16069:18;;;16062:30;16128:26;16108:18;;;16101:54;16172:18;;36710:77:0::1;15848:348:1::0;36710:77:0::1;33156:10;36806:9;:24;36798:62;;;;-1:-1:-1::0;;;36798:62:0::1;;;;;;;:::i;:::-;36890:1;36871:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36921:10:0::1;36902:30;::::0;;;:18:::1;:30;::::0;;;;:37;;-1:-1:-1;;36902:37:0::1;36935:4;36902:37;::::0;;36950:25:::1;::::0;36968:6;36950:5:::1;:25::i;:::-;36320:663;36208:775:::0;:::o;33928:332::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;33996:21:::1;34036:11:::0;34028:44:::1;;;::::0;-1:-1:-1;;;34028:44:0;;16403:2:1;34028:44:0::1;::::0;::::1;16385:21:1::0;16442:2;16422:18;;;16415:30;-1:-1:-1;;;16461:18:1;;;16454:50;16521:18;;34028:44:0::1;16201:344:1::0;34028:44:0::1;34158:35;::::0;34112:10:::1;::::0;34083:18:::1;::::0;34112:10;;34181:7;;34083:18;34158:35;34083:18;34158:35;34181:7;34112:10;34158:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34134:59;;;34212:12;34204:48;;;::::0;-1:-1:-1;;;34204:48:0;;16962:2:1;34204:48:0::1;::::0;::::1;16944:21:1::0;17001:2;16981:18;;;16974:30;17040:25;17020:18;;;17013:53;17083:18;;34204:48:0::1;16760:347:1::0;17085:185:0;17223:39;17240:4;17246:2;17250:7;17223:39;;;;;;;;;;;;:16;:39::i;26711:292::-;26886:7;:14;26831:7;;26878:22;;26856:116;;;;-1:-1:-1;;;26856:116:0;;17314:2:1;26856:116:0;;;17296:21:1;17353:2;17333:18;;;17326:30;17392:34;17372:18;;;17365:62;-1:-1:-1;;;17443:18:1;;;17436:42;17495:19;;26856:116:0;17112:408:1;26856:116:0;-1:-1:-1;26990:5:0;26711:292::o;34286:98::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34358:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;14374:326::-:0;14491:7;14516:13;14532:7;14540;14532:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14532:16:0;;-1:-1:-1;14581:19:0;14559:110;;;;-1:-1:-1;;;14559:110:0;;17727:2:1;14559:110:0;;;17709:21:1;17766:2;17746:18;;;17739:30;17805:34;17785:18;;;17778:62;-1:-1:-1;;;17856:18:1;;;17849:39;17905:19;;14559:110:0;17525:405:1;34566:112:0;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34651:19:::1;::::0;;-1:-1:-1;;34628:42:0;::::1;34651:19;::::0;;;::::1;;;34650:20;34628:42:::0;;::::1;;::::0;;34566:112::o;32564:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13901:411::-;14018:4;-1:-1:-1;;;;;14062:19:0;;14040:111;;;;-1:-1:-1;;;14040:111:0;;18137:2:1;14040:111:0;;;18119:21:1;18176:2;18156:18;;;18149:30;18215:34;18195:18;;;18188:62;-1:-1:-1;;;18266:18:1;;;18259:40;18316:19;;14040:111:0;17935:406:1;14040:111:0;14164:10;14190:6;14185:97;14202:7;:14;14198:18;;14185:97;;;14251:7;14259:1;14251:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14242:19:0;;;14251:10;;14242:19;14238:32;;;14263:7;;;:::i;:::-;;;14238:32;14218:3;;;:::i;:::-;;;14185:97;;;-1:-1:-1;14299:5:0;13901:411;-1:-1:-1;;13901:411:0:o;29355:103::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;29420:30:::1;29447:1;29420:18;:30::i;:::-;29355:103::o:0;35820:359::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;35904:14:::1;35921:13;26612:7:::0;:14;;26524:110;35921:13:::1;35904:30:::0;-1:-1:-1;33061:4:0::1;35967:23;35976:14:::0;35904:30;35967:23:::1;:::i;:::-;:36;35945:122;;;::::0;-1:-1:-1;;;35945:122:0;;18548:2:1;35945:122:0::1;::::0;::::1;18530:21:1::0;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;-1:-1:-1;;;18677:18:1;;;18670:34;18721:19;;35945:122:0::1;18346:400:1::0;35945:122:0::1;36083:9;36078:94;36098:14;36094:1;:18;36078:94;;;36134:26;36144:3:::0;36149:10:::1;36158:1:::0;36149:6;:10:::1;:::i;:::-;36134:9;:26::i;:::-;36114:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36078:94;;;;35893:286;35820:359:::0;;:::o;14936:104::-;14992:13;15025:7;15018:14;;;;;:::i;34708:109::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34791:18:::1;::::0;;-1:-1:-1;;34769:40:0;::::1;34791:18:::0;;;;::::1;;;34790:19;34769:40:::0;;::::1;;::::0;;34708:109::o;15959:327::-;-1:-1:-1;;;;;16094:24:0;;738:10;16094:24;;16086:62;;;;-1:-1:-1;;;16086:62:0;;18953:2:1;16086:62:0;;;18935:21:1;18992:2;18972:18;;;18965:30;19031:27;19011:18;;;19004:55;19076:18;;16086:62:0;18751:349:1;16086:62:0;738:10;16161:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16161:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;16161:53:0;;;;;;;;;;16230:48;;540:41:1;;;16161:42:0;;738:10;16230:48;;513:18:1;16230:48:0;;;;;;;15959:327;;:::o;17341:365::-;17530:41;738:10;17563:7;17530:18;:41::i;:::-;17508:140;;;;-1:-1:-1;;;17508:140:0;;;;;;;:::i;:::-;17659:39;17673:4;17679:2;17683:7;17692:5;17659:13;:39::i;34863:104::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34932:19:::1;:27:::0;34863:104::o;40293:222::-;40352:13;40386:17;40394:8;40386:7;:17::i;:::-;40378:50;;;;-1:-1:-1;;;40378:50:0;;19307:2:1;40378:50:0;;;19289:21:1;19346:2;19326:18;;;19319:30;-1:-1:-1;;;19365:18:1;;;19358:50;19425:18;;40378:50:0;19105:344:1;40378:50:0;40470:7;40479:26;40496:8;40479:16;:26::i;:::-;40453:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40439:68;;40293:222;;;:::o;35016:100::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;35083:17:::1;:25:::0;35016:100::o;29613:238::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29716:22:0;::::1;29694:110;;;::::0;-1:-1:-1;;;29694:110:0;;21151:2:1;29694:110:0::1;::::0;::::1;21133:21:1::0;21190:2;21170:18;;;21163:30;21229:34;21209:18;;;21202:62;-1:-1:-1;;;21280:18:1;;;21273:36;21326:19;;29694:110:0::1;20949:402:1::0;29694:110:0::1;29815:28;29834:8;29815:18;:28::i;:::-;29613:238:::0;:::o;38109:1176::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;38280:11:::1;38294:13;26612:7:::0;:14;;26524:110;38294:13:::1;38340:19;::::0;38280:27;;-1:-1:-1;38340:19:0::1;::::0;::::1;;;38318:112;;;::::0;-1:-1:-1;;;38318:112:0;;21558:2:1;38318:112:0::1;::::0;::::1;21540:21:1::0;21597:2;21577:18;;;21570:30;21636:34;21616:18;;;21609:62;-1:-1:-1;;;21687:18:1;;;21680:41;21738:19;;38318:112:0::1;21356:407:1::0;38318:112:0::1;38463:147;38489:45;38502:10;38514:19;38489:12;:45::i;38463:147::-;38441:236;;;::::0;-1:-1:-1;;;38441:236:0;;21970:2:1;38441:236:0::1;::::0;::::1;21952:21:1::0;22009:2;21989:18;;;21982:30;22048:34;22028:18;;;22021:62;-1:-1:-1;;;22099:18:1;;;22092:37;22146:19;;38441:236:0::1;21768:403:1::0;38441:236:0::1;38727:10;38710:28;::::0;;;:16:::1;:28;::::0;;;;;33113:1:::1;::::0;38710:46:::1;::::0;38741:15;;38710:46:::1;:::i;:::-;:67;;38688:168;;;::::0;-1:-1:-1;;;38688:168:0;;22378:2:1;38688:168:0::1;::::0;::::1;22360:21:1::0;22417:2;22397:18;;;22390:30;22456:34;22436:18;;;22429:62;-1:-1:-1;;;22507:18:1;;;22500:49;22566:19;;38688:168:0::1;22176:415:1::0;38688:168:0::1;33061:4;38889:24;38898:15:::0;38889:6;:24:::1;:::i;:::-;:37;38867:119;;;::::0;-1:-1:-1;;;38867:119:0;;13552:2:1;38867:119:0::1;::::0;::::1;13534:21:1::0;;;13571:18;;;13564:30;13630:34;13610:18;;;13603:62;13682:18;;38867:119:0::1;13350:356:1::0;38867:119:0::1;39032:29;39046:15:::0;33156:10:::1;39032:29;:::i;:::-;39019:9;:42;38997:117;;;;-1:-1:-1::0;;;38997:117:0::1;;;;;;;:::i;:::-;39142:10;39125:28;::::0;;;:16:::1;:28;::::0;;;;:47;;39157:15;;39125:28;:47:::1;::::0;39157:15;;39125:47:::1;:::i;:::-;::::0;;;-1:-1:-1;39188:6:0::1;::::0;-1:-1:-1;39183:95:0::1;39200:15;39196:1;:19;39183:95;;;39237:29;39243:10;39255;39264:1:::0;39255:6;:10:::1;:::i;39237:29::-;39217:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39183:95;;13482:355:::0;13629:4;-1:-1:-1;;;;;;13671:40:0;;-1:-1:-1;;;13671:40:0;;:105;;-1:-1:-1;;;;;;;13728:48:0;;-1:-1:-1;;;13728:48:0;13671:105;:158;;;-1:-1:-1;;;;;;;;;;10326:40:0;;;13793:36;10167:207;19253:155;19352:7;:14;19318:4;;19342:24;;:58;;;;;19398:1;-1:-1:-1;;;;;19370:30:0;:7;19378;19370:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19370:16:0;:30;;19335:65;19253:155;-1:-1:-1;;19253:155:0:o;23278:174::-;23353:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23353:29:0;-1:-1:-1;;;;;23353:29:0;;;;;;;;:24;;23407:23;23353:24;23407:14;:23::i;:::-;-1:-1:-1;;;;;23398:46:0;;;;;;;;;;;23278:174;;:::o;35341:210::-;35497:45;;-1:-1:-1;;22773:2:1;22769:15;;;22765:53;35497:45:0;;;22753:66:1;22835:12;;;22828:28;;;35455:7:0;;22872:12:1;;35497:45:0;;;;;;;;;;;;35487:56;;;;;;35480:63;;35341:210;;;;:::o;35598:199::-;35726:4;35750:39;35769:6;35777:4;35783:5;35750:18;:39::i;:::-;35743:46;35598:199;-1:-1:-1;;;;35598:199:0:o;21363:346::-;-1:-1:-1;;;;;21443:16:0;;21435:61;;;;-1:-1:-1;;;21435:61:0;;23097:2:1;21435:61:0;;;23079:21:1;;;23116:18;;;23109:30;23175:34;23155:18;;;23148:62;23227:18;;21435:61:0;22895:356:1;21435:61:0;21516:16;21524:7;21516;:16::i;:::-;21515:17;21507:58;;;;-1:-1:-1;;;21507:58:0;;23458:2:1;21507:58:0;;;23440:21:1;23497:2;23477:18;;;23470:30;23536;23516:18;;;23509:58;23584:18;;21507:58:0;23256:352:1;21507:58:0;21634:7;:16;;;;;;;-1:-1:-1;21634:16:0;;;;;;;-1:-1:-1;;;;;;21634:16:0;-1:-1:-1;;;;;21634:16:0;;;;;;;;21668:33;;21693:7;;-1:-1:-1;21668:33:0;;-1:-1:-1;;21668:33:0;21363:346;;:::o;19575:452::-;19704:4;19748:16;19756:7;19748;:16::i;:::-;19726:110;;;;-1:-1:-1;;;19726:110:0;;23815:2:1;19726:110:0;;;23797:21:1;23854:2;23834:18;;;23827:30;23893:34;23873:18;;;23866:62;-1:-1:-1;;;23944:18:1;;;23937:42;23996:19;;19726:110:0;23613:408:1;19726:110:0;19847:13;19863:23;19878:7;19863:14;:23::i;:::-;19847:39;;19916:5;-1:-1:-1;;;;;19905:16:0;:7;-1:-1:-1;;;;;19905:16:0;;:64;;;;19962:7;-1:-1:-1;;;;;19938:31:0;:20;19950:7;19938:11;:20::i;:::-;-1:-1:-1;;;;;19938:31:0;;19905:64;:113;;;-1:-1:-1;;;;;;16528:25:0;;;16499:4;16528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;19986:32;16357:214;22607:553;22780:4;-1:-1:-1;;;;;22753:31:0;:23;22768:7;22753:14;:23::i;:::-;-1:-1:-1;;;;;22753:31:0;;22731:122;;;;-1:-1:-1;;;22731:122:0;;24228:2:1;22731:122:0;;;24210:21:1;24267:2;24247:18;;;24240:30;24306:34;24286:18;;;24279:62;-1:-1:-1;;;24357:18:1;;;24350:39;24406:19;;22731:122:0;24026:405:1;22731:122:0;-1:-1:-1;;;;;22872:16:0;;22864:65;;;;-1:-1:-1;;;22864:65:0;;24638:2:1;22864:65:0;;;24620:21:1;24677:2;24657:18;;;24650:30;24716:34;24696:18;;;24689:62;-1:-1:-1;;;24767:18:1;;;24760:34;24811:19;;22864:65:0;24436:400:1;22864:65:0;23046:29;23063:1;23067:7;23046:8;:29::i;:::-;23105:2;23086:7;23094;23086:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;23086:21:0;-1:-1:-1;;;;;23086:21:0;;;;;;23125:27;;23144:7;;23125:27;;;;;;;;;;23086:16;23125:27;22607:553;;;:::o;30011:191::-;30104:6;;;-1:-1:-1;;;;;30121:17:0;;;-1:-1:-1;;;;;;30121:17:0;;;;;;;30154:40;;30104:6;;;30121:17;30104:6;;30154:40;;30085:16;;30154:40;30074:128;30011:191;:::o;20369:110::-;20445:26;20455:2;20459:7;20445:26;;;;;;;;;;;;:9;:26::i;18588:352::-;18745:28;18755:4;18761:2;18765:7;18745:9;:28::i;:::-;18806:48;18829:4;18835:2;18839:7;18848:5;18806:22;:48::i;:::-;18784:148;;;;-1:-1:-1;;;18784:148:0;;;;;;;:::i;10940:722::-;10996:13;11216:10;11212:53;;-1:-1:-1;;11243:10:0;;;;;;;;;;;;-1:-1:-1;;;11243:10:0;;;;;10940:722::o;11212:53::-;11290:5;11275:12;11331:78;11338:9;;11331:78;;11364:8;;;;:::i;:::-;;-1:-1:-1;11387:10:0;;-1:-1:-1;11395:2:0;11387:10;;:::i;:::-;;;11331:78;;;11419:19;11451:6;11441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11441:17:0;;11419:39;;11469:154;11476:10;;11469:154;;11503:11;11513:1;11503:11;;:::i;:::-;;-1:-1:-1;11572:10:0;11580:2;11572:5;:10;:::i;:::-;11559:24;;:2;:24;:::i;:::-;11546:39;;11529:6;11536;11529:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11529:56:0;;;;;;;;-1:-1:-1;11600:11:0;11609:2;11600:11;;:::i;:::-;;;11469:154;;31044:190;31169:4;31222;31193:25;31206:5;31213:4;31193:12;:25::i;:::-;:33;;31044:190;-1:-1:-1;;;;31044:190:0:o;20706:321::-;20836:18;20842:2;20846:7;20836:5;:18::i;:::-;20887:54;20918:1;20922:2;20926:7;20935:5;20887:22;:54::i;:::-;20865:154;;;;-1:-1:-1;;;20865:154:0;;;;;;;:::i;24017:980::-;24172:4;-1:-1:-1;;;;;24193:13:0;;10560:20;10608:8;24189:801;;24246:175;;-1:-1:-1;;;24246:175:0;;-1:-1:-1;;;;;24246:36:0;;;;;:175;;738:10;;24340:4;;24367:7;;24397:5;;24246:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24246:175:0;;;;;;;;-1:-1:-1;;24246:175:0;;;;;;;;;;;;:::i;:::-;;;24225:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24604:13:0;;24600:320;;24647:108;;-1:-1:-1;;;24647:108:0;;;;;;;:::i;24600:320::-;24870:6;24864:13;24855:6;24851:2;24847:15;24840:38;24225:710;-1:-1:-1;;;;;;24485:51:0;-1:-1:-1;;;24485:51:0;;-1:-1:-1;24478:58:0;;24189:801;-1:-1:-1;24974:4:0;24017:980;;;;;;:::o;31596:813::-;31706:7;31754:4;31706:7;31769:603;31793:5;:12;31789:1;:16;31769:603;;;31827:20;31850:5;31856:1;31850:8;;;;;;;;:::i;:::-;;;;;;;31827:31;;31893:12;31877;:28;31873:488;;32052:44;;;;;;26914:19:1;;;26949:12;;;26942:28;;;26986:12;;32052:44:0;;;;;;;;;;;;32020:95;;;;;;32005:110;;31873:488;;;32282:44;;;;;;26914:19:1;;;26949:12;;;26942:28;;;26986:12;;32282:44:0;;;;;;;;;;;;32250:95;;;;;;32235:110;;31873:488;-1:-1:-1;31807:3:0;;;;:::i;:::-;;;;31769:603;;;-1:-1:-1;32389:12:0;31596:813;-1:-1:-1;;;31596:813:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:186::-;1995:6;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;2127:254::-;2195:6;2203;2256:2;2244:9;2235:7;2231:23;2227:32;2224:52;;;2272:1;2269;2262:12;2224:52;2295:29;2314:9;2295:29;:::i;:::-;2285:39;2371:2;2356:18;;;;2343:32;;-1:-1:-1;;;2127:254:1:o;2386:127::-;2447:10;2442:3;2438:20;2435:1;2428:31;2478:4;2475:1;2468:15;2502:4;2499:1;2492:15;2518:275;2589:2;2583:9;2654:2;2635:13;;-1:-1:-1;;2631:27:1;2619:40;;2689:18;2674:34;;2710:22;;;2671:62;2668:88;;;2736:18;;:::i;:::-;2772:2;2765:22;2518:275;;-1:-1:-1;2518:275:1:o;2798:712::-;2852:5;2905:3;2898:4;2890:6;2886:17;2882:27;2872:55;;2923:1;2920;2913:12;2872:55;2959:6;2946:20;2985:4;3008:18;3004:2;3001:26;2998:52;;;3030:18;;:::i;:::-;3076:2;3073:1;3069:10;3099:28;3123:2;3119;3115:11;3099:28;:::i;:::-;3161:15;;;3231;;;3227:24;;;3192:12;;;;3263:15;;;3260:35;;;3291:1;3288;3281:12;3260:35;3327:2;3319:6;3315:15;3304:26;;3339:142;3355:6;3350:3;3347:15;3339:142;;;3421:17;;3409:30;;3372:12;;;;3459;;;;3339:142;;;3499:5;2798:712;-1:-1:-1;;;;;;;2798:712:1:o;3515:484::-;3617:6;3625;3633;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3738:9;3725:23;3715:33;;3795:2;3784:9;3780:18;3767:32;3757:42;;3850:2;3839:9;3835:18;3822:32;3877:18;3869:6;3866:30;3863:50;;;3909:1;3906;3899:12;3863:50;3932:61;3985:7;3976:6;3965:9;3961:22;3932:61;:::i;:::-;3922:71;;;3515:484;;;;;:::o;4186:328::-;4263:6;4271;4279;4332:2;4320:9;4311:7;4307:23;4303:32;4300:52;;;4348:1;4345;4338:12;4300:52;4371:29;4390:9;4371:29;:::i;:::-;4361:39;;4419:38;4453:2;4442:9;4438:18;4419:38;:::i;:::-;4409:48;;4504:2;4493:9;4489:18;4476:32;4466:42;;4186:328;;;;;:::o;4701:348::-;4785:6;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4894:9;4881:23;4927:18;4919:6;4916:30;4913:50;;;4959:1;4956;4949:12;4913:50;4982:61;5035:7;5026:6;5015:9;5011:22;4982:61;:::i;5054:407::-;5119:5;5153:18;5145:6;5142:30;5139:56;;;5175:18;;:::i;:::-;5213:57;5258:2;5237:15;;-1:-1:-1;;5233:29:1;5264:4;5229:40;5213:57;:::i;:::-;5204:66;;5293:6;5286:5;5279:21;5333:3;5324:6;5319:3;5315:16;5312:25;5309:45;;;5350:1;5347;5340:12;5309:45;5399:6;5394:3;5387:4;5380:5;5376:16;5363:43;5453:1;5446:4;5437:6;5430:5;5426:18;5422:29;5415:40;5054:407;;;;;:::o;5466:451::-;5535:6;5588:2;5576:9;5567:7;5563:23;5559:32;5556:52;;;5604:1;5601;5594:12;5556:52;5644:9;5631:23;5677:18;5669:6;5666:30;5663:50;;;5709:1;5706;5699:12;5663:50;5732:22;;5785:4;5777:13;;5773:27;-1:-1:-1;5763:55:1;;5814:1;5811;5804:12;5763:55;5837:74;5903:7;5898:2;5885:16;5880:2;5876;5872:11;5837:74;:::i;5922:347::-;5987:6;5995;6048:2;6036:9;6027:7;6023:23;6019:32;6016:52;;;6064:1;6061;6054:12;6016:52;6087:29;6106:9;6087:29;:::i;:::-;6077:39;;6166:2;6155:9;6151:18;6138:32;6213:5;6206:13;6199:21;6192:5;6189:32;6179:60;;6235:1;6232;6225:12;6179:60;6258:5;6248:15;;;5922:347;;;;;:::o;6274:667::-;6369:6;6377;6385;6393;6446:3;6434:9;6425:7;6421:23;6417:33;6414:53;;;6463:1;6460;6453:12;6414:53;6486:29;6505:9;6486:29;:::i;:::-;6476:39;;6534:38;6568:2;6557:9;6553:18;6534:38;:::i;:::-;6524:48;;6619:2;6608:9;6604:18;6591:32;6581:42;;6674:2;6663:9;6659:18;6646:32;6701:18;6693:6;6690:30;6687:50;;;6733:1;6730;6723:12;6687:50;6756:22;;6809:4;6801:13;;6797:27;-1:-1:-1;6787:55:1;;6838:1;6835;6828:12;6787:55;6861:74;6927:7;6922:2;6909:16;6904:2;6900;6896:11;6861:74;:::i;:::-;6851:84;;;6274:667;;;;;;;:::o;7131:260::-;7199:6;7207;7260:2;7248:9;7239:7;7235:23;7231:32;7228:52;;;7276:1;7273;7266:12;7228:52;7299:29;7318:9;7299:29;:::i;:::-;7289:39;;7347:38;7381:2;7370:9;7366:18;7347:38;:::i;:::-;7337:48;;7131:260;;;;;:::o;7396:380::-;7475:1;7471:12;;;;7518;;;7539:61;;7593:4;7585:6;7581:17;7571:27;;7539:61;7646:2;7638:6;7635:14;7615:18;7612:38;7609:161;;;7692:10;7687:3;7683:20;7680:1;7673:31;7727:4;7724:1;7717:15;7755:4;7752:1;7745:15;7609:161;;7396:380;;;:::o;9021:356::-;9223:2;9205:21;;;9242:18;;;9235:30;9301:34;9296:2;9281:18;;9274:62;9368:2;9353:18;;9021:356::o;9382:354::-;9584:2;9566:21;;;9623:2;9603:18;;;9596:30;9662:32;9657:2;9642:18;;9635:60;9727:2;9712:18;;9382:354::o;10566:127::-;10627:10;10622:3;10618:20;10615:1;10608:31;10658:4;10655:1;10648:15;10682:4;10679:1;10672:15;10698:128;10738:3;10769:1;10765:6;10762:1;10759:13;10756:39;;;10775:18;;:::i;:::-;-1:-1:-1;10811:9:1;;10698:128::o;11541:135::-;11580:3;-1:-1:-1;;11601:17:1;;11598:43;;;11621:18;;:::i;:::-;-1:-1:-1;11668:1:1;11657:13;;11541:135::o;11681:413::-;11883:2;11865:21;;;11922:2;11902:18;;;11895:30;11961:34;11956:2;11941:18;;11934:62;-1:-1:-1;;;12027:2:1;12012:18;;12005:47;12084:3;12069:19;;11681:413::o;13711:168::-;13751:7;13817:1;13813;13809:6;13805:14;13802:1;13799:21;13794:1;13787:9;13780:17;13776:45;13773:71;;;13824:18;;:::i;:::-;-1:-1:-1;13864:9:1;;13711:168::o;13884:349::-;14086:2;14068:21;;;14125:2;14105:18;;;14098:30;14164:27;14159:2;14144:18;;14137:55;14224:2;14209:18;;13884:349::o;14238:407::-;14440:2;14422:21;;;14479:2;14459:18;;;14452:30;14518:34;14513:2;14498:18;;14491:62;-1:-1:-1;;;14584:2:1;14569:18;;14562:41;14635:3;14620:19;;14238:407::o;14650:127::-;14711:10;14706:3;14702:20;14699:1;14692:31;14742:4;14739:1;14732:15;14766:4;14763:1;14756:15;19580:185;19622:3;19660:5;19654:12;19675:52;19720:6;19715:3;19708:4;19701:5;19697:16;19675:52;:::i;:::-;19743:16;;;;;19580:185;-1:-1:-1;;19580:185:1:o;19770:1174::-;19946:3;19975:1;20008:6;20002:13;20038:3;20060:1;20088:9;20084:2;20080:18;20070:28;;20148:2;20137:9;20133:18;20170;20160:61;;20214:4;20206:6;20202:17;20192:27;;20160:61;20240:2;20288;20280:6;20277:14;20257:18;20254:38;20251:165;;;-1:-1:-1;;;20315:33:1;;20371:4;20368:1;20361:15;20401:4;20322:3;20389:17;20251:165;20432:18;20459:104;;;;20577:1;20572:320;;;;20425:467;;20459:104;-1:-1:-1;;20492:24:1;;20480:37;;20537:16;;;;-1:-1:-1;20459:104:1;;20572:320;19527:1;19520:14;;;19564:4;19551:18;;20667:1;20681:165;20695:6;20692:1;20689:13;20681:165;;;20773:14;;20760:11;;;20753:35;20816:16;;;;20710:10;;20681:165;;;20685:3;;20875:6;20870:3;20866:16;20859:23;;20425:467;;;;;;;20908:30;20934:3;20926:6;20908:30;:::i;:::-;20901:37;19770:1174;-1:-1:-1;;;;;19770:1174:1:o;25075:414::-;25277:2;25259:21;;;25316:2;25296:18;;;25289:30;25355:34;25350:2;25335:18;;25328:62;-1:-1:-1;;;25421:2:1;25406:18;;25399:48;25479:3;25464:19;;25075:414::o;25494:127::-;25555:10;25550:3;25546:20;25543:1;25536:31;25586:4;25583:1;25576:15;25610:4;25607:1;25600:15;25626:120;25666:1;25692;25682:35;;25697:18;;:::i;:::-;-1:-1:-1;25731:9:1;;25626:120::o;25751:125::-;25791:4;25819:1;25816;25813:8;25810:34;;;25824:18;;:::i;:::-;-1:-1:-1;25861:9:1;;25751:125::o;25881:112::-;25913:1;25939;25929:35;;25944:18;;:::i;:::-;-1:-1:-1;25978:9:1;;25881:112::o;25998:500::-;-1:-1:-1;;;;;26267:15:1;;;26249:34;;26319:15;;26314:2;26299:18;;26292:43;26366:2;26351:18;;26344:34;;;26414:3;26409:2;26394:18;;26387:31;;;26192:4;;26435:57;;26472:19;;26464:6;26435:57;:::i;:::-;26427:65;25998:500;-1:-1:-1;;;;;;25998:500:1:o;26503:249::-;26572:6;26625:2;26613:9;26604:7;26600:23;26596:32;26593:52;;;26641:1;26638;26631:12;26593:52;26673:9;26667:16;26692:30;26716:5;26692:30;:::i
Swarm Source
ipfs://20b0e994b7a562204581b33a6dbedd27a9cfac74fd4abcae33a6f2741ea24115
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.