ERC-721
NFT
Overview
Max Total Supply
9,464 JUICE
Holders
2,585
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 JUICELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GutterJuice
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.12; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "./ERC721A.sol"; contract GutterJuice is Context, ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; string private _contractBaseURI = "https://clonejuiceapi.guttercatgang.com/metadata/clone_juice/"; string private _contractURI = "ipfs://QmRbAP27dFmPwk3ghgtqC542VRp869tqGFVy9tSqW6CKMv"; address public cloneMintingContract; //the future clone contract // Public sale params uint256 public publicSaleDuration = 4 hours; uint256 public publicSaleStartTime = 1646774400; // Starting prices uint256 public publicSaleJuiceStartingPrice = 0.9 ether; uint256 public publicSaleJuiceStartingPriceGang = 100 ether; // auction not less than 0.1 ETH or 10 $GANG uint256 public auctionEndingPrice = 0.1 ether; uint256 public auctionEndingPriceGang = 10 ether; //flags for eth/gang sale bool public isETHSaleLive; bool public isGangSaleLive; address private airdropAccount; //gang tokens address public gangToken; //increased on the next juices uint256 public maxSupply = 16000; modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } constructor() ERC721A("Gutter Juice", "JUICE") { airdropAccount = msg.sender; } /** * @dev purchase a juice with ETH * @param qty - quantity of items */ function buyJuice(uint256 qty) external payable notContract nonReentrant { require(block.timestamp >= publicSaleStartTime, "not started yet"); require(isETHSaleLive, "not started yet - flag"); require(qty <= 20, "max 20 at once"); require(totalSupply() + qty <= maxSupply, "out of stock"); uint256 costToMint = getMintPrice() * qty; require(msg.value >= costToMint, "eth value incorrect"); _safeMint(msg.sender, qty); if (msg.value > costToMint) { (bool success, ) = msg.sender.call{ value: msg.value - costToMint }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @dev purchase a juice with Gang. correct allowance must be set * @param qty - quantity of items */ function buyJuiceWithGang(uint256 qty) external notContract nonReentrant { require(block.timestamp >= publicSaleStartTime, "not started yet"); require(isGangSaleLive, "not started yet - flag"); require(qty <= 20, "max 20 at once"); require(totalSupply() + qty <= maxSupply, "out of stock"); uint256 costToMint = getMintPriceGang() * qty; //transfer the market fee require( IERC20(gangToken).transferFrom(msg.sender, address(this), costToMint), "failed transfer" ); _safeMint(msg.sender, qty); } /** * @dev don't go over 50... */ function airdrop(address[] memory receivers) external { require(tx.origin == airdropAccount || msg.sender == airdropAccount, "need airdrop account"); for (uint256 i = 0; i < receivers.length; i++) { _safeMint(receivers[i], 1); } } /** * @dev only calable from cloneMintingContract, verify ownership there */ function burn(uint256 tokenID) external { require( tx.origin == cloneMintingContract || msg.sender == cloneMintingContract, "only clone contract" ); _burn(tokenID); } function getMintPrice() public view returns (uint256) { uint256 elapsed = getElapsedSaleTime(); if (elapsed >= publicSaleDuration) { return auctionEndingPrice; } else { uint256 currentPrice = ((publicSaleDuration - elapsed) * publicSaleJuiceStartingPrice) / publicSaleDuration; return currentPrice > auctionEndingPrice ? currentPrice : auctionEndingPrice; } } function getMintPriceGang() public view returns (uint256) { uint256 elapsed = getElapsedSaleTime(); if (elapsed >= publicSaleDuration) { return auctionEndingPriceGang; } else { uint256 currentPrice = ((publicSaleDuration - elapsed) * publicSaleJuiceStartingPriceGang) / publicSaleDuration; return currentPrice > auctionEndingPriceGang ? currentPrice : auctionEndingPriceGang; } } function getElapsedSaleTime() internal view returns (uint256) { return publicSaleStartTime > 0 ? block.timestamp - publicSaleStartTime : 0; } function contractURI() public view returns (string memory) { return _contractURI; } function exists(uint256 _tokenId) public view returns (bool) { return _exists(_tokenId); } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_contractBaseURI, _tokenId.toString())); } /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~ ADMIN FUNCTIONS ~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /** @dev sets the contract address for gang token */ function setGangTokenAddress(address cAddress) external onlyOwner { gangToken = cAddress; } function adminMint(uint256 qty, address to) external onlyOwner { require(totalSupply() + qty <= maxSupply, "out of stock"); _safeMint(to, qty); } function withdrawEarnings() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** @dev setup the public sale * @param saleDuration - duration of the sale * @param saleStartPrice - price of the sale */ function startPublicSale( uint256 saleDuration, uint256 saleStartPrice, uint256 saleStartPriceGang ) external onlyOwner { publicSaleDuration = saleDuration; publicSaleJuiceStartingPrice = saleStartPrice; publicSaleJuiceStartingPriceGang = saleStartPriceGang; publicSaleStartTime = block.timestamp; } /** @dev setup the public sale * @param inETH - for eth sales * @param inGang - for gang sales */ function setEndingPrices(uint256 inETH, uint256 inGang) external onlyOwner { auctionEndingPrice = inETH; auctionEndingPriceGang = inGang; } /** @dev sets a new base URI * @param newBaseURI - new base URI */ function setBaseURI(string memory newBaseURI) external onlyOwner { _contractBaseURI = newBaseURI; } function setContractURI(string memory newuri) external onlyOwner { _contractURI = newuri; } //sets the account that does the airdrop function setAirdropAccount(address newAddress) external onlyOwner { airdropAccount = newAddress; } //can be increased by admin for the next drops function setMaxSupply(uint256 newMaxSupply) external onlyOwner { maxSupply = newMaxSupply; } /** @dev sets the clone minting contract * @param addr - address of the contract */ function setCloneMintingContract(address addr) external onlyOwner { cloneMintingContract = addr; } /** * @dev sets the flags for eth/gang sales */ function enableSales(bool enableETH, bool enableGang) external onlyOwner { isETHSaleLive = enableETH; isGangSaleLive = enableGang; } /** @dev gets a token back + market fees */ function reclaimERC20(address _tokenContract, uint256 _amount) external onlyOwner { require(IERC20(_tokenContract).transfer(msg.sender, _amount), "transfer failed"); } /** @dev gets back an ERC721 token */ function reclaimERC721(IERC721 erc721Token, uint256 id) external onlyOwner { erc721Token.safeTransferFrom(address(this), msg.sender, id); } /** @dev gets back an ERC1155 token(s) */ function reclaimERC1155( IERC1155 erc1155Token, uint256 id, uint256 amount ) external onlyOwner { erc1155Token.safeTransferFrom(address(this), msg.sender, id, amount, ""); } /** * @notice Check if an address is a contract */ function _isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity 0.8.12; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionEndingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionEndingPriceGang","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buyJuice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buyJuiceWithGang","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cloneMintingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enableETH","type":"bool"},{"internalType":"bool","name":"enableGang","type":"bool"}],"name":"enableSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gangToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPriceGang","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isETHSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGangSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":[],"name":"publicSaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleJuiceStartingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleJuiceStartingPriceGang","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155","name":"erc1155Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reclaimERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"erc721Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"reclaimERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setAirdropAccount","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setCloneMintingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inETH","type":"uint256"},{"internalType":"uint256","name":"inGang","type":"uint256"}],"name":"setEndingPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cAddress","type":"address"}],"name":"setGangTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleDuration","type":"uint256"},{"internalType":"uint256","name":"saleStartPrice","type":"uint256"},{"internalType":"uint256","name":"saleStartPriceGang","type":"uint256"}],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":[],"name":"withdrawEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052603d60808181529062002eb260a03980516200002991600a916020909101906200019d565b5060405180606001604052806035815260200162002eef6035913980516200005a91600b916020909101906200019d565b50613840600d55636227c880600e55670c7d713b49da0000600f5568056bc75e2d6310000060105567016345785d8a0000601155678ac7230489e80000601255613e80601555348015620000ad57600080fd5b50604080518082018252600c81526b477574746572204a7569636560a01b6020808301918252835180850190945260058452644a5549434560d81b908401528151919291620000ff916002916200019d565b508051620001159060039060208401906200019d565b5050600080555062000127336200014b565b60016009556013805462010000600160b01b03191633620100000217905562000280565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ab9062000243565b90600052602060002090601f016020900481019282620001cf57600085556200021a565b82601f10620001ea57805160ff19168380011785556200021a565b828001600101855582156200021a579182015b828111156200021a578251825591602001919060010190620001fd565b50620002289291506200022c565b5090565b5b808211156200022857600081556001016200022d565b600181811c908216806200025857607f821691505b602082108114156200027a57634e487b7160e01b600052602260045260246000fd5b50919050565b612c2280620002906000396000f3fe6080604052600436106102c95760003560e01c80638313214911610175578063b88d4fde116100dc578063d1beee8511610095578063e985e9c51161006f578063e985e9c51461083d578063f2fde38b14610886578063fd48354e146108a6578063fd79a0ef146108bc57600080fd5b8063d1beee85146107f2578063d5abeb0114610812578063e8a3d4851461082857600080fd5b8063b88d4fde14610732578063ba79149214610752578063c0047f5214610772578063c2c4aa8714610792578063c5487cc8146107b2578063c87b56dd146107d257600080fd5b80639727df571161012e5780639727df5714610692578063a22cb465146106b2578063a7f93ebd146106d2578063acf556a4146106e7578063afdbd499146106fd578063b73c6ce91461071d57600080fd5b806383132149146105e95780638a45a065146106095780638da5cb5b14610629578063929612b114610647578063938e3d7b1461065d57806395d89b411461067d57600080fd5b806342842e0e116102345780636bb7b1d9116101ed578063715018a6116101c7578063715018a61461057b578063729ad39e14610590578063770e6ff5146105b05780637c601fd5146105ca57600080fd5b80636bb7b1d9146105255780636f8b44b01461053b57806370a082311461055b57600080fd5b806342842e0e1461046557806342966c68146104855780634f558e79146104a557806355f804b3146104c55780636352211e146104e55780636b7d24701461050557600080fd5b80630dc28efe116102865780630dc28efe146103c357806318160ddd146103e35780631c8e7d2a146103fc57806323b872dd1461041c578063263d041d1461043c57806341ccb38f1461044f57600080fd5b806301ffc9a7146102ce5780630316ae23146103035780630509e8131461032557806306fdde0314610349578063081812fc1461036b578063095ea7b3146103a3575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612492565b6108d1565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e3660046124cb565b610923565b005b34801561033157600080fd5b5061033b600f5481565b6040519081526020016102fa565b34801561035557600080fd5b5061035e610980565b6040516102fa9190612540565b34801561037757600080fd5b5061038b610386366004612553565b610a12565b6040516001600160a01b0390911681526020016102fa565b3480156103af57600080fd5b506103236103be36600461256c565b610a56565b3480156103cf57600080fd5b506103236103de366004612598565b610ae4565b3480156103ef57600080fd5b506001546000540361033b565b34801561040857600080fd5b506103236104173660046125c8565b610b55565b34801561042857600080fd5b506103236104373660046125fd565b610bff565b61032361044a366004612553565b610c0a565b34801561045b57600080fd5b5061033b60115481565b34801561047157600080fd5b506103236104803660046125fd565b610f40565b34801561049157600080fd5b506103236104a0366004612553565b610f5b565b3480156104b157600080fd5b506102ee6104c0366004612553565b610fcc565b3480156104d157600080fd5b506103236104e03660046126db565b610fd7565b3480156104f157600080fd5b5061038b610500366004612553565b611014565b34801561051157600080fd5b5061032361052036600461256c565b611026565b34801561053157600080fd5b5061033b600e5481565b34801561054757600080fd5b50610323610556366004612553565b6110ba565b34801561056757600080fd5b5061033b6105763660046124cb565b6110e9565b34801561058757600080fd5b50610323611137565b34801561059c57600080fd5b506103236105ab366004612723565b61116d565b3480156105bc57600080fd5b506013546102ee9060ff1681565b3480156105d657600080fd5b506013546102ee90610100900460ff1681565b3480156105f557600080fd5b506103236106043660046127d4565b611221565b34801561061557600080fd5b506103236106243660046124cb565b61125d565b34801561063557600080fd5b506008546001600160a01b031661038b565b34801561065357600080fd5b5061033b60105481565b34801561066957600080fd5b506103236106783660046126db565b6112a9565b34801561068957600080fd5b5061035e6112e6565b34801561069e57600080fd5b506103236106ad3660046124cb565b6112f5565b3480156106be57600080fd5b506103236106cd36600461280e565b611341565b3480156106de57600080fd5b5061033b6113d7565b3480156106f357600080fd5b5061033b60125481565b34801561070957600080fd5b5061032361071836600461256c565b61143d565b34801561072957600080fd5b50610323611516565b34801561073e57600080fd5b5061032361074d36600461283c565b61156c565b34801561075e57600080fd5b5060145461038b906001600160a01b031681565b34801561077e57600080fd5b50600c5461038b906001600160a01b031681565b34801561079e57600080fd5b506103236107ad3660046128bb565b6115bd565b3480156107be57600080fd5b506103236107cd3660046128dd565b6115f2565b3480156107de57600080fd5b5061035e6107ed366004612553565b611640565b3480156107fe57600080fd5b5061032361080d366004612553565b6116e1565b34801561081e57600080fd5b5061033b60155481565b34801561083457600080fd5b5061035e6119b6565b34801561084957600080fd5b506102ee6108583660046128fb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561089257600080fd5b506103236108a13660046124cb565b6119c5565b3480156108b257600080fd5b5061033b600d5481565b3480156108c857600080fd5b5061033b611a5d565b60006001600160e01b031982166380ac58cd60e01b148061090257506001600160e01b03198216635b5e139f60e01b145b8061091d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109565760405162461bcd60e51b815260040161094d90612929565b60405180910390fd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60606002805461098f9061295e565b80601f01602080910402602001604051908101604052809291908181526020018280546109bb9061295e565b8015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b6000610a1d82611ab6565b610a3a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6182611014565b9050806001600160a01b0316836001600160a01b03161415610a965760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ab65750610ab48133610858565b155b15610ad4576040516367d9dca160e11b815260040160405180910390fd5b610adf838383611ae1565b505050565b6008546001600160a01b03163314610b0e5760405162461bcd60e51b815260040161094d90612929565b60155482610b1f6001546000540390565b610b2991906129af565b1115610b475760405162461bcd60e51b815260040161094d906129c7565b610b518183611b3d565b5050565b6008546001600160a01b03163314610b7f5760405162461bcd60e51b815260040161094d90612929565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b158015610be257600080fd5b505af1158015610bf6573d6000803e3d6000fd5b50505050505050565b610adf838383611b57565b333b15610c505760405162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015260640161094d565b333214610c9f5760405162461bcd60e51b815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161094d565b60026009541415610cf25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161094d565b6002600955600e54421015610d3b5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081cdd185c9d1959081e595d608a1b604482015260640161094d565b60135460ff16610d865760405162461bcd60e51b81526020600482015260166024820152756e6f74207374617274656420796574202d20666c616760501b604482015260640161094d565b6014811115610dc85760405162461bcd60e51b815260206004820152600e60248201526d6d6178203230206174206f6e636560901b604482015260640161094d565b60155481610dd96001546000540390565b610de391906129af565b1115610e015760405162461bcd60e51b815260040161094d906129c7565b600081610e0c6113d7565b610e1691906129ed565b905080341015610e5e5760405162461bcd60e51b8152602060048201526013602482015272195d1a081d985b1d59481a5b98dbdc9c9958dd606a1b604482015260640161094d565b610e683383611b3d565b80341115610f3757600033610e7d8334612a0c565b604051600081818185875af1925050503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b5050905080610f355760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094d565b505b50506001600955565b610adf8383836040518060200160405280600081525061156c565b600c546001600160a01b0316321480610f7e5750600c546001600160a01b031633145b610fc05760405162461bcd60e51b81526020600482015260136024820152721bdb9b1e4818db1bdb994818dbdb9d1c9858dd606a1b604482015260640161094d565b610fc981611d59565b50565b600061091d82611ab6565b6008546001600160a01b031633146110015760405162461bcd60e51b815260040161094d90612929565b8051610b5190600a9060208401906123ec565b600061101f82611ec3565b5192915050565b6008546001600160a01b031633146110505760405162461bcd60e51b815260040161094d90612929565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b505050505050565b6008546001600160a01b031633146110e45760405162461bcd60e51b815260040161094d90612929565b601555565b60006001600160a01b038216611112576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111615760405162461bcd60e51b815260040161094d90612929565b61116b6000611fdd565b565b6013546201000090046001600160a01b031632148061119c57506013546201000090046001600160a01b031633145b6111df5760405162461bcd60e51b81526020600482015260146024820152731b99595908185a5c991c9bdc081858d8dbdd5b9d60621b604482015260640161094d565b60005b8151811015610b515761120f82828151811061120057611200612a23565b60200260200101516001611b3d565b8061121981612a39565b9150506111e2565b6008546001600160a01b0316331461124b5760405162461bcd60e51b815260040161094d90612929565b600d92909255600f5560105542600e55565b6008546001600160a01b031633146112875760405162461bcd60e51b815260040161094d90612929565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146112d35760405162461bcd60e51b815260040161094d90612929565b8051610b5190600b9060208401906123ec565b60606003805461098f9061295e565b6008546001600160a01b0316331461131f5760405162461bcd60e51b815260040161094d90612929565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821633141561136b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806113e261202f565b9050600d5481106113f557505060115490565b600d54600f54600091906114098483612a0c565b61141391906129ed565b61141d9190612a6a565b9050601154811161143057601154611432565b805b9250505090565b5090565b6008546001600160a01b031633146114675760405162461bcd60e51b815260040161094d90612929565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190612a7e565b610b515760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015260640161094d565b6008546001600160a01b031633146115405760405162461bcd60e51b815260040161094d90612929565b60405133904780156108fc02916000818181858888f19350505050158015610fc9573d6000803e3d6000fd5b611577848484611b57565b6001600160a01b0383163b15158015611599575061159784848484612052565b155b156115b7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146115e75760405162461bcd60e51b815260040161094d90612929565b601191909155601255565b6008546001600160a01b0316331461161c5760405162461bcd60e51b815260040161094d90612929565b6013805461ffff191692151561ff0019169290921761010091151591909102179055565b606061164b82611ab6565b6116af5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161094d565b600a6116ba8361213b565b6040516020016116cb929190612ab7565b6040516020818303038152906040529050919050565b333b156117275760405162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015260640161094d565b3332146117765760405162461bcd60e51b815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161094d565b600260095414156117c95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161094d565b6002600955600e544210156118125760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081cdd185c9d1959081e595d608a1b604482015260640161094d565b601354610100900460ff166118625760405162461bcd60e51b81526020600482015260166024820152756e6f74207374617274656420796574202d20666c616760501b604482015260640161094d565b60148111156118a45760405162461bcd60e51b815260206004820152600e60248201526d6d6178203230206174206f6e636560901b604482015260640161094d565b601554816118b56001546000540390565b6118bf91906129af565b11156118dd5760405162461bcd60e51b815260040161094d906129c7565b6000816118e8611a5d565b6118f291906129ed565b6014546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd906064016020604051808303816000875af115801561194a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196e9190612a7e565b6119ac5760405162461bcd60e51b815260206004820152600f60248201526e3330b4b632b2103a3930b739b332b960891b604482015260640161094d565b610f373383611b3d565b6060600b805461098f9061295e565b6008546001600160a01b031633146119ef5760405162461bcd60e51b815260040161094d90612929565b6001600160a01b038116611a545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094d565b610fc981611fdd565b600080611a6861202f565b9050600d548110611a7b57505060125490565b600d5460105460009190611a8f8483612a0c565b611a9991906129ed565b611aa39190612a6a565b9050601254811161143057601254611432565b600080548210801561091d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b51828260405180602001604052806000815250612238565b6000611b6282611ec3565b80519091506000906001600160a01b0316336001600160a01b03161480611b9057508151611b909033610858565b80611bab575033611ba084610a12565b6001600160a01b0316145b905080611bcb57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611c005760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c2757604051633a954ecd60e21b815260040160405180910390fd5b611c376000848460000151611ae1565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611d2157600054811015611d2157825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020612bcd83398151915260405160405180910390a45b5050505050565b6000611d6482611ec3565b9050611d766000838360000151611ae1565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116611e8d57600054811015611e8d57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020612bcd833981519152908390a450506001805481019055565b604080516060810182526000808252602082018190529181019190915281600054811015611fc457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fc25780516001600160a01b031615611f59579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fbd579392505050565b611f59565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600e54116120405750600090565b600e5461204d9042612a0c565b905090565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612087903390899088908890600401612b5e565b6020604051808303816000875af19250505080156120c2575060408051601f3d908101601f191682019092526120bf91810190612b9b565b60015b61211d573d8080156120f0576040519150601f19603f3d011682016040523d82523d6000602084013e6120f5565b606091505b508051612115576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161215f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612189578061217381612a39565b91506121829050600a83612a6a565b9150612163565b6000816001600160401b038111156121a3576121a361263e565b6040519080825280601f01601f1916602001820160405280156121cd576020820181803683370190505b5090505b8415612133576121e2600183612a0c565b91506121ef600a86612bb8565b6121fa9060306129af565b60f81b81838151811061220f5761220f612a23565b60200101906001600160f81b031916908160001a905350612231600a86612a6a565b94506121d1565b610adf83838360016000546001600160a01b03851661226957604051622e076360e81b815260040160405180910390fd5b836122875760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561233857506001600160a01b0387163b15155b156123af575b60405182906001600160a01b03891690600090600080516020612bcd833981519152908290a46123776000888480600101955088612052565b612394576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561233e5782600054146123aa57600080fd5b6123e3565b5b6040516001830192906001600160a01b03891690600090600080516020612bcd833981519152908290a4808214156123b0575b50600055611d52565b8280546123f89061295e565b90600052602060002090601f01602090048101928261241a5760008555612460565b82601f1061243357805160ff1916838001178555612460565b82800160010185558215612460579182015b82811115612460578251825591602001919060010190612445565b506114399291505b808211156114395760008155600101612468565b6001600160e01b031981168114610fc957600080fd5b6000602082840312156124a457600080fd5b81356124af8161247c565b9392505050565b6001600160a01b0381168114610fc957600080fd5b6000602082840312156124dd57600080fd5b81356124af816124b6565b60005b838110156125035781810151838201526020016124eb565b838111156115b75750506000910152565b6000815180845261252c8160208601602086016124e8565b601f01601f19169290920160200192915050565b6020815260006124af6020830184612514565b60006020828403121561256557600080fd5b5035919050565b6000806040838503121561257f57600080fd5b823561258a816124b6565b946020939093013593505050565b600080604083850312156125ab57600080fd5b8235915060208301356125bd816124b6565b809150509250929050565b6000806000606084860312156125dd57600080fd5b83356125e8816124b6565b95602085013595506040909401359392505050565b60008060006060848603121561261257600080fd5b833561261d816124b6565b9250602084013561262d816124b6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561267c5761267c61263e565b604052919050565b60006001600160401b0383111561269d5761269d61263e565b6126b0601f8401601f1916602001612654565b90508281528383830111156126c457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156126ed57600080fd5b81356001600160401b0381111561270357600080fd5b8201601f8101841361271457600080fd5b61213384823560208401612684565b6000602080838503121561273657600080fd5b82356001600160401b038082111561274d57600080fd5b818501915085601f83011261276157600080fd5b8135818111156127735761277361263e565b8060051b9150612784848301612654565b818152918301840191848101908884111561279e57600080fd5b938501935b838510156127c857843592506127b8836124b6565b82825293850193908501906127a3565b98975050505050505050565b6000806000606084860312156127e957600080fd5b505081359360208301359350604090920135919050565b8015158114610fc957600080fd5b6000806040838503121561282157600080fd5b823561282c816124b6565b915060208301356125bd81612800565b6000806000806080858703121561285257600080fd5b843561285d816124b6565b9350602085013561286d816124b6565b92506040850135915060608501356001600160401b0381111561288f57600080fd5b8501601f810187136128a057600080fd5b6128af87823560208401612684565b91505092959194509250565b600080604083850312156128ce57600080fd5b50508035926020909101359150565b600080604083850312156128f057600080fd5b823561282c81612800565b6000806040838503121561290e57600080fd5b8235612919816124b6565b915060208301356125bd816124b6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061297257607f821691505b6020821081141561299357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156129c2576129c2612999565b500190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b6000816000190483118215151615612a0757612a07612999565b500290565b600082821015612a1e57612a1e612999565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a4d57612a4d612999565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082612a7957612a79612a54565b500490565b600060208284031215612a9057600080fd5b81516124af81612800565b60008151612aad8185602086016124e8565b9290920192915050565b600080845481600182811c915080831680612ad357607f831692505b6020808410821415612af357634e487b7160e01b86526022600452602486fd5b818015612b075760018114612b1857612b45565b60ff19861689528489019650612b45565b60008b81526020902060005b86811015612b3d5781548b820152908501908301612b24565b505084890196505b505050505050612b558185612a9b565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612514565b9695505050505050565b600060208284031215612bad57600080fd5b81516124af8161247c565b600082612bc757612bc7612a54565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220de4da80e8da9fb44ce0088186ef925c3ecd2bd6489d87e455886159b33e2338464736f6c634300080c003368747470733a2f2f636c6f6e656a756963656170692e67757474657263617467616e672e636f6d2f6d657461646174612f636c6f6e655f6a756963652f697066733a2f2f516d52624150323764466d50776b33676867747143353432565270383639747147465679397453715736434b4d76
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80638313214911610175578063b88d4fde116100dc578063d1beee8511610095578063e985e9c51161006f578063e985e9c51461083d578063f2fde38b14610886578063fd48354e146108a6578063fd79a0ef146108bc57600080fd5b8063d1beee85146107f2578063d5abeb0114610812578063e8a3d4851461082857600080fd5b8063b88d4fde14610732578063ba79149214610752578063c0047f5214610772578063c2c4aa8714610792578063c5487cc8146107b2578063c87b56dd146107d257600080fd5b80639727df571161012e5780639727df5714610692578063a22cb465146106b2578063a7f93ebd146106d2578063acf556a4146106e7578063afdbd499146106fd578063b73c6ce91461071d57600080fd5b806383132149146105e95780638a45a065146106095780638da5cb5b14610629578063929612b114610647578063938e3d7b1461065d57806395d89b411461067d57600080fd5b806342842e0e116102345780636bb7b1d9116101ed578063715018a6116101c7578063715018a61461057b578063729ad39e14610590578063770e6ff5146105b05780637c601fd5146105ca57600080fd5b80636bb7b1d9146105255780636f8b44b01461053b57806370a082311461055b57600080fd5b806342842e0e1461046557806342966c68146104855780634f558e79146104a557806355f804b3146104c55780636352211e146104e55780636b7d24701461050557600080fd5b80630dc28efe116102865780630dc28efe146103c357806318160ddd146103e35780631c8e7d2a146103fc57806323b872dd1461041c578063263d041d1461043c57806341ccb38f1461044f57600080fd5b806301ffc9a7146102ce5780630316ae23146103035780630509e8131461032557806306fdde0314610349578063081812fc1461036b578063095ea7b3146103a3575b600080fd5b3480156102da57600080fd5b506102ee6102e9366004612492565b6108d1565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e3660046124cb565b610923565b005b34801561033157600080fd5b5061033b600f5481565b6040519081526020016102fa565b34801561035557600080fd5b5061035e610980565b6040516102fa9190612540565b34801561037757600080fd5b5061038b610386366004612553565b610a12565b6040516001600160a01b0390911681526020016102fa565b3480156103af57600080fd5b506103236103be36600461256c565b610a56565b3480156103cf57600080fd5b506103236103de366004612598565b610ae4565b3480156103ef57600080fd5b506001546000540361033b565b34801561040857600080fd5b506103236104173660046125c8565b610b55565b34801561042857600080fd5b506103236104373660046125fd565b610bff565b61032361044a366004612553565b610c0a565b34801561045b57600080fd5b5061033b60115481565b34801561047157600080fd5b506103236104803660046125fd565b610f40565b34801561049157600080fd5b506103236104a0366004612553565b610f5b565b3480156104b157600080fd5b506102ee6104c0366004612553565b610fcc565b3480156104d157600080fd5b506103236104e03660046126db565b610fd7565b3480156104f157600080fd5b5061038b610500366004612553565b611014565b34801561051157600080fd5b5061032361052036600461256c565b611026565b34801561053157600080fd5b5061033b600e5481565b34801561054757600080fd5b50610323610556366004612553565b6110ba565b34801561056757600080fd5b5061033b6105763660046124cb565b6110e9565b34801561058757600080fd5b50610323611137565b34801561059c57600080fd5b506103236105ab366004612723565b61116d565b3480156105bc57600080fd5b506013546102ee9060ff1681565b3480156105d657600080fd5b506013546102ee90610100900460ff1681565b3480156105f557600080fd5b506103236106043660046127d4565b611221565b34801561061557600080fd5b506103236106243660046124cb565b61125d565b34801561063557600080fd5b506008546001600160a01b031661038b565b34801561065357600080fd5b5061033b60105481565b34801561066957600080fd5b506103236106783660046126db565b6112a9565b34801561068957600080fd5b5061035e6112e6565b34801561069e57600080fd5b506103236106ad3660046124cb565b6112f5565b3480156106be57600080fd5b506103236106cd36600461280e565b611341565b3480156106de57600080fd5b5061033b6113d7565b3480156106f357600080fd5b5061033b60125481565b34801561070957600080fd5b5061032361071836600461256c565b61143d565b34801561072957600080fd5b50610323611516565b34801561073e57600080fd5b5061032361074d36600461283c565b61156c565b34801561075e57600080fd5b5060145461038b906001600160a01b031681565b34801561077e57600080fd5b50600c5461038b906001600160a01b031681565b34801561079e57600080fd5b506103236107ad3660046128bb565b6115bd565b3480156107be57600080fd5b506103236107cd3660046128dd565b6115f2565b3480156107de57600080fd5b5061035e6107ed366004612553565b611640565b3480156107fe57600080fd5b5061032361080d366004612553565b6116e1565b34801561081e57600080fd5b5061033b60155481565b34801561083457600080fd5b5061035e6119b6565b34801561084957600080fd5b506102ee6108583660046128fb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561089257600080fd5b506103236108a13660046124cb565b6119c5565b3480156108b257600080fd5b5061033b600d5481565b3480156108c857600080fd5b5061033b611a5d565b60006001600160e01b031982166380ac58cd60e01b148061090257506001600160e01b03198216635b5e139f60e01b145b8061091d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109565760405162461bcd60e51b815260040161094d90612929565b60405180910390fd5b601380546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60606002805461098f9061295e565b80601f01602080910402602001604051908101604052809291908181526020018280546109bb9061295e565b8015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b6000610a1d82611ab6565b610a3a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6182611014565b9050806001600160a01b0316836001600160a01b03161415610a965760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ab65750610ab48133610858565b155b15610ad4576040516367d9dca160e11b815260040160405180910390fd5b610adf838383611ae1565b505050565b6008546001600160a01b03163314610b0e5760405162461bcd60e51b815260040161094d90612929565b60155482610b1f6001546000540390565b610b2991906129af565b1115610b475760405162461bcd60e51b815260040161094d906129c7565b610b518183611b3d565b5050565b6008546001600160a01b03163314610b7f5760405162461bcd60e51b815260040161094d90612929565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b158015610be257600080fd5b505af1158015610bf6573d6000803e3d6000fd5b50505050505050565b610adf838383611b57565b333b15610c505760405162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015260640161094d565b333214610c9f5760405162461bcd60e51b815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161094d565b60026009541415610cf25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161094d565b6002600955600e54421015610d3b5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081cdd185c9d1959081e595d608a1b604482015260640161094d565b60135460ff16610d865760405162461bcd60e51b81526020600482015260166024820152756e6f74207374617274656420796574202d20666c616760501b604482015260640161094d565b6014811115610dc85760405162461bcd60e51b815260206004820152600e60248201526d6d6178203230206174206f6e636560901b604482015260640161094d565b60155481610dd96001546000540390565b610de391906129af565b1115610e015760405162461bcd60e51b815260040161094d906129c7565b600081610e0c6113d7565b610e1691906129ed565b905080341015610e5e5760405162461bcd60e51b8152602060048201526013602482015272195d1a081d985b1d59481a5b98dbdc9c9958dd606a1b604482015260640161094d565b610e683383611b3d565b80341115610f3757600033610e7d8334612a0c565b604051600081818185875af1925050503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b5050905080610f355760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094d565b505b50506001600955565b610adf8383836040518060200160405280600081525061156c565b600c546001600160a01b0316321480610f7e5750600c546001600160a01b031633145b610fc05760405162461bcd60e51b81526020600482015260136024820152721bdb9b1e4818db1bdb994818dbdb9d1c9858dd606a1b604482015260640161094d565b610fc981611d59565b50565b600061091d82611ab6565b6008546001600160a01b031633146110015760405162461bcd60e51b815260040161094d90612929565b8051610b5190600a9060208401906123ec565b600061101f82611ec3565b5192915050565b6008546001600160a01b031633146110505760405162461bcd60e51b815260040161094d90612929565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b505050505050565b6008546001600160a01b031633146110e45760405162461bcd60e51b815260040161094d90612929565b601555565b60006001600160a01b038216611112576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111615760405162461bcd60e51b815260040161094d90612929565b61116b6000611fdd565b565b6013546201000090046001600160a01b031632148061119c57506013546201000090046001600160a01b031633145b6111df5760405162461bcd60e51b81526020600482015260146024820152731b99595908185a5c991c9bdc081858d8dbdd5b9d60621b604482015260640161094d565b60005b8151811015610b515761120f82828151811061120057611200612a23565b60200260200101516001611b3d565b8061121981612a39565b9150506111e2565b6008546001600160a01b0316331461124b5760405162461bcd60e51b815260040161094d90612929565b600d92909255600f5560105542600e55565b6008546001600160a01b031633146112875760405162461bcd60e51b815260040161094d90612929565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146112d35760405162461bcd60e51b815260040161094d90612929565b8051610b5190600b9060208401906123ec565b60606003805461098f9061295e565b6008546001600160a01b0316331461131f5760405162461bcd60e51b815260040161094d90612929565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821633141561136b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000806113e261202f565b9050600d5481106113f557505060115490565b600d54600f54600091906114098483612a0c565b61141391906129ed565b61141d9190612a6a565b9050601154811161143057601154611432565b805b9250505090565b5090565b6008546001600160a01b031633146114675760405162461bcd60e51b815260040161094d90612929565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190612a7e565b610b515760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015260640161094d565b6008546001600160a01b031633146115405760405162461bcd60e51b815260040161094d90612929565b60405133904780156108fc02916000818181858888f19350505050158015610fc9573d6000803e3d6000fd5b611577848484611b57565b6001600160a01b0383163b15158015611599575061159784848484612052565b155b156115b7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146115e75760405162461bcd60e51b815260040161094d90612929565b601191909155601255565b6008546001600160a01b0316331461161c5760405162461bcd60e51b815260040161094d90612929565b6013805461ffff191692151561ff0019169290921761010091151591909102179055565b606061164b82611ab6565b6116af5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161094d565b600a6116ba8361213b565b6040516020016116cb929190612ab7565b6040516020818303038152906040529050919050565b333b156117275760405162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604482015260640161094d565b3332146117765760405162461bcd60e51b815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161094d565b600260095414156117c95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161094d565b6002600955600e544210156118125760405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081cdd185c9d1959081e595d608a1b604482015260640161094d565b601354610100900460ff166118625760405162461bcd60e51b81526020600482015260166024820152756e6f74207374617274656420796574202d20666c616760501b604482015260640161094d565b60148111156118a45760405162461bcd60e51b815260206004820152600e60248201526d6d6178203230206174206f6e636560901b604482015260640161094d565b601554816118b56001546000540390565b6118bf91906129af565b11156118dd5760405162461bcd60e51b815260040161094d906129c7565b6000816118e8611a5d565b6118f291906129ed565b6014546040516323b872dd60e01b8152336004820152306024820152604481018390529192506001600160a01b0316906323b872dd906064016020604051808303816000875af115801561194a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196e9190612a7e565b6119ac5760405162461bcd60e51b815260206004820152600f60248201526e3330b4b632b2103a3930b739b332b960891b604482015260640161094d565b610f373383611b3d565b6060600b805461098f9061295e565b6008546001600160a01b031633146119ef5760405162461bcd60e51b815260040161094d90612929565b6001600160a01b038116611a545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094d565b610fc981611fdd565b600080611a6861202f565b9050600d548110611a7b57505060125490565b600d5460105460009190611a8f8483612a0c565b611a9991906129ed565b611aa39190612a6a565b9050601254811161143057601254611432565b600080548210801561091d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610b51828260405180602001604052806000815250612238565b6000611b6282611ec3565b80519091506000906001600160a01b0316336001600160a01b03161480611b9057508151611b909033610858565b80611bab575033611ba084610a12565b6001600160a01b0316145b905080611bcb57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611c005760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c2757604051633a954ecd60e21b815260040160405180910390fd5b611c376000848460000151611ae1565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611d2157600054811015611d2157825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020612bcd83398151915260405160405180910390a45b5050505050565b6000611d6482611ec3565b9050611d766000838360000151611ae1565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116611e8d57600054811015611e8d57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020612bcd833981519152908390a450506001805481019055565b604080516060810182526000808252602082018190529181019190915281600054811015611fc457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fc25780516001600160a01b031615611f59579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fbd579392505050565b611f59565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600e54116120405750600090565b600e5461204d9042612a0c565b905090565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612087903390899088908890600401612b5e565b6020604051808303816000875af19250505080156120c2575060408051601f3d908101601f191682019092526120bf91810190612b9b565b60015b61211d573d8080156120f0576040519150601f19603f3d011682016040523d82523d6000602084013e6120f5565b606091505b508051612115576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161215f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612189578061217381612a39565b91506121829050600a83612a6a565b9150612163565b6000816001600160401b038111156121a3576121a361263e565b6040519080825280601f01601f1916602001820160405280156121cd576020820181803683370190505b5090505b8415612133576121e2600183612a0c565b91506121ef600a86612bb8565b6121fa9060306129af565b60f81b81838151811061220f5761220f612a23565b60200101906001600160f81b031916908160001a905350612231600a86612a6a565b94506121d1565b610adf83838360016000546001600160a01b03851661226957604051622e076360e81b815260040160405180910390fd5b836122875760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561233857506001600160a01b0387163b15155b156123af575b60405182906001600160a01b03891690600090600080516020612bcd833981519152908290a46123776000888480600101955088612052565b612394576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561233e5782600054146123aa57600080fd5b6123e3565b5b6040516001830192906001600160a01b03891690600090600080516020612bcd833981519152908290a4808214156123b0575b50600055611d52565b8280546123f89061295e565b90600052602060002090601f01602090048101928261241a5760008555612460565b82601f1061243357805160ff1916838001178555612460565b82800160010185558215612460579182015b82811115612460578251825591602001919060010190612445565b506114399291505b808211156114395760008155600101612468565b6001600160e01b031981168114610fc957600080fd5b6000602082840312156124a457600080fd5b81356124af8161247c565b9392505050565b6001600160a01b0381168114610fc957600080fd5b6000602082840312156124dd57600080fd5b81356124af816124b6565b60005b838110156125035781810151838201526020016124eb565b838111156115b75750506000910152565b6000815180845261252c8160208601602086016124e8565b601f01601f19169290920160200192915050565b6020815260006124af6020830184612514565b60006020828403121561256557600080fd5b5035919050565b6000806040838503121561257f57600080fd5b823561258a816124b6565b946020939093013593505050565b600080604083850312156125ab57600080fd5b8235915060208301356125bd816124b6565b809150509250929050565b6000806000606084860312156125dd57600080fd5b83356125e8816124b6565b95602085013595506040909401359392505050565b60008060006060848603121561261257600080fd5b833561261d816124b6565b9250602084013561262d816124b6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561267c5761267c61263e565b604052919050565b60006001600160401b0383111561269d5761269d61263e565b6126b0601f8401601f1916602001612654565b90508281528383830111156126c457600080fd5b828260208301376000602084830101529392505050565b6000602082840312156126ed57600080fd5b81356001600160401b0381111561270357600080fd5b8201601f8101841361271457600080fd5b61213384823560208401612684565b6000602080838503121561273657600080fd5b82356001600160401b038082111561274d57600080fd5b818501915085601f83011261276157600080fd5b8135818111156127735761277361263e565b8060051b9150612784848301612654565b818152918301840191848101908884111561279e57600080fd5b938501935b838510156127c857843592506127b8836124b6565b82825293850193908501906127a3565b98975050505050505050565b6000806000606084860312156127e957600080fd5b505081359360208301359350604090920135919050565b8015158114610fc957600080fd5b6000806040838503121561282157600080fd5b823561282c816124b6565b915060208301356125bd81612800565b6000806000806080858703121561285257600080fd5b843561285d816124b6565b9350602085013561286d816124b6565b92506040850135915060608501356001600160401b0381111561288f57600080fd5b8501601f810187136128a057600080fd5b6128af87823560208401612684565b91505092959194509250565b600080604083850312156128ce57600080fd5b50508035926020909101359150565b600080604083850312156128f057600080fd5b823561282c81612800565b6000806040838503121561290e57600080fd5b8235612919816124b6565b915060208301356125bd816124b6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061297257607f821691505b6020821081141561299357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156129c2576129c2612999565b500190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b6000816000190483118215151615612a0757612a07612999565b500290565b600082821015612a1e57612a1e612999565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a4d57612a4d612999565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082612a7957612a79612a54565b500490565b600060208284031215612a9057600080fd5b81516124af81612800565b60008151612aad8185602086016124e8565b9290920192915050565b600080845481600182811c915080831680612ad357607f831692505b6020808410821415612af357634e487b7160e01b86526022600452602486fd5b818015612b075760018114612b1857612b45565b60ff19861689528489019650612b45565b60008b81526020902060005b86811015612b3d5781548b820152908501908301612b24565b505084890196505b505050505050612b558185612a9b565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612514565b9695505050505050565b600060208284031215612bad57600080fd5b81516124af8161247c565b600082612bc757612bc7612a54565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220de4da80e8da9fb44ce0088186ef925c3ecd2bd6489d87e455886159b33e2338464736f6c634300080c0033
Deployed Bytecode Sourcemap
428:7544:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4516:275:0;;;;;;;;;;-1:-1:-1;4516:275:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;4516:275:0;;;;;;;;6487:101:1;;;;;;;;;;-1:-1:-1;6487:101:1;;;;;:::i;:::-;;:::i;:::-;;926:55;;;;;;;;;;;;;;;;;;;1126:25:15;;;1114:2;1099:18;926:55:1;980:177:15;7289:89:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8589:185::-;;;;;;;;;;-1:-1:-1;8589:185:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2284:32:15;;;2266:51;;2254:2;2239:18;8589:185:0;2120:203:15;8220:320:0;;;;;;;;;;-1:-1:-1;8220:320:0;;;;;:::i;:::-;;:::i;5213:150:1:-;;;;;;;;;;-1:-1:-1;5213:150:1;;;;;:::i;:::-;;:::i;3883:261:0:-;;;;;;;;;;-1:-1:-1;4106:12:0;;3927:7;4090:13;:28;3883:261;;7577:183:1;;;;;;;;;;-1:-1:-1;7577:183:1;;;;;:::i;:::-;;:::i;9350:134:0:-;;;;;;;;;;-1:-1:-1;9350:134:0;;;;;:::i;:::-;;:::i;1750:631:1:-;;;;;;:::i;:::-;;:::i;1093:45::-;;;;;;;;;;;;;;;;9538:149:0;;;;;;;;;;-1:-1:-1;9538:149:0;;;;;:::i;:::-;;:::i;3385:179:1:-;;;;;;;;;;-1:-1:-1;3385:179:1;;;;;:::i;:::-;;:::i;4591:93::-;;;;;;;;;;-1:-1:-1;4591:93:1;;;;;:::i;:::-;;:::i;6243:102::-;;;;;;;;;;-1:-1:-1;6243:102:1;;;;;:::i;:::-;;:::i;7126:113:0:-;;;;;;;;;;-1:-1:-1;7126:113:0;;;;;:::i;:::-;;:::i;7386:142:1:-;;;;;;;;;;-1:-1:-1;7386:142:1;;;;;:::i;:::-;;:::i;852:47::-;;;;;;;;;;;;;;;;6639:95;;;;;;;;;;-1:-1:-1;6639:95:1;;;;;:::i;:::-;;:::i;4838:188:0:-;;;;;;;;;;-1:-1:-1;4838:188:0;;;;;:::i;:::-;;:::i;1668:101:2:-;;;;;;;;;;;;;:::i;3060:240:1:-;;;;;;;;;;-1:-1:-1;3060:240:1;;;;;:::i;:::-;;:::i;1220:25::-;;;;;;;;;;-1:-1:-1;1220:25:1;;;;;;;;1248:26;;;;;;;;;;-1:-1:-1;1248:26:1;;;;;;;;;;;5602:315;;;;;;;;;;-1:-1:-1;5602:315:1;;;;;:::i;:::-;;:::i;6826:101::-;;;;;;;;;;-1:-1:-1;6826:101:1;;;;;:::i;:::-;;:::i;1036:85:2:-;;;;;;;;;;-1:-1:-1;1108:6:2;;-1:-1:-1;;;;;1108:6:2;1036:85;;984:59:1;;;;;;;;;;;;;;;;6348:94;;;;;;;;;;-1:-1:-1;6348:94:1;;;;;:::i;:::-;;:::i;7430:93:0:-;;;;;;;;;;;;;:::i;5116:94:1:-;;;;;;;;;;-1:-1:-1;5116:94:1;;;;;:::i;:::-;;:::i;8829:253:0:-;;;;;;;;;;-1:-1:-1;8829:253:0;;;;;:::i;:::-;;:::i;3567:381:1:-;;;;;;;;;;;;;:::i;1141:48::-;;;;;;;;;;;;;;;;7171:170;;;;;;;;;;-1:-1:-1;7171:170:1;;;;;:::i;:::-;;:::i;5366:104::-;;;;;;;;;;;;;:::i;9741:302:0:-;;;;;;;;;;-1:-1:-1;9741:302:0;;;;;:::i;:::-;;:::i;1327:24:1:-;;;;;;;;;;-1:-1:-1;1327:24:1;;;;-1:-1:-1;;;;;1327:24:1;;;716:35;;;;;;;;;;-1:-1:-1;716:35:1;;;;-1:-1:-1;;;;;716:35:1;;;6024:144;;;;;;;;;;-1:-1:-1;6024:144:1;;;;;:::i;:::-;;:::i;6983:137::-;;;;;;;;;;-1:-1:-1;6983:137:1;;;;;:::i;:::-;;:::i;4687:240::-;;;;;;;;;;-1:-1:-1;4687:240:1;;;;;:::i;:::-;;:::i;2496:522::-;;;;;;;;;;-1:-1:-1;2496:522:1;;;;;:::i;:::-;;:::i;1387:32::-;;;;;;;;;;;;;;;;4502:86;;;;;;;;;;;;;:::i;9136:164:0:-;;;;;;;;;;-1:-1:-1;9136:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;9261:25:0;;;9243:4;9261:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9136:164;1918:198:2;;;;;;;;;;-1:-1:-1;1918:198:2;;;;;:::i;:::-;;:::i;806:43:1:-;;;;;;;;;;;;;;;;3951:401;;;;;;;;;;;;;:::i;4516:275:0:-;4628:4;-1:-1:-1;;;;;;4649:40:0;;-1:-1:-1;;;4649:40:0;;:95;;-1:-1:-1;;;;;;;4696:48:0;;-1:-1:-1;;;4696:48:0;4649:95;:138;;;-1:-1:-1;;;;;;;;;;937:40:13;;;4751:36:0;4639:148;4516:275;-1:-1:-1;;4516:275:0:o;6487:101:1:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;;;;;;;;;6557:14:1::1;:27:::0;;-1:-1:-1;;;;;6557:27:1;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;6557:27:1;;::::1;::::0;;;::::1;::::0;;6487:101::o;7289:89:0:-;7343:13;7369:5;7362:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7289:89;:::o;8589:185::-;8657:7;8675:16;8683:7;8675;:16::i;:::-;8670:64;;8700:34;;-1:-1:-1;;;8700:34:0;;;;;;;;;;;8670:64;-1:-1:-1;8746:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;8746:24:0;;8589:185::o;8220:320::-;8286:13;8302:24;8318:7;8302:15;:24::i;:::-;8286:40;;8340:5;-1:-1:-1;;;;;8334:11:0;:2;-1:-1:-1;;;;;8334:11:0;;8330:48;;;8354:24;;-1:-1:-1;;;8354:24:0;;;;;;;;;;;8330:48;719:10:11;-1:-1:-1;;;;;8387:21:0;;;;;;:63;;-1:-1:-1;8413:37:0;8430:5;719:10:11;9136:164:0;:::i;8413:37::-;8412:38;8387:63;8383:121;;;8464:35;;-1:-1:-1;;;8464:35:0;;;;;;;;;;;8383:121;8508:28;8517:2;8521:7;8530:5;8508:8;:28::i;:::-;8282:258;8220:320;;:::o;5213:150:1:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;5311:9:1::1;;5304:3;5288:13;4106:12:0::0;;3927:7;4090:13;:28;;3883:261;5288:13:1::1;:19;;;;:::i;:::-;:32;;5280:57;;;;-1:-1:-1::0;;;5280:57:1::1;;;;;;;:::i;:::-;5341:18;5351:2;5355:3;5341:9;:18::i;:::-;5213:150:::0;;:::o;7577:183::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;7684:72:1::1;::::0;-1:-1:-1;;;7684:72:1;;7722:4:::1;7684:72;::::0;::::1;10819:34:15::0;7729:10:1::1;10869:18:15::0;;;10862:43;10921:18;;;10914:34;;;10964:18;;;10957:34;;;10799:3;11007:19;;;11000:32;-1:-1:-1;11048:19:15;;;11041:30;-1:-1:-1;;;;;7684:29:1;::::1;::::0;::::1;::::0;11088:19:15;;7684:72:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7577:183:::0;;;:::o;9350:134:0:-;9452:28;9462:4;9468:2;9472:7;9452:9;:28::i;1750:631:1:-;1471:10;7926:18;7958:8;1450:57;;;;-1:-1:-1;;;1450:57:1;;11320:2:15;1450:57:1;;;11302:21:15;11359:2;11339:18;;;11332:30;-1:-1:-1;;;11378:18:15;;;11371:50;11438:18;;1450:57:1;11118:344:15;1450:57:1;1519:10;1533:9;1519:23;1511:62;;;;-1:-1:-1;;;1511:62:1;;11669:2:15;1511:62:1;;;11651:21:15;11708:2;11688:18;;;11681:30;11747:28;11727:18;;;11720:56;11793:18;;1511:62:1;11467:350:15;1511:62:1;1744:1:3::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:3;;12024:2:15;2317:63:3::1;::::0;::::1;12006:21:15::0;12063:2;12043:18;;;12036:30;12102:33;12082:18;;;12075:61;12153:18;;2317:63:3::1;11822:355:15::0;2317:63:3::1;1744:1;2455:7;:18:::0;1854:19:1::2;::::0;1835:15:::2;:38;;1827:66;;;::::0;-1:-1:-1;;;1827:66:1;;12384:2:15;1827:66:1::2;::::0;::::2;12366:21:15::0;12423:2;12403:18;;;12396:30;-1:-1:-1;;;12442:18:15;;;12435:45;12497:18;;1827:66:1::2;12182:339:15::0;1827:66:1::2;1905:13;::::0;::::2;;1897:48;;;::::0;-1:-1:-1;;;1897:48:1;;12728:2:15;1897:48:1::2;::::0;::::2;12710:21:15::0;12767:2;12747:18;;;12740:30;-1:-1:-1;;;12786:18:15;;;12779:52;12848:18;;1897:48:1::2;12526:346:15::0;1897:48:1::2;1964:2;1957:3;:9;;1949:36;;;::::0;-1:-1:-1;;;1949:36:1;;13079:2:15;1949:36:1::2;::::0;::::2;13061:21:15::0;13118:2;13098:18;;;13091:30;-1:-1:-1;;;13137:18:15;;;13130:44;13191:18;;1949:36:1::2;12877:338:15::0;1949:36:1::2;2020:9;;2013:3;1997:13;4106:12:0::0;;3927:7;4090:13;:28;;3883:261;1997:13:1::2;:19;;;;:::i;:::-;:32;;1989:57;;;;-1:-1:-1::0;;;1989:57:1::2;;;;;;;:::i;:::-;2051:18;2089:3;2072:14;:12;:14::i;:::-;:20;;;;:::i;:::-;2051:41;;2117:10;2104:9;:23;;2096:55;;;::::0;-1:-1:-1;;;2096:55:1;;13595:2:15;2096:55:1::2;::::0;::::2;13577:21:15::0;13634:2;13614:18;;;13607:30;-1:-1:-1;;;13653:18:15;;;13646:49;13712:18;;2096:55:1::2;13393:343:15::0;2096:55:1::2;2156:26;2166:10;2178:3;2156:9;:26::i;:::-;2202:10;2190:9;:22;2186:192;;;2220:12;2238:10;2262:22;2274:10:::0;2262:9:::2;:22;:::i;:::-;2238:52;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2219:71;;;2303:7;2295:78;;;::::0;-1:-1:-1;;;2295:78:1;;14283:2:15;2295:78:1::2;::::0;::::2;14265:21:15::0;14322:2;14302:18;;;14295:30;14361:34;14341:18;;;14334:62;14432:28;14412:18;;;14405:56;14478:19;;2295:78:1::2;14081:422:15::0;2295:78:1::2;2214:164;2186:192;-1:-1:-1::0;;1701:1:3::1;2628:7;:22:::0;1750:631:1:o;9538:149:0:-;9644:39;9661:4;9667:2;9671:7;9644:39;;;;;;;;;;;;:16;:39::i;3385:179:1:-;3454:20;;-1:-1:-1;;;;;3454:20:1;3441:9;:33;;:71;;-1:-1:-1;3492:20:1;;-1:-1:-1;;;;;3492:20:1;3478:10;:34;3441:71;3429:113;;;;-1:-1:-1;;;3429:113:1;;14710:2:15;3429:113:1;;;14692:21:15;14749:2;14729:18;;;14722:30;-1:-1:-1;;;14768:18:15;;;14761:49;14827:18;;3429:113:1;14508:343:15;3429:113:1;3546:14;3552:7;3546:5;:14::i;:::-;3385:179;:::o;4591:93::-;4646:4;4663:17;4671:8;4663:7;:17::i;6243:102::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;6312:29:1;;::::1;::::0;:16:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;7126:113:0:-:0;7190:7;7210:20;7222:7;7210:11;:20::i;:::-;:25;;7126:113;-1:-1:-1;;7126:113:0:o;7386:142:1:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;7465:59:1::1;::::0;-1:-1:-1;;;7465:59:1;;7502:4:::1;7465:59;::::0;::::1;15096:34:15::0;7509:10:1::1;15146:18:15::0;;;15139:43;15198:18;;;15191:34;;;-1:-1:-1;;;;;7465:28:1;::::1;::::0;::::1;::::0;15031:18:15;;7465:59:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7386:142:::0;;:::o;6639:95::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;6706:9:1::1;:24:::0;6639:95::o;4838:188:0:-;4902:7;-1:-1:-1;;;;;4919:19:0;;4915:60;;4947:28;;-1:-1:-1;;;4947:28:0;;;;;;;;;;;4915:60;-1:-1:-1;;;;;;4994:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;4994:27:0;;4838:188::o;1668:101:2:-;1108:6;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3060:240:1:-;3139:14;;;;;-1:-1:-1;;;;;3139:14:1;3126:9;:27;;:59;;-1:-1:-1;3171:14:1;;;;;-1:-1:-1;;;;;3171:14:1;3157:10;:28;3126:59;3118:92;;;;-1:-1:-1;;;3118:92:1;;15438:2:15;3118:92:1;;;15420:21:15;15477:2;15457:18;;;15450:30;-1:-1:-1;;;15496:18:15;;;15489:50;15556:18;;3118:92:1;15236:344:15;3118:92:1;3219:9;3214:83;3238:9;:16;3234:1;:20;3214:83;;;3266:26;3276:9;3286:1;3276:12;;;;;;;;:::i;:::-;;;;;;;3290:1;3266:9;:26::i;:::-;3256:3;;;;:::i;:::-;;;;3214:83;;5602:315;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;5733:18:1::1;:33:::0;;;;5770:28:::1;:45:::0;5819:32:::1;:53:::0;5898:15:::1;5876:19;:37:::0;5602:315::o;6826:101::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;6896:20:1::1;:27:::0;;-1:-1:-1;;;;;;6896:27:1::1;-1:-1:-1::0;;;;;6896:27:1;;;::::1;::::0;;;::::1;::::0;;6826:101::o;6348:94::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;6417:21:1;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;7430:93:0:-:0;7486:13;7512:7;7505:14;;;;;:::i;5116:94:1:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;5186:9:1::1;:20:::0;;-1:-1:-1;;;;;;5186:20:1::1;-1:-1:-1::0;;;;;5186:20:1;;;::::1;::::0;;;::::1;::::0;;5116:94::o;8829:253:0:-;-1:-1:-1;;;;;8913:24:0;;719:10:11;8913:24:0;8909:54;;;8946:17;;-1:-1:-1;;;8946:17:0;;;;;;;;;;;8909:54;719:10:11;8968:32:0;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;8968:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;8968:53:0;;;;;;;;;;9030:48;;540:41:15;;;8968:42:0;;719:10:11;9030:48:0;;513:18:15;9030:48:0;;;;;;;8829:253;;:::o;3567:381:1:-;3612:7;3625:15;3643:20;:18;:20::i;:::-;3625:38;;3682:18;;3671:7;:29;3667:278;;-1:-1:-1;;3714:18:1;;;3567:381::o;3667:278::-;3841:18;;3805:28;;3748:20;;3841:18;3773:28;3794:7;3841:18;3773:28;:::i;:::-;3772:61;;;;:::i;:::-;3771:88;;;;:::i;:::-;3748:111;;3886:18;;3871:12;:33;:69;;3922:18;;3871:69;;;3907:12;3871:69;3864:76;;;;3567:381;:::o;3667:278::-;3621:327;3567:381;:::o;7171:170::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;7265:52:1::1;::::0;-1:-1:-1;;;7265:52:1;;7297:10:::1;7265:52;::::0;::::1;16288:51:15::0;16355:18;;;16348:34;;;-1:-1:-1;;;;;7265:31:1;::::1;::::0;::::1;::::0;16261:18:15;;7265:52:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7257:80;;;::::0;-1:-1:-1;;;7257:80:1;;16845:2:15;7257:80:1::1;::::0;::::1;16827:21:15::0;16884:2;16864:18;;;16857:30;-1:-1:-1;;;16903:18:15;;;16896:45;16958:18;;7257:80:1::1;16643:339:15::0;5366:104:1;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;5415:51:1::1;::::0;5423:10:::1;::::0;5444:21:::1;5415:51:::0;::::1;;;::::0;::::1;::::0;;;5444:21;5423:10;5415:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;9741:302:0::0;9869:28;9879:4;9885:2;9889:7;9869:9;:28::i;:::-;-1:-1:-1;;;;;9905:13:0;;7926:18:1;7958:8;;9905:76:0;;;;;9925:56;9956:4;9962:2;9966:7;9975:5;9925:30;:56::i;:::-;9924:57;9905:76;9901:139;;;9995:40;;-1:-1:-1;;;9995:40:0;;;;;;;;;;;9901:139;9741:302;;;;:::o;6024:144:1:-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;6103:18:1::1;:26:::0;;;;6133:22:::1;:31:::0;6024:144::o;6983:137::-;1108:6:2;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;7060:13:1::1;:25:::0;;-1:-1:-1;;7089:27:1;7060:25;::::1;;-1:-1:-1::0;;7089:27:1;;;;;7060:25:::1;7089:27:::0;::::1;;::::0;;;::::1;;::::0;;6983:137::o;4687:240::-;4753:13;4780:17;4788:8;4780:7;:17::i;:::-;4772:77;;;;-1:-1:-1;;;4772:77:1;;17189:2:15;4772:77:1;;;17171:21:15;17228:2;17208:18;;;17201:30;17267:34;17247:18;;;17240:62;-1:-1:-1;;;17318:18:15;;;17311:45;17373:19;;4772:77:1;16987:411:15;4772:77:1;4884:16;4902:19;:8;:17;:19::i;:::-;4867:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4853:70;;4687:240;;;:::o;2496:522::-;1471:10;7926:18;7958:8;1450:57;;;;-1:-1:-1;;;1450:57:1;;11320:2:15;1450:57:1;;;11302:21:15;11359:2;11339:18;;;11332:30;-1:-1:-1;;;11378:18:15;;;11371:50;11438:18;;1450:57:1;11118:344:15;1450:57:1;1519:10;1533:9;1519:23;1511:62;;;;-1:-1:-1;;;1511:62:1;;11669:2:15;1511:62:1;;;11651:21:15;11708:2;11688:18;;;11681:30;11747:28;11727:18;;;11720:56;11793:18;;1511:62:1;11467:350:15;1511:62:1;1744:1:3::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:3;;12024:2:15;2317:63:3::1;::::0;::::1;12006:21:15::0;12063:2;12043:18;;;12036:30;12102:33;12082:18;;;12075:61;12153:18;;2317:63:3::1;11822:355:15::0;2317:63:3::1;1744:1;2455:7;:18:::0;2600:19:1::2;::::0;2581:15:::2;:38;;2573:66;;;::::0;-1:-1:-1;;;2573:66:1;;12384:2:15;2573:66:1::2;::::0;::::2;12366:21:15::0;12423:2;12403:18;;;12396:30;-1:-1:-1;;;12442:18:15;;;12435:45;12497:18;;2573:66:1::2;12182:339:15::0;2573:66:1::2;2651:14;::::0;::::2;::::0;::::2;;;2643:49;;;::::0;-1:-1:-1;;;2643:49:1;;12728:2:15;2643:49:1::2;::::0;::::2;12710:21:15::0;12767:2;12747:18;;;12740:30;-1:-1:-1;;;12786:18:15;;;12779:52;12848:18;;2643:49:1::2;12526:346:15::0;2643:49:1::2;2711:2;2704:3;:9;;2696:36;;;::::0;-1:-1:-1;;;2696:36:1;;13079:2:15;2696:36:1::2;::::0;::::2;13061:21:15::0;13118:2;13098:18;;;13091:30;-1:-1:-1;;;13137:18:15;;;13130:44;13191:18;;2696:36:1::2;12877:338:15::0;2696:36:1::2;2767:9;;2760:3;2744:13;4106:12:0::0;;3927:7;4090:13;:28;;3883:261;2744:13:1::2;:19;;;;:::i;:::-;:32;;2736:57;;;;-1:-1:-1::0;;;2736:57:1::2;;;;;;;:::i;:::-;2798:18;2840:3;2819:18;:16;:18::i;:::-;:24;;;;:::i;:::-;2895:9;::::0;2888:69:::2;::::0;-1:-1:-1;;;2888:69:1;;2919:10:::2;2888:69;::::0;::::2;15096:34:15::0;2939:4:1::2;15146:18:15::0;;;15139:43;15198:18;;;15191:34;;;2798:45:1;;-1:-1:-1;;;;;;2895:9:1::2;::::0;2888:30:::2;::::0;15031:18:15;;2888:69:1::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2876:107;;;::::0;-1:-1:-1;;;2876:107:1;;19100:2:15;2876:107:1::2;::::0;::::2;19082:21:15::0;19139:2;19119:18;;;19112:30;-1:-1:-1;;;19158:18:15;;;19151:45;19213:18;;2876:107:1::2;18898:339:15::0;2876:107:1::2;2988:26;2998:10;3010:3;2988:9;:26::i;4502:86::-:0;4546:13;4572:12;4565:19;;;;;:::i;1918:198:2:-;1108:6;;-1:-1:-1;;;;;1108:6:2;719:10:11;1248:23:2;1240:68;;;;-1:-1:-1;;;1240:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:2;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:2;;19444:2:15;1998:73:2::1;::::0;::::1;19426:21:15::0;19483:2;19463:18;;;19456:30;19522:34;19502:18;;;19495:62;-1:-1:-1;;;19573:18:15;;;19566:36;19619:19;;1998:73:2::1;19242:402:15::0;1998:73:2::1;2081:28;2100:8;2081:18;:28::i;3951:401:1:-:0;4000:7;4013:15;4031:20;:18;:20::i;:::-;4013:38;;4070:18;;4059:7;:29;4055:294;;-1:-1:-1;;4102:22:1;;;3951:401::o;4055:294::-;4237:18;;4197:32;;4140:20;;4237:18;4165:28;4186:7;4237:18;4165:28;:::i;:::-;4164:65;;;;:::i;:::-;4163:92;;;;:::i;:::-;4140:115;;4282:22;;4267:12;:37;:77;;4322:22;;4267:77;;10265:163:0;10322:4;10379:13;;10369:7;:23;10339:85;;;;-1:-1:-1;;10397:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;10397:27:0;;;;10396:28;;10265:163::o;16574:153::-;16657:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;16657:29:0;-1:-1:-1;;;;;16657:29:0;;;;;;;;;16695:28;;16657:24;;16695:28;;;;;;;16574:153;;;:::o;10431:93::-;10493:27;10503:2;10507:8;10493:27;;;;;;;;;;;;:9;:27::i;12795:1776::-;12878:35;12916:20;12928:7;12916:11;:20::i;:::-;12983:18;;12878:58;;-1:-1:-1;12941:22:0;;-1:-1:-1;;;;;12967:34:0;719:10:11;-1:-1:-1;;;;;12967:34:0;;:91;;;-1:-1:-1;13025:18:0;;13008:50;;719:10:11;9136:164:0;:::i;13008:50::-;12967:134;;;-1:-1:-1;719:10:11;13065:20:0;13077:7;13065:11;:20::i;:::-;-1:-1:-1;;;;;13065:36:0;;12967:134;12941:161;;13112:17;13107:66;;13138:35;;-1:-1:-1;;;13138:35:0;;;;;;;;;;;13107:66;13203:4;-1:-1:-1;;;;;13181:26:0;:13;:18;;;-1:-1:-1;;;;;13181:26:0;;13177:67;;13216:28;;-1:-1:-1;;;13216:28:0;;;;;;;;;;;13177:67;-1:-1:-1;;;;;13252:16:0;;13248:52;;13277:23;;-1:-1:-1;;;13277:23:0;;;;;;;;;;;13248:52;13398:49;13415:1;13419:7;13428:13;:18;;;13398:8;:49::i;:::-;-1:-1:-1;;;;;13704:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;13704:31:0;;;-1:-1:-1;;;;;13704:31:0;;;-1:-1:-1;;13704:31:0;;;;;;;13740:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;13740:29:0;;;;;;;;;;;13775:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;13810:61:0;;;;-1:-1:-1;;;13855:15:0;13810:61;;;;;;;;;;;14114:11;;;14134:24;;;;;:29;14114:11;;14134:29;14130:351;;14320:13;;14306:11;:27;14302:174;;;14374:18;;;14342:24;;;:11;:24;;;;;;;;:50;;14441:28;;;;-1:-1:-1;;;;;14399:70:0;-1:-1:-1;;;14399:70:0;-1:-1:-1;;;;;;14399:70:0;;;-1:-1:-1;;;;;14342:50:0;;;14399:70;;;;;;;14302:174;13689:796;14513:7;14509:2;-1:-1:-1;;;;;14494:27:0;14503:4;-1:-1:-1;;;;;14494:27:0;-1:-1:-1;;;;;;;;;;;14494:27:0;;;;;;;;;14525:42;12874:1697;;12795:1776;;;:::o;14755:1726::-;14808:35;14846:20;14858:7;14846:11;:20::i;:::-;14808:58;-1:-1:-1;14986:49:0;15003:1;15007:7;15016:13;:18;;;14986:8;:49::i;:::-;15305:18;;-1:-1:-1;;;;;15292:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;15292:45:0;;-1:-1:-1;;;;;15292:45:0;;;-1:-1:-1;;15292:45:0;;;;;;;15355:18;;15342:32;;;;;;;:50;;-1:-1:-1;;;;15342:50:0;;-1:-1:-1;;;15342:50:0;;;;;;-1:-1:-1;15342:50:0;;;;;;;;;;;;15498:18;;15470:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;15470:46:0;;;-1:-1:-1;;;;;;15521:61:0;;;;-1:-1:-1;;;15566:15:0;15521:61;;;;;;;;;;;-1:-1:-1;;;;15587:34:0;;;;;;;15860:11;;;15880:24;;;;;:29;15860:11;;15880:29;15876:351;;16066:13;;16052:11;:27;16048:174;;;16120:18;;;16088:24;;;:11;:24;;;;;;;;:50;;16187:28;;;;-1:-1:-1;;;;;16145:70:0;-1:-1:-1;;;16145:70:0;-1:-1:-1;;;;;;16145:70:0;;;-1:-1:-1;;;;;16088:50:0;;;16145:70;;;;;;;16048:174;-1:-1:-1;16249:18:0;;16240:49;;16281:7;;16277:1;;-1:-1:-1;;;;;16240:49:0;;;;-1:-1:-1;;;;;;;;;;;16240:49:0;16277:1;;16240:49;-1:-1:-1;;16459:12:0;:14;;;;;;14755:1726::o;6310:771::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6413:7:0;6478:13;;6471:4;:20;6440:592;;;6499:31;6533:17;;;:11;:17;;;;;;;;;6499:51;;;;;;;;;-1:-1:-1;;;;;6499:51:0;;;;-1:-1:-1;;;6499:51:0;;-1:-1:-1;;;;;6499:51:0;;;;;;;;-1:-1:-1;;;6499:51:0;;;;;;;;;;;;;;6556:471;;6590:14;;-1:-1:-1;;;;;6590:28:0;;6586:66;;6635:9;6310:771;-1:-1:-1;;;6310:771:0:o;6586:66::-;-1:-1:-1;;;6895:6:0;6921:17;;;;:11;:17;;;;;;;;;6909:29;;;;;;;;;-1:-1:-1;;;;;6909:29:0;;;;;-1:-1:-1;;;6909:29:0;;-1:-1:-1;;;;;6909:29:0;;;;;;;;-1:-1:-1;;;6909:29:0;;;;;;;;;;;;;6950:28;6946:68;;6996:9;6310:771;-1:-1:-1;;;6310:771:0:o;6946:68::-;6874:147;;;6493:539;6440:592;7046:31;;-1:-1:-1;;;7046:31:0;;;;;;;;;;;2270:187:2;2362:6;;;-1:-1:-1;;;;;2378:17:2;;;-1:-1:-1;;;;;;2378:17:2;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;4355:144:1:-;4408:7;4450:1;4428:19;;:23;:67;;-1:-1:-1;4494:1:1;;4355:144::o;4428:67::-;4472:19;;4454:37;;:15;:37;:::i;:::-;4421:74;;4355:144;:::o;17178:522:0:-;17323:72;;-1:-1:-1;;;17323:72:0;;17309:4;;-1:-1:-1;;;;;17323:36:0;;;;;:72;;719:10:11;;17374:4:0;;17380:7;;17389:5;;17323:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17323:72:0;;;;;;;;-1:-1:-1;;17323:72:0;;;;;;;;;;;;:::i;:::-;;;17319:378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17537:13:0;;17533:160;;17570:40;;-1:-1:-1;;;17570:40:0;;;;;;;;;;;17533:160;17674:6;17668:13;17659:6;17655:2;17651:15;17644:38;17319:378;-1:-1:-1;;;;;;17439:55:0;-1:-1:-1;;;17439:55:0;;-1:-1:-1;17319:378:0;17178:522;;;;;;:::o;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;10842:127:0;10933:32;10939:2;10943:8;10953:5;10960:4;11283:20;11306:13;-1:-1:-1;;;;;11327:16:0;;11323:48;;11352:19;;-1:-1:-1;;;11352:19:0;;;;;;;;;;;11323:48;11379:13;11375:44;;11401:18;;-1:-1:-1;;;11401:18:0;;;;;;;;;;;11375:44;-1:-1:-1;;;;;11723:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;11772:49:0;;-1:-1:-1;;;;;11723:44:0;;;;;;;11772:49;;;;-1:-1:-1;;11723:44:0;;;;;;11772:49;;;;;;;;;;;;;;;;11827:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;11867:66:0;;;;-1:-1:-1;;;11917:15:0;11867:66;;;;;;;;;;11827:25;11993:23;;;12026:4;:23;;;;-1:-1:-1;;;;;;12034:13:0;;7926:18:1;7958:8;;12034:15:0;12022:460;;;12057:234;12072:38;;12097:12;;-1:-1:-1;;;;;12072:38:0;;;12089:1;;-1:-1:-1;;;;;;;;;;;12072:38:0;12089:1;;12072:38;12122:69;12161:1;12165:2;12169:14;;;;;;12185:5;12122:30;:69::i;:::-;12117:139;;12208:40;;-1:-1:-1;;;12208:40:0;;;;;;;;;;;12117:139;12286:3;12270:12;:19;;12057:234;;12346:12;12329:13;;:29;12325:43;;12360:8;;;12325:43;12022:460;;;12386:91;12401:40;;12426:14;;;;;-1:-1:-1;;;;;12401:40:0;;;12418:1;;-1:-1:-1;;;;;;;;;;;12401:40:0;12418:1;;12401:40;12472:3;12456:12;:19;;12386:91;;12022:460;-1:-1:-1;12486:13:0;:28;12522:60;9741:302;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;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:15:o;592:131::-;-1:-1:-1;;;;;667:31:15;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;1162:258::-;1234:1;1244:113;1258:6;1255:1;1252:13;1244:113;;;1334:11;;;1328:18;1315:11;;;1308:39;1280:2;1273:10;1244:113;;;1375:6;1372:1;1369:13;1366:48;;;-1:-1:-1;;1410:1:15;1392:16;;1385:27;1162:258::o;1425:269::-;1478:3;1516:5;1510:12;1543:6;1538:3;1531:19;1559:63;1615:6;1608:4;1603:3;1599:14;1592:4;1585:5;1581:16;1559:63;:::i;:::-;1676:2;1655:15;-1:-1:-1;;1651:29:15;1642:39;;;;1683:4;1638:50;;1425:269;-1:-1:-1;;1425:269:15:o;1699:231::-;1848:2;1837:9;1830:21;1811:4;1868:56;1920:2;1909:9;1905:18;1897:6;1868:56;:::i;1935:180::-;1994:6;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;-1:-1:-1;2086:23:15;;1935:180;-1:-1:-1;1935:180:15:o;2328:315::-;2396:6;2404;2457:2;2445:9;2436:7;2432:23;2428:32;2425:52;;;2473:1;2470;2463:12;2425:52;2512:9;2499:23;2531:31;2556:5;2531:31;:::i;:::-;2581:5;2633:2;2618:18;;;;2605:32;;-1:-1:-1;;;2328:315:15:o;2648:::-;2716:6;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2829:9;2816:23;2806:33;;2889:2;2878:9;2874:18;2861:32;2902:31;2927:5;2902:31;:::i;:::-;2952:5;2942:15;;;2648:315;;;;;:::o;2968:400::-;3062:6;3070;3078;3131:2;3119:9;3110:7;3106:23;3102:32;3099:52;;;3147:1;3144;3137:12;3099:52;3186:9;3173:23;3205:31;3230:5;3205:31;:::i;:::-;3255:5;3307:2;3292:18;;3279:32;;-1:-1:-1;3358:2:15;3343:18;;;3330:32;;2968:400;-1:-1:-1;;;2968:400:15:o;3373:456::-;3450:6;3458;3466;3519:2;3507:9;3498:7;3494:23;3490:32;3487:52;;;3535:1;3532;3525:12;3487:52;3574:9;3561:23;3593:31;3618:5;3593:31;:::i;:::-;3643:5;-1:-1:-1;3700:2:15;3685:18;;3672:32;3713:33;3672:32;3713:33;:::i;:::-;3373:456;;3765:7;;-1:-1:-1;;;3819:2:15;3804:18;;;;3791:32;;3373:456::o;3834:127::-;3895:10;3890:3;3886:20;3883:1;3876:31;3926:4;3923:1;3916:15;3950:4;3947:1;3940:15;3966:275;4037:2;4031:9;4102:2;4083:13;;-1:-1:-1;;4079:27:15;4067:40;;-1:-1:-1;;;;;4122:34:15;;4158:22;;;4119:62;4116:88;;;4184:18;;:::i;:::-;4220:2;4213:22;3966:275;;-1:-1:-1;3966:275:15:o;4246:407::-;4311:5;-1:-1:-1;;;;;4337:6:15;4334:30;4331:56;;;4367:18;;:::i;:::-;4405:57;4450:2;4429:15;;-1:-1:-1;;4425:29:15;4456:4;4421:40;4405:57;:::i;:::-;4396:66;;4485:6;4478:5;4471:21;4525:3;4516:6;4511:3;4507:16;4504:25;4501:45;;;4542:1;4539;4532:12;4501:45;4591:6;4586:3;4579:4;4572:5;4568:16;4555:43;4645:1;4638:4;4629:6;4622:5;4618:18;4614:29;4607:40;4246:407;;;;;:::o;4658:451::-;4727:6;4780:2;4768:9;4759:7;4755:23;4751:32;4748:52;;;4796:1;4793;4786:12;4748:52;4836:9;4823:23;-1:-1:-1;;;;;4861:6:15;4858:30;4855:50;;;4901:1;4898;4891:12;4855:50;4924:22;;4977:4;4969:13;;4965:27;-1:-1:-1;4955:55:15;;5006:1;5003;4996:12;4955:55;5029:74;5095:7;5090:2;5077:16;5072:2;5068;5064:11;5029:74;:::i;5450:1021::-;5534:6;5565:2;5608;5596:9;5587:7;5583:23;5579:32;5576:52;;;5624:1;5621;5614:12;5576:52;5664:9;5651:23;-1:-1:-1;;;;;5734:2:15;5726:6;5723:14;5720:34;;;5750:1;5747;5740:12;5720:34;5788:6;5777:9;5773:22;5763:32;;5833:7;5826:4;5822:2;5818:13;5814:27;5804:55;;5855:1;5852;5845:12;5804:55;5891:2;5878:16;5913:2;5909;5906:10;5903:36;;;5919:18;;:::i;:::-;5965:2;5962:1;5958:10;5948:20;;5988:28;6012:2;6008;6004:11;5988:28;:::i;:::-;6050:15;;;6120:11;;;6116:20;;;6081:12;;;;6148:19;;;6145:39;;;6180:1;6177;6170:12;6145:39;6204:11;;;;6224:217;6240:6;6235:3;6232:15;6224:217;;;6320:3;6307:17;6294:30;;6337:31;6362:5;6337:31;:::i;:::-;6381:18;;;6257:12;;;;6419;;;;6224:217;;;6460:5;5450:1021;-1:-1:-1;;;;;;;;5450:1021:15:o;6476:316::-;6553:6;6561;6569;6622:2;6610:9;6601:7;6597:23;6593:32;6590:52;;;6638:1;6635;6628:12;6590:52;-1:-1:-1;;6661:23:15;;;6731:2;6716:18;;6703:32;;-1:-1:-1;6782:2:15;6767:18;;;6754:32;;6476:316;-1:-1:-1;6476:316:15:o;6797:118::-;6883:5;6876:13;6869:21;6862:5;6859:32;6849:60;;6905:1;6902;6895:12;6920:382;6985:6;6993;7046:2;7034:9;7025:7;7021:23;7017:32;7014:52;;;7062:1;7059;7052:12;7014:52;7101:9;7088:23;7120:31;7145:5;7120:31;:::i;:::-;7170:5;-1:-1:-1;7227:2:15;7212:18;;7199:32;7240:30;7199:32;7240:30;:::i;7307:795::-;7402:6;7410;7418;7426;7479:3;7467:9;7458:7;7454:23;7450:33;7447:53;;;7496:1;7493;7486:12;7447:53;7535:9;7522:23;7554:31;7579:5;7554:31;:::i;:::-;7604:5;-1:-1:-1;7661:2:15;7646:18;;7633:32;7674:33;7633:32;7674:33;:::i;:::-;7726:7;-1:-1:-1;7780:2:15;7765:18;;7752:32;;-1:-1:-1;7835:2:15;7820:18;;7807:32;-1:-1:-1;;;;;7851:30:15;;7848:50;;;7894:1;7891;7884:12;7848:50;7917:22;;7970:4;7962:13;;7958:27;-1:-1:-1;7948:55:15;;7999:1;7996;7989:12;7948:55;8022:74;8088:7;8083:2;8070:16;8065:2;8061;8057:11;8022:74;:::i;:::-;8012:84;;;7307:795;;;;;;;:::o;8107:248::-;8175:6;8183;8236:2;8224:9;8215:7;8211:23;8207:32;8204:52;;;8252:1;8249;8242:12;8204:52;-1:-1:-1;;8275:23:15;;;8345:2;8330:18;;;8317:32;;-1:-1:-1;8107:248:15:o;8360:376::-;8422:6;8430;8483:2;8471:9;8462:7;8458:23;8454:32;8451:52;;;8499:1;8496;8489:12;8451:52;8538:9;8525:23;8557:28;8579:5;8557:28;:::i;8741:388::-;8809:6;8817;8870:2;8858:9;8849:7;8845:23;8841:32;8838:52;;;8886:1;8883;8876:12;8838:52;8925:9;8912:23;8944:31;8969:5;8944:31;:::i;:::-;8994:5;-1:-1:-1;9051:2:15;9036:18;;9023:32;9064:33;9023:32;9064:33;:::i;9134:356::-;9336:2;9318:21;;;9355:18;;;9348:30;9414:34;9409:2;9394:18;;9387:62;9481:2;9466:18;;9134:356::o;9495:380::-;9574:1;9570:12;;;;9617;;;9638:61;;9692:4;9684:6;9680:17;9670:27;;9638:61;9745:2;9737:6;9734:14;9714:18;9711:38;9708:161;;;9791:10;9786:3;9782:20;9779:1;9772:31;9826:4;9823:1;9816:15;9854:4;9851:1;9844:15;9708:161;;9495:380;;;:::o;9880:127::-;9941:10;9936:3;9932:20;9929:1;9922:31;9972:4;9969:1;9962:15;9996:4;9993:1;9986:15;10012:128;10052:3;10083:1;10079:6;10076:1;10073:13;10070:39;;;10089:18;;:::i;:::-;-1:-1:-1;10125:9:15;;10012:128::o;10145:336::-;10347:2;10329:21;;;10386:2;10366:18;;;10359:30;-1:-1:-1;;;10420:2:15;10405:18;;10398:42;10472:2;10457:18;;10145:336::o;13220:168::-;13260:7;13326:1;13322;13318:6;13314:14;13311:1;13308:21;13303:1;13296:9;13289:17;13285:45;13282:71;;;13333:18;;:::i;:::-;-1:-1:-1;13373:9:15;;13220:168::o;13741:125::-;13781:4;13809:1;13806;13803:8;13800:34;;;13814:18;;:::i;:::-;-1:-1:-1;13851:9:15;;13741:125::o;15585:127::-;15646:10;15641:3;15637:20;15634:1;15627:31;15677:4;15674:1;15667:15;15701:4;15698:1;15691:15;15717:135;15756:3;-1:-1:-1;;15777:17:15;;15774:43;;;15797:18;;:::i;:::-;-1:-1:-1;15844:1:15;15833:13;;15717:135::o;15857:127::-;15918:10;15913:3;15909:20;15906:1;15899:31;15949:4;15946:1;15939:15;15973:4;15970:1;15963:15;15989:120;16029:1;16055;16045:35;;16060:18;;:::i;:::-;-1:-1:-1;16094:9:15;;15989:120::o;16393:245::-;16460:6;16513:2;16501:9;16492:7;16488:23;16484:32;16481:52;;;16529:1;16526;16519:12;16481:52;16561:9;16555:16;16580:28;16602:5;16580:28;:::i;17529:185::-;17571:3;17609:5;17603:12;17624:52;17669:6;17664:3;17657:4;17650:5;17646:16;17624:52;:::i;:::-;17692:16;;;;;17529:185;-1:-1:-1;;17529:185:15:o;17719:1174::-;17895:3;17924:1;17957:6;17951:13;17987:3;18009:1;18037:9;18033:2;18029:18;18019:28;;18097:2;18086:9;18082:18;18119;18109:61;;18163:4;18155:6;18151:17;18141:27;;18109:61;18189:2;18237;18229:6;18226:14;18206:18;18203:38;18200:165;;;-1:-1:-1;;;18264:33:15;;18320:4;18317:1;18310:15;18350:4;18271:3;18338:17;18200:165;18381:18;18408:104;;;;18526:1;18521:320;;;;18374:467;;18408:104;-1:-1:-1;;18441:24:15;;18429:37;;18486:16;;;;-1:-1:-1;18408:104:15;;18521:320;17476:1;17469:14;;;17513:4;17500:18;;18616:1;18630:165;18644:6;18641:1;18638:13;18630:165;;;18722:14;;18709:11;;;18702:35;18765:16;;;;18659:10;;18630:165;;;18634:3;;18824:6;18819:3;18815:16;18808:23;;18374:467;;;;;;;18857:30;18883:3;18875:6;18857:30;:::i;:::-;18850:37;17719:1174;-1:-1:-1;;;;;17719:1174:15:o;19649:500::-;-1:-1:-1;;;;;19918:15:15;;;19900:34;;19970:15;;19965:2;19950:18;;19943:43;20017:2;20002:18;;19995:34;;;20065:3;20060:2;20045:18;;20038:31;;;19843:4;;20086:57;;20123:19;;20115:6;20086:57;:::i;:::-;20078:65;19649:500;-1:-1:-1;;;;;;19649:500:15:o;20154:249::-;20223:6;20276:2;20264:9;20255:7;20251:23;20247:32;20244:52;;;20292:1;20289;20282:12;20244:52;20324:9;20318:16;20343:30;20367:5;20343:30;:::i;20408:112::-;20440:1;20466;20456:35;;20471:18;;:::i;:::-;-1:-1:-1;20505:9:15;;20408:112::o
Swarm Source
ipfs://de4da80e8da9fb44ce0088186ef925c3ecd2bd6489d87e455886159b33e23384
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.