Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 232 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Enter Auction | 15240656 | 926 days ago | IN | 0 ETH | 0.00186251 | ||||
Enter Auction | 15228247 | 928 days ago | IN | 0 ETH | 0.00221878 | ||||
Enter Auction | 15211429 | 930 days ago | IN | 0 ETH | 0.00149649 | ||||
Enter Auction | 15208307 | 931 days ago | IN | 0 ETH | 0.00110106 | ||||
Enter Auction | 15206687 | 931 days ago | IN | 0 ETH | 0.0029671 | ||||
Enter Auction | 15203966 | 932 days ago | IN | 0 ETH | 0.00079979 | ||||
Enter Auction | 15203955 | 932 days ago | IN | 0 ETH | 0.00112528 | ||||
Enter Auction | 15197958 | 933 days ago | IN | 0 ETH | 0.0011155 | ||||
Enter Auction | 15195885 | 933 days ago | IN | 0 ETH | 0.00115964 | ||||
Enter Auction | 15195497 | 933 days ago | IN | 0 ETH | 0.00193706 | ||||
Enter Auction | 15193765 | 933 days ago | IN | 0 ETH | 0.00364364 | ||||
Enter Auction | 15189033 | 934 days ago | IN | 0 ETH | 0.00225765 | ||||
Enter Auction | 15188543 | 934 days ago | IN | 0 ETH | 0.00255432 | ||||
Enter Auction | 15188380 | 934 days ago | IN | 0 ETH | 0.00337459 | ||||
Enter Auction | 15186240 | 934 days ago | IN | 0 ETH | 0.00338227 | ||||
Enter Auction | 15185824 | 934 days ago | IN | 0 ETH | 0.00181829 | ||||
Enter Auction | 15184198 | 935 days ago | IN | 0 ETH | 0.00217077 | ||||
Enter Auction | 15184179 | 935 days ago | IN | 0 ETH | 0.0021131 | ||||
Enter Auction | 15184164 | 935 days ago | IN | 0 ETH | 0.00146379 | ||||
Enter Auction | 15183361 | 935 days ago | IN | 0 ETH | 0.00339748 | ||||
Enter Auction | 15183357 | 935 days ago | IN | 0 ETH | 0.00276245 | ||||
Enter Auction | 15183235 | 935 days ago | IN | 0 ETH | 0.00295403 | ||||
Enter Auction | 15182568 | 935 days ago | IN | 0 ETH | 0.00205579 | ||||
Enter Auction | 15181193 | 935 days ago | IN | 0 ETH | 0.00436229 | ||||
Enter Auction | 15181193 | 935 days ago | IN | 0 ETH | 0.00420104 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MallowAuctions
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.4; import "./Ownable.sol"; import "./ECDSA.sol"; import "./LOVE.sol"; import "./Strings.sol"; import "./Firepit.sol"; contract MallowAuctions is Ownable{ using Strings for uint; struct Auction{ uint256 id; uint auctionType; string projectName; uint256 startTime; uint256 dutchPriceRate; uint256 dutchTimeRate; uint256 startPrice; uint256 minPrice; string imgSrc; string discordLink; string twitterLink; uint256 maxWhitelists; uint256 req; bool exists; } struct AllInfoRequest{ Auction auction; address[] wlArray; uint256 price; bool isWL; } enum State{ OPEN, CLOSED, UPCOMING, REMOVED } uint256 public totalAuctions = 0; address signer = 0xeFB45a786C8A9fE6D53DdE0E3A4DB6aF54C73DA7; mapping(address => bool) public isApprovedAddress; mapping(string => bool) public auctionExists; mapping(uint256 => Auction) auctionSettings; mapping(uint256 => address[]) whitelists; LOVE public loveContract; Firepit public firepitContract; modifier onlyApprovedAddresses{ require(isApprovedAddress[msg.sender], "UNAUTHORIZED"); _; } function enterAuction(uint256 _auctionId, uint256[] calldata _tokenIds, bytes calldata _signature) external { require(auctionSettings[_auctionId].exists, "Auction does not exist or removed"); require(ECDSA.recover(ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(msg.sender, _tokenIds, _auctionId))), _signature) == signer, "INVALID SIGNATURE"); require(getAuctionState(_auctionId) == State.OPEN, "Auction not open"); require(!isWhitelisted(msg.sender,_auctionId), "Already whiteListed"); require(_tokenIds.length >= auctionSettings[_auctionId].req, "Insufficient requirements"); require(firepitContract.isOwnerOfStakedTokens(_tokenIds, msg.sender), "Not owner of staked tokens"); uint256 auctionPrice = getCurrentPrice(_auctionId); require(loveContract.balanceOf(msg.sender) >= auctionPrice * 1 ether, "Not enough LOVE"); loveContract.burn(msg.sender, auctionPrice * 1 ether); whitelists[_auctionId].push(msg.sender); } function createDutch (string memory _projectName, uint256 _startTime, uint _dutchRate, uint256 _timeRate, uint256 _startPrice, uint256 _minPrice, string memory _imgSrcLink, string memory _discordLink, string memory _twitterLink, uint256 _maxWhitelists, uint256 _req) external onlyApprovedAddresses{ require(!auctionExists[_projectName],"The name already defined"); require(!auctionSettings[totalAuctions].exists,"Auction already exists"); require(_startTime > 0 ,"Incorret time value"); require(_startPrice > 0 ,"Incorret start price value"); require(_minPrice > 0 ,"Incorret min price value"); require(_maxWhitelists > 0 ,"Incorret maxWL value"); auctionSettings[totalAuctions] = Auction({ id: totalAuctions, auctionType: 1, projectName: _projectName, startTime: _startTime, dutchPriceRate: _dutchRate, dutchTimeRate: _timeRate, startPrice: _startPrice, minPrice: _minPrice, imgSrc: _imgSrcLink, discordLink: _discordLink, twitterLink: _twitterLink, maxWhitelists: _maxWhitelists, req: _req, exists: true }); auctionExists[_projectName] = true; totalAuctions++; } function createBuyNow (string memory _projectName, uint _startTime, uint256 _startPrice, string memory _imgSrcLink, string memory _discordLink, string memory _twitterLink, uint256 _maxWhitelists, uint256 _req) external onlyApprovedAddresses{ require(!auctionExists[_projectName],"The name already defined"); require(!auctionSettings[totalAuctions].exists,"Auction already exists"); require(_startTime > 0 ,"Incorret time value"); require(_startPrice > 0 ,"Incorret start price value"); require(_maxWhitelists > 0 ,"Incorret maxWL value"); auctionSettings[totalAuctions] = Auction({ id: totalAuctions, auctionType: 0, projectName: _projectName, startTime: _startTime, dutchPriceRate: 0, dutchTimeRate: 0, startPrice: _startPrice, minPrice: _startPrice, imgSrc: _imgSrcLink, discordLink: _discordLink, twitterLink: _twitterLink, maxWhitelists: _maxWhitelists, req: _req, exists: true }); auctionExists[_projectName] = true; totalAuctions++; } function updateAuction(uint256 _auctionId, string memory _projectName, uint256 _startTime, uint _dutchRate,uint256 _timeRate, uint256 _startPrice, uint256 _minPrice, string memory _imgSrcLink, string memory _discordLink, string memory _twitterLink, uint256 _maxWhitelists, uint256 _req) external onlyApprovedAddresses{ require(auctionSettings[_auctionId].exists,"Auction does not exist or removed"); auctionSettings[_auctionId].projectName = _projectName; auctionSettings[_auctionId].startTime = _startTime; auctionSettings[_auctionId].dutchPriceRate = _dutchRate; auctionSettings[_auctionId].dutchTimeRate = _timeRate; auctionSettings[_auctionId].startPrice = _startPrice; auctionSettings[_auctionId].minPrice = _minPrice; auctionSettings[_auctionId].imgSrc = _imgSrcLink; auctionSettings[_auctionId].discordLink = _discordLink; auctionSettings[_auctionId].twitterLink = _twitterLink; auctionSettings[_auctionId].maxWhitelists = _maxWhitelists; auctionSettings[_auctionId].req = _req; } function removeAuction(uint256 _auctionId) external onlyApprovedAddresses{ delete auctionExists[auctionSettings[_auctionId].projectName]; auctionSettings[_auctionId].exists = false; } function removeAuctions(uint256[] calldata _auctionIds) external onlyApprovedAddresses{ for(uint i = 0; i < _auctionIds.length; i++){ delete auctionExists[auctionSettings[_auctionIds[i]].projectName]; auctionSettings[_auctionIds[i]].exists = false; } } function getAuction(uint256 _auctionId) external view returns (Auction memory){ return auctionSettings[_auctionId]; } function getAuctionName(uint256 _auctionId) external view returns (string memory){ return auctionSettings[_auctionId].projectName; } function getAuctionState(uint256 _auctionId) public view returns (State){ if(!auctionSettings[_auctionId].exists) return State.REMOVED; if(block.timestamp >= auctionSettings[_auctionId].startTime){ if( getAuctionWhitelists(_auctionId).length < auctionSettings[_auctionId].maxWhitelists){ return State.OPEN; } else{ return State.CLOSED; } } else{ return State.UPCOMING; } } function getAuctionWhitelists(uint256 _auctionId) public view returns (address [] memory){ return whitelists[_auctionId]; } function getCurrentPrice(uint256 _auctionId) public view returns (uint256){ require(auctionSettings[_auctionId].exists,"Auction does not exist or removed"); if(auctionSettings[_auctionId].auctionType == 1){ if(block.timestamp < auctionSettings[_auctionId].startTime){ return auctionSettings[_auctionId].startPrice; } uint256 reduction = (block.timestamp - auctionSettings[_auctionId].startTime) / auctionSettings[_auctionId].dutchTimeRate * auctionSettings[_auctionId].dutchPriceRate; uint256 newPrice = auctionSettings[_auctionId].startPrice >= reduction ? (auctionSettings[_auctionId].startPrice - reduction) : 0; return newPrice >= auctionSettings[_auctionId].minPrice ? newPrice : auctionSettings[_auctionId].minPrice; } else{ return auctionSettings[_auctionId].startPrice; } } function isWhitelisted(address _wallet, uint256 _auctionId) public view returns (bool) { for (uint i = 0; i < whitelists[_auctionId].length; i++) { if (whitelists[_auctionId][i] == _wallet) { return true; } } return false; } function countTotalOpened() public view returns (uint256){ uint256 count = 0; for(uint256 i = 0; i < totalAuctions; i++){ if(getAuctionState(i) == State.OPEN){ count++; } } return count; } function countTotalClosed() public view returns (uint256){ uint256 count = 0; for(uint256 i = 0; i < totalAuctions; i++){ if(getAuctionState(i) == State.CLOSED){ count++; } } return count; } function countTotalUpcoming() public view returns (uint256){ uint256 count = 0; for(uint256 i = 0; i < totalAuctions; i++){ if(getAuctionState(i) == State.UPCOMING){ count++; } } return count; } function countTotalRemoved() public view returns (uint256){ uint256 count = 0; for(uint256 i = 0; i < totalAuctions; i++){ if(getAuctionState(i) == State.REMOVED){ count++; } } return count; } function getAuctionsOpened() public view returns (Auction[] memory){ Auction[] memory opened = new Auction[](countTotalOpened()); uint i =0; for(uint f = totalAuctions; f > 0; f--){ if(getAuctionState(f-1) == State.OPEN){ opened[i] = auctionSettings[f-1]; i++; } } return opened; } function getAuctionsClosed() public view returns (Auction[] memory){ Auction[] memory closed = new Auction[](countTotalClosed()); uint i =0; for(uint f = totalAuctions; f > 0; f--){ if(getAuctionState(f-1) == State.CLOSED){ closed[i] = auctionSettings[f-1]; i++; } } return closed; } function getAuctionsUpcoming() public view returns (Auction[] memory){ Auction[] memory upcoming = new Auction[](countTotalUpcoming()); uint i =0; for(uint f = totalAuctions; f > 0; f--){ if(getAuctionState(f-1) == State.UPCOMING){ upcoming[i] = auctionSettings[f-1]; i++; } } return upcoming; } function getXAuctions(uint256 _start, uint256 _x, address _wallet) external view returns (AllInfoRequest[] memory, AllInfoRequest[] memory, AllInfoRequest[] memory){ Auction[] memory opened = getAuctionsOpened(); Auction[] memory closed = getAuctionsClosed(); Auction[] memory upcoming = getAuctionsUpcoming(); AllInfoRequest[] memory Xopened = new AllInfoRequest[](_x); AllInfoRequest[] memory Xclosed = new AllInfoRequest[](_x); AllInfoRequest[] memory Xupcoming = new AllInfoRequest[](upcoming.length); uint t = 0; uint256 i; for(i = _start; i < _x + _start; i++){ if(i >= opened.length){ break; } Xopened[t].auction = opened[i]; Xopened[t].wlArray = getAuctionWhitelists(opened[i].id); Xopened[t].price = getCurrentPrice(opened[i].id); Xopened[t].isWL = isWhitelisted(_wallet,opened[i].id); t++; } t = 0; for(i; i < _x + _start; i++){ if(i >= (closed.length + opened.length)){ break; } Xclosed[t].auction = closed[i-opened.length]; Xclosed[t].wlArray = getAuctionWhitelists(closed[i-opened.length].id); Xclosed[t].price = getCurrentPrice(closed[i-opened.length].id); Xclosed[t].isWL = isWhitelisted(_wallet,closed[i-opened.length].id); t++; } Auction memory aux; uint256 time = block.timestamp; for(i = 0; i < upcoming.length; i++){ for(uint j = 0; j < upcoming.length; j++){ if((upcoming[i].startTime - time) < (upcoming[j].startTime - time)){ aux = upcoming[i]; upcoming[i] = upcoming[j]; upcoming[j] = aux; } } } for(i = 0; i < upcoming.length; i++){ Xupcoming[i].auction = upcoming[i]; Xupcoming[i].wlArray = getAuctionWhitelists(upcoming[i].id); Xupcoming[i].price = getCurrentPrice(upcoming[i].id); Xupcoming[i].isWL = isWhitelisted(_wallet,upcoming[i].id); } return (Xopened, Xclosed, Xupcoming); } function setDependencies(address _loveAddress, address _firepitAddress) external onlyOwner{ loveContract = LOVE(_loveAddress); firepitContract = Firepit(_firepitAddress); } function updateSigner(address _newSigner) external onlyOwner{ signer = _newSigner; } function setApprovedAddresses(address _approvedAddress, bool _set) public onlyOwner(){ isApprovedAddress[_approvedAddress] = _set; } }
// 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/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 (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721.sol'; import './IERC721Receiver.sol'; import './IERC721Metadata.sol'; import './IERC721Enumerable.sol'; import './Address.sol'; import './Context.sol'; import './Strings.sol'; import './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 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @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 (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 { bool isApprovedOrOwner = _isApprovedOrOwner(_msgSender(), tokenId); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); _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 { bool isApprovedOrOwner = _isApprovedOrOwner(_msgSender(), tokenId); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); _transfer(from, to, tokenId); if (!_checkOnERC721Received(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 tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); TokenOwnership memory prevOwnership = ownershipOf(tokenId); return (spender == prevOwnership.addr || getApproved(tokenId) == spender || isApprovedForAll(prevOwnership.addr, spender)); } 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; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _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 do bacano address to, //address do firepit uint256 tokenId ) internal virtual { 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 address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @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 LICENSE pragma solidity ^0.8.4; import "./Ownable.sol"; import "./IERC721Receiver.sol"; import "./Metamallows.sol"; import "./LOVE.sol"; import "./INewFirepit.sol"; contract Firepit is IERC721Receiver,Ownable{ struct stakedInfo{ address owner; uint256 tokenId; uint256 lastUpdate; bool exists; } event tokenStaked(address indexed _owner, uint256 indexed _tokenId, uint256 indexed _lastUpdate); event claimedLove(uint256 indexed _tokenId, uint256 _loveEarned, bool indexed _unstake, address indexed _owner); uint256 constant public LOVE_RATE = 3 ether; uint256 public totalMalloStaked; mapping(uint256 => stakedInfo) firepit; bool public staking = false; Metamallows metamallowContract; LOVE loveContract; function stakingTokens(uint256[] calldata _tokenIds) external{ require(staking,"Staking not available yet"); for (uint i = 0; i < _tokenIds.length; i++) { require (!firepit[_tokenIds[i]].exists, 'Already in stake'); require(msg.sender == metamallowContract.ownerOf(_tokenIds[i]),"Not the owner of this token"); metamallowContract.transferFrom(msg.sender, address(this),_tokenIds[i]); uint256 timestamp = uint80(block.timestamp); firepit[_tokenIds[i]] = stakedInfo({ owner: _msgSender(), tokenId: _tokenIds[i], lastUpdate: timestamp, exists: true }); totalMalloStaked += 1; emit tokenStaked(_msgSender(), _tokenIds[i], timestamp); } } function clamingTokens(uint256[] calldata _tokenIds, bool[] calldata _unstake) external{ require(_tokenIds.length == _unstake.length,"Params must have same lenght"); uint256 reward = 0; for (uint i = 0; i < _tokenIds.length; i++) { require(firepit[_tokenIds[i]].exists,"Not in stake"); require(firepit[_tokenIds[i]].owner == msg.sender, "Not the user which has staked this token"); reward += LOVE_RATE * (block.timestamp - firepit[_tokenIds[i]].lastUpdate) / 1 days; if(_unstake[i]){ metamallowContract.safeTransferFrom(address(this), msg.sender, _tokenIds[i], ""); // Send back the NFT delete firepit[_tokenIds[i]]; totalMalloStaked -= 1; } else{ firepit[_tokenIds[i]].lastUpdate = uint80(block.timestamp); } emit claimedLove(_tokenIds[i], reward, _unstake[i], msg.sender); } loveContract.mint(msg.sender, reward); } function calculateReward(uint256[] calldata _tokenIds) external view returns (uint256){ uint256 total =0; for (uint i = 0; i < _tokenIds.length; i++) { require(firepit[_tokenIds[i]].exists,"Not in stake"); total += (LOVE_RATE * (block.timestamp - firepit[_tokenIds[i]].lastUpdate) / 1 days); } return total; } function viewfirepit (uint256 _tokenId) external view returns (stakedInfo memory){ return firepit[_tokenId]; } function isOwnerOfStakedTokens(uint256[] calldata _tokenIds, address _owner) external view returns (bool){ for(uint i =0; i <_tokenIds.length; i++){ if(firepit[_tokenIds[i]].owner != _owner){ return false; } } return true; } function setStaking(bool _state) external onlyOwner { staking = _state; } function emergencyMigration(address _newContract) external onlyOwner{ INewFirepit contractToMigrate = INewFirepit(_newContract); uint total = totalMalloStaked; for (uint i = 0; i < total; i++) { metamallowContract.safeTransferFrom(address(this), _newContract, firepit[i].tokenId, ""); // Send back the NFT contractToMigrate.migration(firepit[i].owner, firepit[i].tokenId, firepit[i].lastUpdate); delete firepit[i]; totalMalloStaked -= 1; } } function setDependencies(address _loveAddress, address _metamallowsAddress) external onlyOwner{ loveContract = LOVE(_loveAddress); metamallowContract = Metamallows(_metamallowsAddress); } function onERC721Received( address, address from, uint256, bytes calldata ) external pure override returns (bytes4) { require(from == address(0x0), "Must use staking function to send tokens to the Firepit"); return IERC721Receiver.onERC721Received.selector; } }
// 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/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/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./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 (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 (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/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 LICENSE pragma solidity ^0.8.4; interface INewFirepit{ function migration(address _owner, uint256 _tokenId, uint256 _lastUpdate) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.4; import "./ERC20.sol"; import "./Ownable.sol"; contract LOVE is ERC20, Ownable{ mapping(address => bool) public isApprovedAddress; constructor ( string memory _name, string memory _symbol )ERC20(_name,_symbol){ } modifier onlyApprovedAddresses{ require(isApprovedAddress[msg.sender], "You are not authorized!"); _; } function mint(address _to, uint256 _amount) external onlyApprovedAddresses{ _mint(_to, _amount); } function burn(address _to, uint256 _amount) external onlyApprovedAddresses{ _burn(_to, _amount); } function setApprovedAddresses(address _approvedAddress, bool _set) external onlyOwner(){ isApprovedAddress[_approvedAddress] = _set; } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.4; import "./ERC721A.sol"; import "./Ownable.sol"; import "./Firepit.sol"; import "./Strings.sol"; import "./SafeMath.sol"; import "./ECDSA.sol"; contract Metamallows is ERC721A, Ownable { using Strings for uint256; using SafeMath for uint256; enum State { CLOSED, PRESALE, PUBLIC } string public baseURI; uint256 public mintCost = 0.049 ether; uint256 public maxSupply; uint256 public maxPreSupply; uint256 public maxMintAmount = 5; uint256 airdropsNumber = 0; address private partners; address private signer = 0xeFB45a786C8A9fE6D53DdE0E3A4DB6aF54C73DA7; mapping(address => uint256) public nonces; State public saleState = State.CLOSED; Firepit firepitContract; constructor ( string memory _name, string memory _symbol, string memory _initBaseURI, uint256 _maxPreSupply, uint256 _maxSupply, uint256 _airdropsNumber, address _partners ) ERC721A(_name, _symbol){ setBaseURI(_initBaseURI); maxPreSupply = _maxPreSupply; maxSupply = _maxSupply; airdropsNumber = _airdropsNumber; partners = _partners; } function _baseURI() internal view virtual override returns (string memory){ return baseURI; } function tokenURI(uint256 token_id) public view override returns (string memory) { require(_exists(token_id), "nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, token_id.toString())) : ""; } function presaleMint(uint256 _mintAmount, bytes calldata _signature, uint256 _nonce) external payable{ require(saleState == State.PRESALE, "PRESALE unavailable"); require(_mintAmount > 0); require(ECDSA.recover(keccak256(abi.encodePacked(saleState, msg.sender, _nonce)), _signature) == signer, "Signature Invalid"); require(numberMinted(msg.sender) + _mintAmount <= maxMintAmount, "Exceeded mint amount"); require((totalSupply() + _mintAmount) <= maxPreSupply, "PreSale sold out"); require(msg.value >= (mintCost * _mintAmount), "Not enough ether to mint"); nonces[msg.sender]++; _safeMint(msg.sender, _mintAmount); } function publicMint(uint256 _mintAmount) external payable{ require(saleState == State.PUBLIC, "PUBLIC sale unavailable"); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount, "Exceeded mint amount"); require((totalSupply() + _mintAmount) <= maxSupply, "Metamallows sold out"); require(msg.value >= (mintCost * _mintAmount), "Not enough ether to mint"); _safeMint(msg.sender, _mintAmount); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory){ return ownershipOf(tokenId); } function numberMinted(address _owner) public view returns (uint256) { return _numberMinted(_owner); } function airdropsBulk(address[] calldata _airdropWallets, uint256 [] calldata _airdropsNumber) external onlyOwner(){ require(_airdropWallets.length == _airdropsNumber.length, "Invalid mumber of airdrops"); require((totalSupply() + _airdropWallets.length) <= (maxSupply + airdropsNumber), "Cannot mint more"); for (uint i =0; i < _airdropWallets.length; i++) { _safeMint(_airdropWallets[i], _airdropsNumber[i]); } } function airdrop(address _airdropWallet, uint256 quantity) external onlyOwner(){ require((totalSupply() + quantity) <= (maxSupply + airdropsNumber), "Cannot mint more"); _safeMint(_airdropWallet, quantity); } function setAirdropsNumber(uint256 _newAirdropsNumber) external onlyOwner(){ airdropsNumber = _newAirdropsNumber; } function setMaxPreSupply(uint256 _newMaxPreSupply) external onlyOwner(){ require(_newMaxPreSupply <= maxSupply, "Exceeded the total supply"); maxPreSupply = _newMaxPreSupply; } function setDependecies(address _firepitAddress) external onlyOwner{ firepitContract = Firepit(_firepitAddress); } function setSale(uint8 _saleState) external onlyOwner(){ saleState = State(_saleState); } function setMaxMintAmount(uint256 _newmaxMintAmount) external onlyOwner(){ maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner(){ baseURI = _newBaseURI; } function withdrawAll() external onlyOwner(){ require(address(this).balance > 0, "No balance"); uint256 contractBalance = address(this).balance; (bool w1,) = partners.call{value: contractBalance}(""); require(w1, "Withdraw failed"); } function transferFrom( address _from, address _to, uint256 _tokenId ) public virtual override{ // if (_msgSender() != address(firepitContract)){ require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: transfer caller is not owner nor approved"); } _transfer(_from, _to, _tokenId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./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/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"auctionExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countTotalClosed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countTotalOpened","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countTotalRemoved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countTotalUpcoming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"string","name":"_imgSrcLink","type":"string"},{"internalType":"string","name":"_discordLink","type":"string"},{"internalType":"string","name":"_twitterLink","type":"string"},{"internalType":"uint256","name":"_maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"_req","type":"uint256"}],"name":"createBuyNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_dutchRate","type":"uint256"},{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"uint256","name":"_minPrice","type":"uint256"},{"internalType":"string","name":"_imgSrcLink","type":"string"},{"internalType":"string","name":"_discordLink","type":"string"},{"internalType":"string","name":"_twitterLink","type":"string"},{"internalType":"uint256","name":"_maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"_req","type":"uint256"}],"name":"createDutch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"enterAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firepitContract","outputs":[{"internalType":"contract Firepit","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"getAuction","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"getAuctionName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"getAuctionState","outputs":[{"internalType":"enum MallowAuctions.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"getAuctionWhitelists","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuctionsClosed","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuctionsOpened","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuctionsUpcoming","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_x","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"getXAuctions","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction","name":"auction","type":"tuple"},{"internalType":"address[]","name":"wlArray","type":"address[]"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWL","type":"bool"}],"internalType":"struct MallowAuctions.AllInfoRequest[]","name":"","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction","name":"auction","type":"tuple"},{"internalType":"address[]","name":"wlArray","type":"address[]"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWL","type":"bool"}],"internalType":"struct MallowAuctions.AllInfoRequest[]","name":"","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"auctionType","type":"uint256"},{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"dutchPriceRate","type":"uint256"},{"internalType":"uint256","name":"dutchTimeRate","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"string","name":"imgSrc","type":"string"},{"internalType":"string","name":"discordLink","type":"string"},{"internalType":"string","name":"twitterLink","type":"string"},{"internalType":"uint256","name":"maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"req","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct MallowAuctions.Auction","name":"auction","type":"tuple"},{"internalType":"address[]","name":"wlArray","type":"address[]"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWL","type":"bool"}],"internalType":"struct MallowAuctions.AllInfoRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isApprovedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loveContract","outputs":[{"internalType":"contract LOVE","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"}],"name":"removeAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_auctionIds","type":"uint256[]"}],"name":"removeAuctions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approvedAddress","type":"address"},{"internalType":"bool","name":"_set","type":"bool"}],"name":"setApprovedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_loveAddress","type":"address"},{"internalType":"address","name":"_firepitAddress","type":"address"}],"name":"setDependencies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAuctions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_auctionId","type":"uint256"},{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_dutchRate","type":"uint256"},{"internalType":"uint256","name":"_timeRate","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"uint256","name":"_minPrice","type":"uint256"},{"internalType":"string","name":"_imgSrcLink","type":"string"},{"internalType":"string","name":"_discordLink","type":"string"},{"internalType":"string","name":"_twitterLink","type":"string"},{"internalType":"uint256","name":"_maxWhitelists","type":"uint256"},{"internalType":"uint256","name":"_req","type":"uint256"}],"name":"updateAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600155600280546001600160a01b03191673efb45a786c8a9fe6d53dde0e3a4db6af54c73da71790553480156200003c57600080fd5b5062000048336200004e565b6200009e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613f5f80620000ae6000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638af0a8ee1161010f578063c55d0f56116100a2578063d51c6ff311610071578063d51c6ff314610449578063d72be1b114610451578063e87c28a714610464578063f2fde38b1461047757600080fd5b8063c55d0f56146103ed578063ca9a9db914610400578063cca3ef0414610408578063d21f6c221461041b57600080fd5b8063a7ecd37e116100de578063a7ecd37e1461039c578063b157dbbb146103af578063b4c8c5c4146103c2578063bf4a0eba146103e557600080fd5b80638af0a8ee146103685780638da5cb5b146103705780639de20b8514610381578063a42187791461039457600080fd5b8063311ab3411161018757806378bd79351161015657806378bd7935146102e35780637f287277146103035780638237033514610323578063830639ac1461034557600080fd5b8063311ab341146102a2578063366bd2b5146102b5578063705404ec146102c8578063715018a6146102db57600080fd5b80631491420c116101c35780631491420c1461024e57806316002f4a1461026e578063264528bc146102855780632dd7030b1461028d57600080fd5b806232aa99146101e957806304a71fbf14610219578063098810071461022e575b600080fd5b6007546101fc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61022161048a565b6040516102109190613406565b61024161023c366004613468565b610841565b6040516102109190613497565b61026161025c366004613468565b6108b9565b60405161021091906134bf565b61027760015481565b604051908152602001610210565b61027761095e565b6102a061029b366004613468565b6109b5565b005b6102a06102b03660046134fe565b610a47565b6102a06102c33660046135d7565b610a9c565b6102a06102d6366004613711565b610e7b565b6102a0610f67565b6102f66102f1366004613468565b610f9d565b6040516102109190613752565b610316610311366004613468565b61127c565b60405161021091906137a9565b6103366103313660046137bc565b6112e7565b60405161021093929190613882565b6103586103533660046138c5565b6118fc565b6040519015158152602001610210565b610221611985565b6000546001600160a01b03166101fc565b6102a061038f3660046138ef565b611d34565b6102216120c2565b6102a06103aa3660046139c2565b612471565b6102a06103bd3660046139dd565b6124bd565b6103586103d03660046139c2565b60036020526000908152604090205460ff1681565b610277612600565b6102776103fb366004613468565b612651565b61027761279c565b6008546101fc906001600160a01b031681565b610358610429366004613af3565b805160208183018101805160048252928201919093012091525460ff1681565b6102776127ed565b6102a061045f366004613b27565b61283e565b6102a0610472366004613bca565b612cd2565b6102a06104853660046139c2565b612d2a565b6060600061049661095e565b6001600160401b038111156104ad576104ad613535565b6040519080825280602002602001820160405280156104e657816020015b6104d361318a565b8152602001906001900390816104cb5790505b506001549091506000905b801561083957600161050761023c600184613c13565b600381111561051857610518613481565b1415610827576005600061052d600184613c13565b8152602001908152602001600020604051806101c0016040529081600082015481526020016001820154815260200160028201805461056b90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461059790613c2a565b80156105e45780601f106105b9576101008083540402835291602001916105e4565b820191906000526020600020905b8154815290600101906020018083116105c757829003601f168201915b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805461062f90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461065b90613c2a565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016009820180546106c190613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90613c2a565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b50505050508152602001600a8201805461075390613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90613c2a565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff161515606090910152835184908490811061080d5761080d613c5f565b6020026020010181905250818061082390613c75565b9250505b8061083181613c90565b9150506104f1565b509092915050565b6000818152600560205260408120600d015460ff1661086257506003919050565b60008281526005602052604090206003015442106108ac576000828152600560205260409020600b01546108958361127c565b5110156108a457506000919050565b506001919050565b506002919050565b919050565b60008181526005602052604090206002018054606091906108d990613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461090590613c2a565b80156109525780601f1061092757610100808354040283529160200191610952565b820191906000526020600020905b81548152906001019060200180831161093557829003601f168201915b50505050509050919050565b600080805b6001548110156109af57600161097882610841565b600381111561098957610989613481565b141561099d578161099981613c75565b9250505b806109a781613c75565b915050610963565b50919050565b3360009081526003602052604090205460ff166109ed5760405162461bcd60e51b81526004016109e490613ca7565b60405180910390fd5b600460056000838152602001908152602001600020600201604051610a129190613ccd565b9081526040805160209281900383019020805460ff1990811690915560009384526005909252909120600d0180549091169055565b6000546001600160a01b03163314610a715760405162461bcd60e51b81526004016109e490613d69565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b3360009081526003602052604090205460ff16610acb5760405162461bcd60e51b81526004016109e490613ca7565b60048b604051610adb9190613d9e565b9081526040519081900360200190205460ff1615610b365760405162461bcd60e51b8152602060048201526018602482015277151a19481b985b5948185b1c9958591e481919599a5b995960421b60448201526064016109e4565b6001546000908152600560205260409020600d015460ff1615610b945760405162461bcd60e51b815260206004820152601660248201527541756374696f6e20616c72656164792065786973747360501b60448201526064016109e4565b60008a11610bda5760405162461bcd60e51b8152602060048201526013602482015272496e636f727265742074696d652076616c756560681b60448201526064016109e4565b60008711610c2a5760405162461bcd60e51b815260206004820152601a60248201527f496e636f727265742073746172742070726963652076616c756500000000000060448201526064016109e4565b60008611610c7a5760405162461bcd60e51b815260206004820152601860248201527f496e636f72726574206d696e2070726963652076616c7565000000000000000060448201526064016109e4565b60008211610cc15760405162461bcd60e51b8152602060048201526014602482015273496e636f72726574206d6178574c2076616c756560601b60448201526064016109e4565b604051806101c001604052806001548152602001600181526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581525060056000600154815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610d6a9291906131fb565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201518051610db99160088401916020909101906131fb565b506101208201518051610dd69160098401916020909101906131fb565b506101408201518051610df391600a8401916020909101906131fb565b50610160820151600b820155610180820151600c8201556101a090910151600d909101805460ff1916911515919091179055604051600190600490610e39908e90613d9e565b908152604051908190036020019020805491151560ff1990921691909117905560018054906000610e6983613c75565b91905055505050505050505050505050565b3360009081526003602052604090205460ff16610eaa5760405162461bcd60e51b81526004016109e490613ca7565b60005b81811015610f6257600460056000858585818110610ecd57610ecd613c5f565b905060200201358152602001908152602001600020600201604051610ef29190613ccd565b908152604051908190036020019020805460ff191690556000600581858585818110610f2057610f20613c5f565b905060200201358152602001908152602001600020600d0160006101000a81548160ff0219169083151502179055508080610f5a90613c75565b915050610ead565b505050565b6000546001600160a01b03163314610f915760405162461bcd60e51b81526004016109e490613d69565b610f9b6000612dc5565b565b610fa561318a565b60056000838152602001908152602001600020604051806101c00160405290816000820154815260200160018201548152602001600282018054610fe890613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461101490613c2a565b80156110615780601f1061103657610100808354040283529160200191611061565b820191906000526020600020905b81548152906001019060200180831161104457829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180546110ac90613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546110d890613c2a565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b5050505050815260200160098201805461113e90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461116a90613c2a565b80156111b75780601f1061118c576101008083540402835291602001916111b7565b820191906000526020600020905b81548152906001019060200180831161119a57829003601f168201915b50505050508152602001600a820180546111d090613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fc90613c2a565b80156112495780601f1061121e57610100808354040283529160200191611249565b820191906000526020600020905b81548152906001019060200180831161122c57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff16151560609091015292915050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561095257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112be5750505050509050919050565b606080606060006112f66120c2565b9050600061130261048a565b9050600061130e611985565b90506000886001600160401b0381111561132a5761132a613535565b60405190808252806020026020018201604052801561136357816020015b61135061327f565b8152602001906001900390816113485790505b5090506000896001600160401b0381111561138057611380613535565b6040519080825280602002602001820160405280156113b957816020015b6113a661327f565b81526020019060019003908161139e5790505b509050600083516001600160401b038111156113d7576113d7613535565b60405190808252806020026020018201604052801561141057816020015b6113fd61327f565b8152602001906001900390816113f55790505b50905060008c5b6114218e8e613dba565b81101561156c57875181106114355761156c565b87818151811061144757611447613c5f565b602002602001015185838151811061146157611461613c5f565b60200260200101516000018190525061149688828151811061148557611485613c5f565b60200260200101516000015161127c565b8583815181106114a8576114a8613c5f565b6020026020010151602001819052506114dd8882815181106114cc576114cc613c5f565b602002602001015160000151612651565b8583815181106114ef576114ef613c5f565b602002602001015160400181815250506115268c89838151811061151557611515613c5f565b6020026020010151600001516118fc565b85838151811061153857611538613c5f565b60209081029190910101519015156060909101528161155681613c75565b925050808061156490613c75565b915050611417565b600091505b61157b8e8e613dba565b8110156116cf57875187516115909190613dba565b811061159b576116cf565b868851826115a99190613c13565b815181106115b9576115b9613c5f565b60200260200101518483815181106115d3576115d3613c5f565b602002602001015160000181905250611603878951836115f39190613c13565b8151811061148557611485613c5f565b84838151811061161557611615613c5f565b602002602001015160200181905250611645878951836116359190613c13565b815181106114cc576114cc613c5f565b84838151811061165757611657613c5f565b602002602001015160400181815250506116898c888a51846116799190613c13565b8151811061151557611515613c5f565b84838151811061169b5761169b613c5f565b6020908102919091010151901515606090910152816116b981613c75565b92505080806116c790613c75565b915050611571565b6116d761318a565b60009150425b87518310156117e15760005b88518110156117ce578189828151811061170557611705613c5f565b60200260200101516060015161171b9190613c13565b828a868151811061172e5761172e613c5f565b6020026020010151606001516117449190613c13565b10156117bc5788848151811061175c5761175c613c5f565b6020026020010151925088818151811061177857611778613c5f565b602002602001015189858151811061179257611792613c5f565b6020026020010181905250828982815181106117b0576117b0613c5f565b60200260200101819052505b806117c681613c75565b9150506116e9565b50826117d981613c75565b9350506116dd565b600092505b87518310156118e55787838151811061180157611801613c5f565b602002602001015185848151811061181b5761181b613c5f565b60200260200101516000018190525061183f88848151811061148557611485613c5f565b85848151811061185157611851613c5f565b6020026020010151602001819052506118758884815181106114cc576114cc613c5f565b85848151811061188757611887613c5f565b602002602001015160400181815250506118ad8e89858151811061151557611515613c5f565b8584815181106118bf576118bf613c5f565b6020908102919091010151901515606090910152826118dd81613c75565b9350506117e6565b50949e939d50919b50919950505050505050505050565b6000805b60008381526006602052604090205481101561197957600083815260066020526040902080546001600160a01b03861691908390811061194257611942613c5f565b6000918252602090912001546001600160a01b0316141561196757600191505061197f565b8061197181613c75565b915050611900565b50600090505b92915050565b6060600061199161279c565b6001600160401b038111156119a8576119a8613535565b6040519080825280602002602001820160405280156119e157816020015b6119ce61318a565b8152602001906001900390816119c65790505b506001549091506000905b8015610839576002611a0261023c600184613c13565b6003811115611a1357611a13613481565b1415611d225760056000611a28600184613c13565b8152602001908152602001600020604051806101c00160405290816000820154815260200160018201548152602001600282018054611a6690613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9290613c2a565b8015611adf5780601f10611ab457610100808354040283529160200191611adf565b820191906000526020600020905b815481529060010190602001808311611ac257829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054611b2a90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5690613c2a565b8015611ba35780601f10611b7857610100808354040283529160200191611ba3565b820191906000526020600020905b815481529060010190602001808311611b8657829003601f168201915b50505050508152602001600982018054611bbc90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611be890613c2a565b8015611c355780601f10611c0a57610100808354040283529160200191611c35565b820191906000526020600020905b815481529060010190602001808311611c1857829003601f168201915b50505050508152602001600a82018054611c4e90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7a90613c2a565b8015611cc75780601f10611c9c57610100808354040283529160200191611cc7565b820191906000526020600020905b815481529060010190602001808311611caa57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff1615156060909101528351849084908110611d0857611d08613c5f565b60200260200101819052508180611d1e90613c75565b9250505b80611d2c81613c90565b9150506119ec565b3360009081526003602052604090205460ff16611d635760405162461bcd60e51b81526004016109e490613ca7565b600488604051611d739190613d9e565b9081526040519081900360200190205460ff1615611dce5760405162461bcd60e51b8152602060048201526018602482015277151a19481b985b5948185b1c9958591e481919599a5b995960421b60448201526064016109e4565b6001546000908152600560205260409020600d015460ff1615611e2c5760405162461bcd60e51b815260206004820152601660248201527541756374696f6e20616c72656164792065786973747360501b60448201526064016109e4565b60008711611e725760405162461bcd60e51b8152602060048201526013602482015272496e636f727265742074696d652076616c756560681b60448201526064016109e4565b60008611611ec25760405162461bcd60e51b815260206004820152601a60248201527f496e636f727265742073746172742070726963652076616c756500000000000060448201526064016109e4565b60008211611f095760405162461bcd60e51b8152602060048201526014602482015273496e636f72726574206d6178574c2076616c756560601b60448201526064016109e4565b604051806101c0016040528060015481526020016000815260200189815260200188815260200160008152602001600081526020018781526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581525060056000600154815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190611fb49291906131fb565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015180516120039160088401916020909101906131fb565b5061012082015180516120209160098401916020909101906131fb565b50610140820151805161203d91600a8401916020909101906131fb565b50610160820151600b820155610180820151600c8201556101a090910151600d909101805460ff1916911515919091179055604051600190600490612083908b90613d9e565b908152604051908190036020019020805491151560ff19909216919091179055600180549060006120b383613c75565b91905055505050505050505050565b606060006120ce612600565b6001600160401b038111156120e5576120e5613535565b60405190808252806020026020018201604052801561211e57816020015b61210b61318a565b8152602001906001900390816121035790505b506001549091506000905b801561083957600061213f61023c600184613c13565b600381111561215057612150613481565b141561245f5760056000612165600184613c13565b8152602001908152602001600020604051806101c001604052908160008201548152602001600182015481526020016002820180546121a390613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546121cf90613c2a565b801561221c5780601f106121f15761010080835404028352916020019161221c565b820191906000526020600020905b8154815290600101906020018083116121ff57829003601f168201915b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805461226790613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461229390613c2a565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b505050505081526020016009820180546122f990613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461232590613c2a565b80156123725780601f1061234757610100808354040283529160200191612372565b820191906000526020600020905b81548152906001019060200180831161235557829003601f168201915b50505050508152602001600a8201805461238b90613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546123b790613c2a565b80156124045780601f106123d957610100808354040283529160200191612404565b820191906000526020600020905b8154815290600101906020018083116123e757829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff161515606090910152835184908490811061244557612445613c5f565b6020026020010181905250818061245b90613c75565b9250505b8061246981613c90565b915050612129565b6000546001600160a01b0316331461249b5760405162461bcd60e51b81526004016109e490613d69565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526003602052604090205460ff166124ec5760405162461bcd60e51b81526004016109e490613ca7565b60008c8152600560205260409020600d015460ff1661251d5760405162461bcd60e51b81526004016109e490613dd2565b60008c81526005602090815260409091208c51612542926002909201918e01906131fb565b5060008c8152600560208181526040909220600381018d9055600481018c90559081018a90556006810189905560078101889055865161258a926008909201918801906131fb565b5060008c815260056020908152604090912085516125b0926009909201918701906131fb565b5060008c815260056020908152604090912084516125d692600a909201918601906131fb565b5060009b8c5260056020526040909b20600b810191909155600c0199909955505050505050505050565b600080805b6001548110156109af57600061261a82610841565b600381111561262b5761262b613481565b141561263f578161263b81613c75565b9250505b8061264981613c75565b915050612605565b6000818152600560205260408120600d015460ff166126825760405162461bcd60e51b81526004016109e490613dd2565b60008281526005602052604090206001908101541415612786576000828152600560205260409020600301544210156126cb575060009081526005602052604090206006015490565b600082815260056020819052604082206004810154918101546003909101546126f49042613c13565b6126fe9190613e13565b6127089190613e35565b6000848152600560205260408120600601549192509082111561272c576000612749565b600084815260056020526040902060060154612749908390613c13565b60008581526005602052604090206007015490915081101561277c5760008481526005602052604090206007015461277e565b805b949350505050565b5060009081526005602052604090206006015490565b600080805b6001548110156109af5760026127b682610841565b60038111156127c7576127c7613481565b14156127db57816127d781613c75565b9250505b806127e581613c75565b9150506127a1565b600080805b6001548110156109af57600361280782610841565b600381111561281857612818613481565b141561282c578161282881613c75565b9250505b8061283681613c75565b9150506127f2565b6000858152600560205260409020600d015460ff1661286f5760405162461bcd60e51b81526004016109e490613dd2565b6002546040516001600160a01b0390911690612939906128fd9061289d903390899089908c90602001613e54565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e1592505050565b6001600160a01b0316146129835760405162461bcd60e51b8152602060048201526011602482015270494e56414c4944205349474e415455524560781b60448201526064016109e4565b600061298e86610841565b600381111561299f5761299f613481565b146129df5760405162461bcd60e51b815260206004820152601060248201526f20bab1ba34b7b7103737ba1037b832b760811b60448201526064016109e4565b6129e933866118fc565b15612a2c5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d19531a5cdd1959606a1b60448201526064016109e4565b6000858152600560205260409020600c0154831015612a8d5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420726571756972656d656e74730000000000000060448201526064016109e4565b600854604051632907cef960e11b81526001600160a01b039091169063520f9df290612ac190879087903390600401613ea1565b602060405180830381865afa158015612ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b029190613ef3565b612b4e5760405162461bcd60e51b815260206004820152601a60248201527f4e6f74206f776e6572206f66207374616b656420746f6b656e7300000000000060448201526064016109e4565b6000612b5986612651565b9050612b6d81670de0b6b3a7640000613e35565b6007546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd99190613f10565b1015612c195760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204c4f564560881b60448201526064016109e4565b6007546001600160a01b0316639dc29fac33612c3d84670de0b6b3a7640000613e35565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c8357600080fd5b505af1158015612c97573d6000803e3d6000fd5b5050506000968752505060066020908152604086208054600181018255908752952090940180546001600160a01b0319163317905550505050565b6000546001600160a01b03163314612cfc5760405162461bcd60e51b81526004016109e490613d69565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000546001600160a01b03163314612d545760405162461bcd60e51b81526004016109e490613d69565b6001600160a01b038116612db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e4565b612dc281612dc5565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000612e248585612e39565b91509150612e3181612ea9565b509392505050565b600080825160411415612e705760208301516040840151606085015160001a612e6487828585613064565b94509450505050612ea2565b825160401415612e9a5760208301516040840151612e8f868383613151565b935093505050612ea2565b506000905060025b9250929050565b6000816004811115612ebd57612ebd613481565b1415612ec65750565b6001816004811115612eda57612eda613481565b1415612f285760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e4565b6002816004811115612f3c57612f3c613481565b1415612f8a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e4565b6003816004811115612f9e57612f9e613481565b1415612ff75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e4565b600481600481111561300b5761300b613481565b1415612dc25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109e4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561309b5750600090506003613148565b8460ff16601b141580156130b357508460ff16601c14155b156130c45750600090506004613148565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613118573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661314157600060019250925050613148565b9150600090505b94509492505050565b6000806001600160ff1b0383168161316e60ff86901c601b613dba565b905061317c87828885613064565b935093505050935093915050565b604051806101c00160405280600081526020016000815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581525090565b82805461320790613c2a565b90600052602060002090601f016020900481019282613229576000855561326f565b82601f1061324257805160ff191683800117855561326f565b8280016001018555821561326f579182015b8281111561326f578251825591602001919060010190613254565b5061327b9291506132ac565b5090565b604051806080016040528061329261318a565b815260606020820181905260006040830181905291015290565b5b8082111561327b57600081556001016132ad565b60005b838110156132dc5781810151838201526020016132c4565b838111156132eb576000848401525b50505050565b600081518084526133098160208601602086016132c1565b601f01601f19169290920160200192915050565b60006101c082518452602083015160208501526040830151816040860152613347828601826132f1565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518583038287015261339483826132f1565b9250505061012080840151858303828701526133b083826132f1565b9250505061014080840151858303828701526133cc83826132f1565b925050506101608084015181860152506101808084015181860152506101a0808401516133fc8287018215159052565b5090949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561345b57603f1988860301845261344985835161331d565b9450928501929085019060010161342d565b5092979650505050505050565b60006020828403121561347a57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600483106134b957634e487b7160e01b600052602160045260246000fd5b91905290565b6020815260006134d260208301846132f1565b9392505050565b80356001600160a01b03811681146108b457600080fd5b8015158114612dc257600080fd5b6000806040838503121561351157600080fd5b61351a836134d9565b9150602083013561352a816134f0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261355c57600080fd5b81356001600160401b038082111561357657613576613535565b604051601f8301601f19908116603f0116810190828211818310171561359e5761359e613535565b816040528381528660208588010111156135b757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060008060006101608c8e0312156135f957600080fd5b6001600160401b03808d35111561360f57600080fd5b61361c8e8e358f0161354b565b9b5060208d01359a5060408d0135995060608d0135985060808d0135975060a08d013596508060c08e0135111561365257600080fd5b6136628e60c08f01358f0161354b565b95508060e08e0135111561367557600080fd5b6136858e60e08f01358f0161354b565b9450806101008e0135111561369957600080fd5b506136ab8d6101008e01358e0161354b565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008083601f8401126136df57600080fd5b5081356001600160401b038111156136f657600080fd5b6020830191508360208260051b8501011115612ea257600080fd5b6000806020838503121561372457600080fd5b82356001600160401b0381111561373a57600080fd5b613746858286016136cd565b90969095509350505050565b6020815260006134d2602083018461331d565b600081518084526020808501945080840160005b8381101561379e5781516001600160a01b031687529582019590820190600101613779565b509495945050505050565b6020815260006134d26020830184613765565b6000806000606084860312156137d157600080fd5b83359250602084013591506137e8604085016134d9565b90509250925092565b600081518084526020808501808196508360051b8101915082860160005b858110156138755782840389528151608081518187526138318288018261331d565b91505086820151868203888801526138498282613765565b60408481015190890152606093840151151593909701929092525050978401979084019060010161380f565b5091979650505050505050565b60608152600061389560608301866137f1565b82810360208401526138a781866137f1565b905082810360408401526138bb81856137f1565b9695505050505050565b600080604083850312156138d857600080fd5b6138e1836134d9565b946020939093013593505050565b600080600080600080600080610100898b03121561390c57600080fd5b88356001600160401b038082111561392357600080fd5b61392f8c838d0161354b565b995060208b0135985060408b0135975060608b013591508082111561395357600080fd5b61395f8c838d0161354b565b965060808b013591508082111561397557600080fd5b6139818c838d0161354b565b955060a08b013591508082111561399757600080fd5b506139a48b828c0161354b565b93505060c0890135915060e089013590509295985092959890939650565b6000602082840312156139d457600080fd5b6134d2826134d9565b6000806000806000806000806000806000806101808d8f031215613a0057600080fd5b8c359b506001600160401b0360208e01351115613a1c57600080fd5b613a2c8e60208f01358f0161354b565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d013595506001600160401b0360e08e01351115613a6957600080fd5b613a798e60e08f01358f0161354b565b94506001600160401b036101008e01351115613a9457600080fd5b613aa58e6101008f01358f0161354b565b93506001600160401b036101208e01351115613ac057600080fd5b613ad18e6101208f01358f0161354b565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600060208284031215613b0557600080fd5b81356001600160401b03811115613b1b57600080fd5b61277e8482850161354b565b600080600080600060608688031215613b3f57600080fd5b8535945060208601356001600160401b0380821115613b5d57600080fd5b613b6989838a016136cd565b90965094506040880135915080821115613b8257600080fd5b818801915088601f830112613b9657600080fd5b813581811115613ba557600080fd5b896020828501011115613bb757600080fd5b9699959850939650602001949392505050565b60008060408385031215613bdd57600080fd5b613be6836134d9565b9150613bf4602084016134d9565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b600082821015613c2557613c25613bfd565b500390565b600181811c90821680613c3e57607f821691505b602082108114156109af57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600019821415613c8957613c89613bfd565b5060010190565b600081613c9f57613c9f613bfd565b506000190190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600080835481600182811c915080831680613ce957607f831692505b6020808410821415613d0957634e487b7160e01b86526022600452602486fd5b818015613d1d5760018114613d2e57613d5b565b60ff19861689528489019650613d5b565b60008a81526020902060005b86811015613d535781548b820152908501908301613d3a565b505084890196505b509498975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008251613db08184602087016132c1565b9190910192915050565b60008219821115613dcd57613dcd613bfd565b500190565b60208082526021908201527f41756374696f6e20646f6573206e6f74206578697374206f722072656d6f76656040820152601960fa1b606082015260800190565b600082613e3057634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613e4f57613e4f613bfd565b500290565b606085901b6bffffffffffffffffffffffff1916815260006001600160fb1b03841115613e8057600080fd5b8360051b808660148501376014920191820192909252603401949350505050565b6040808252810183905260006001600160fb1b03841115613ec157600080fd5b8360051b8086606085013760009083016060019081526001600160a01b03939093166020909201919091525092915050565b600060208284031215613f0557600080fd5b81516134d2816134f0565b600060208284031215613f2257600080fd5b505191905056fea2646970667358221220ba3f22d6b85a6b96df0b55083543c85a29c54f30ce5ca2e04aa5f542d3b823f164736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c80638af0a8ee1161010f578063c55d0f56116100a2578063d51c6ff311610071578063d51c6ff314610449578063d72be1b114610451578063e87c28a714610464578063f2fde38b1461047757600080fd5b8063c55d0f56146103ed578063ca9a9db914610400578063cca3ef0414610408578063d21f6c221461041b57600080fd5b8063a7ecd37e116100de578063a7ecd37e1461039c578063b157dbbb146103af578063b4c8c5c4146103c2578063bf4a0eba146103e557600080fd5b80638af0a8ee146103685780638da5cb5b146103705780639de20b8514610381578063a42187791461039457600080fd5b8063311ab3411161018757806378bd79351161015657806378bd7935146102e35780637f287277146103035780638237033514610323578063830639ac1461034557600080fd5b8063311ab341146102a2578063366bd2b5146102b5578063705404ec146102c8578063715018a6146102db57600080fd5b80631491420c116101c35780631491420c1461024e57806316002f4a1461026e578063264528bc146102855780632dd7030b1461028d57600080fd5b806232aa99146101e957806304a71fbf14610219578063098810071461022e575b600080fd5b6007546101fc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61022161048a565b6040516102109190613406565b61024161023c366004613468565b610841565b6040516102109190613497565b61026161025c366004613468565b6108b9565b60405161021091906134bf565b61027760015481565b604051908152602001610210565b61027761095e565b6102a061029b366004613468565b6109b5565b005b6102a06102b03660046134fe565b610a47565b6102a06102c33660046135d7565b610a9c565b6102a06102d6366004613711565b610e7b565b6102a0610f67565b6102f66102f1366004613468565b610f9d565b6040516102109190613752565b610316610311366004613468565b61127c565b60405161021091906137a9565b6103366103313660046137bc565b6112e7565b60405161021093929190613882565b6103586103533660046138c5565b6118fc565b6040519015158152602001610210565b610221611985565b6000546001600160a01b03166101fc565b6102a061038f3660046138ef565b611d34565b6102216120c2565b6102a06103aa3660046139c2565b612471565b6102a06103bd3660046139dd565b6124bd565b6103586103d03660046139c2565b60036020526000908152604090205460ff1681565b610277612600565b6102776103fb366004613468565b612651565b61027761279c565b6008546101fc906001600160a01b031681565b610358610429366004613af3565b805160208183018101805160048252928201919093012091525460ff1681565b6102776127ed565b6102a061045f366004613b27565b61283e565b6102a0610472366004613bca565b612cd2565b6102a06104853660046139c2565b612d2a565b6060600061049661095e565b6001600160401b038111156104ad576104ad613535565b6040519080825280602002602001820160405280156104e657816020015b6104d361318a565b8152602001906001900390816104cb5790505b506001549091506000905b801561083957600161050761023c600184613c13565b600381111561051857610518613481565b1415610827576005600061052d600184613c13565b8152602001908152602001600020604051806101c0016040529081600082015481526020016001820154815260200160028201805461056b90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461059790613c2a565b80156105e45780601f106105b9576101008083540402835291602001916105e4565b820191906000526020600020905b8154815290600101906020018083116105c757829003601f168201915b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805461062f90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461065b90613c2a565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016009820180546106c190613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90613c2a565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b50505050508152602001600a8201805461075390613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90613c2a565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff161515606090910152835184908490811061080d5761080d613c5f565b6020026020010181905250818061082390613c75565b9250505b8061083181613c90565b9150506104f1565b509092915050565b6000818152600560205260408120600d015460ff1661086257506003919050565b60008281526005602052604090206003015442106108ac576000828152600560205260409020600b01546108958361127c565b5110156108a457506000919050565b506001919050565b506002919050565b919050565b60008181526005602052604090206002018054606091906108d990613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461090590613c2a565b80156109525780601f1061092757610100808354040283529160200191610952565b820191906000526020600020905b81548152906001019060200180831161093557829003601f168201915b50505050509050919050565b600080805b6001548110156109af57600161097882610841565b600381111561098957610989613481565b141561099d578161099981613c75565b9250505b806109a781613c75565b915050610963565b50919050565b3360009081526003602052604090205460ff166109ed5760405162461bcd60e51b81526004016109e490613ca7565b60405180910390fd5b600460056000838152602001908152602001600020600201604051610a129190613ccd565b9081526040805160209281900383019020805460ff1990811690915560009384526005909252909120600d0180549091169055565b6000546001600160a01b03163314610a715760405162461bcd60e51b81526004016109e490613d69565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b3360009081526003602052604090205460ff16610acb5760405162461bcd60e51b81526004016109e490613ca7565b60048b604051610adb9190613d9e565b9081526040519081900360200190205460ff1615610b365760405162461bcd60e51b8152602060048201526018602482015277151a19481b985b5948185b1c9958591e481919599a5b995960421b60448201526064016109e4565b6001546000908152600560205260409020600d015460ff1615610b945760405162461bcd60e51b815260206004820152601660248201527541756374696f6e20616c72656164792065786973747360501b60448201526064016109e4565b60008a11610bda5760405162461bcd60e51b8152602060048201526013602482015272496e636f727265742074696d652076616c756560681b60448201526064016109e4565b60008711610c2a5760405162461bcd60e51b815260206004820152601a60248201527f496e636f727265742073746172742070726963652076616c756500000000000060448201526064016109e4565b60008611610c7a5760405162461bcd60e51b815260206004820152601860248201527f496e636f72726574206d696e2070726963652076616c7565000000000000000060448201526064016109e4565b60008211610cc15760405162461bcd60e51b8152602060048201526014602482015273496e636f72726574206d6178574c2076616c756560601b60448201526064016109e4565b604051806101c001604052806001548152602001600181526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581525060056000600154815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610d6a9291906131fb565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201518051610db99160088401916020909101906131fb565b506101208201518051610dd69160098401916020909101906131fb565b506101408201518051610df391600a8401916020909101906131fb565b50610160820151600b820155610180820151600c8201556101a090910151600d909101805460ff1916911515919091179055604051600190600490610e39908e90613d9e565b908152604051908190036020019020805491151560ff1990921691909117905560018054906000610e6983613c75565b91905055505050505050505050505050565b3360009081526003602052604090205460ff16610eaa5760405162461bcd60e51b81526004016109e490613ca7565b60005b81811015610f6257600460056000858585818110610ecd57610ecd613c5f565b905060200201358152602001908152602001600020600201604051610ef29190613ccd565b908152604051908190036020019020805460ff191690556000600581858585818110610f2057610f20613c5f565b905060200201358152602001908152602001600020600d0160006101000a81548160ff0219169083151502179055508080610f5a90613c75565b915050610ead565b505050565b6000546001600160a01b03163314610f915760405162461bcd60e51b81526004016109e490613d69565b610f9b6000612dc5565b565b610fa561318a565b60056000838152602001908152602001600020604051806101c00160405290816000820154815260200160018201548152602001600282018054610fe890613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461101490613c2a565b80156110615780601f1061103657610100808354040283529160200191611061565b820191906000526020600020905b81548152906001019060200180831161104457829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180546110ac90613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546110d890613c2a565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b5050505050815260200160098201805461113e90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461116a90613c2a565b80156111b75780601f1061118c576101008083540402835291602001916111b7565b820191906000526020600020905b81548152906001019060200180831161119a57829003601f168201915b50505050508152602001600a820180546111d090613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fc90613c2a565b80156112495780601f1061121e57610100808354040283529160200191611249565b820191906000526020600020905b81548152906001019060200180831161122c57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff16151560609091015292915050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561095257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112be5750505050509050919050565b606080606060006112f66120c2565b9050600061130261048a565b9050600061130e611985565b90506000886001600160401b0381111561132a5761132a613535565b60405190808252806020026020018201604052801561136357816020015b61135061327f565b8152602001906001900390816113485790505b5090506000896001600160401b0381111561138057611380613535565b6040519080825280602002602001820160405280156113b957816020015b6113a661327f565b81526020019060019003908161139e5790505b509050600083516001600160401b038111156113d7576113d7613535565b60405190808252806020026020018201604052801561141057816020015b6113fd61327f565b8152602001906001900390816113f55790505b50905060008c5b6114218e8e613dba565b81101561156c57875181106114355761156c565b87818151811061144757611447613c5f565b602002602001015185838151811061146157611461613c5f565b60200260200101516000018190525061149688828151811061148557611485613c5f565b60200260200101516000015161127c565b8583815181106114a8576114a8613c5f565b6020026020010151602001819052506114dd8882815181106114cc576114cc613c5f565b602002602001015160000151612651565b8583815181106114ef576114ef613c5f565b602002602001015160400181815250506115268c89838151811061151557611515613c5f565b6020026020010151600001516118fc565b85838151811061153857611538613c5f565b60209081029190910101519015156060909101528161155681613c75565b925050808061156490613c75565b915050611417565b600091505b61157b8e8e613dba565b8110156116cf57875187516115909190613dba565b811061159b576116cf565b868851826115a99190613c13565b815181106115b9576115b9613c5f565b60200260200101518483815181106115d3576115d3613c5f565b602002602001015160000181905250611603878951836115f39190613c13565b8151811061148557611485613c5f565b84838151811061161557611615613c5f565b602002602001015160200181905250611645878951836116359190613c13565b815181106114cc576114cc613c5f565b84838151811061165757611657613c5f565b602002602001015160400181815250506116898c888a51846116799190613c13565b8151811061151557611515613c5f565b84838151811061169b5761169b613c5f565b6020908102919091010151901515606090910152816116b981613c75565b92505080806116c790613c75565b915050611571565b6116d761318a565b60009150425b87518310156117e15760005b88518110156117ce578189828151811061170557611705613c5f565b60200260200101516060015161171b9190613c13565b828a868151811061172e5761172e613c5f565b6020026020010151606001516117449190613c13565b10156117bc5788848151811061175c5761175c613c5f565b6020026020010151925088818151811061177857611778613c5f565b602002602001015189858151811061179257611792613c5f565b6020026020010181905250828982815181106117b0576117b0613c5f565b60200260200101819052505b806117c681613c75565b9150506116e9565b50826117d981613c75565b9350506116dd565b600092505b87518310156118e55787838151811061180157611801613c5f565b602002602001015185848151811061181b5761181b613c5f565b60200260200101516000018190525061183f88848151811061148557611485613c5f565b85848151811061185157611851613c5f565b6020026020010151602001819052506118758884815181106114cc576114cc613c5f565b85848151811061188757611887613c5f565b602002602001015160400181815250506118ad8e89858151811061151557611515613c5f565b8584815181106118bf576118bf613c5f565b6020908102919091010151901515606090910152826118dd81613c75565b9350506117e6565b50949e939d50919b50919950505050505050505050565b6000805b60008381526006602052604090205481101561197957600083815260066020526040902080546001600160a01b03861691908390811061194257611942613c5f565b6000918252602090912001546001600160a01b0316141561196757600191505061197f565b8061197181613c75565b915050611900565b50600090505b92915050565b6060600061199161279c565b6001600160401b038111156119a8576119a8613535565b6040519080825280602002602001820160405280156119e157816020015b6119ce61318a565b8152602001906001900390816119c65790505b506001549091506000905b8015610839576002611a0261023c600184613c13565b6003811115611a1357611a13613481565b1415611d225760056000611a28600184613c13565b8152602001908152602001600020604051806101c00160405290816000820154815260200160018201548152602001600282018054611a6690613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9290613c2a565b8015611adf5780601f10611ab457610100808354040283529160200191611adf565b820191906000526020600020905b815481529060010190602001808311611ac257829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054611b2a90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5690613c2a565b8015611ba35780601f10611b7857610100808354040283529160200191611ba3565b820191906000526020600020905b815481529060010190602001808311611b8657829003601f168201915b50505050508152602001600982018054611bbc90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611be890613c2a565b8015611c355780601f10611c0a57610100808354040283529160200191611c35565b820191906000526020600020905b815481529060010190602001808311611c1857829003601f168201915b50505050508152602001600a82018054611c4e90613c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7a90613c2a565b8015611cc75780601f10611c9c57610100808354040283529160200191611cc7565b820191906000526020600020905b815481529060010190602001808311611caa57829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff1615156060909101528351849084908110611d0857611d08613c5f565b60200260200101819052508180611d1e90613c75565b9250505b80611d2c81613c90565b9150506119ec565b3360009081526003602052604090205460ff16611d635760405162461bcd60e51b81526004016109e490613ca7565b600488604051611d739190613d9e565b9081526040519081900360200190205460ff1615611dce5760405162461bcd60e51b8152602060048201526018602482015277151a19481b985b5948185b1c9958591e481919599a5b995960421b60448201526064016109e4565b6001546000908152600560205260409020600d015460ff1615611e2c5760405162461bcd60e51b815260206004820152601660248201527541756374696f6e20616c72656164792065786973747360501b60448201526064016109e4565b60008711611e725760405162461bcd60e51b8152602060048201526013602482015272496e636f727265742074696d652076616c756560681b60448201526064016109e4565b60008611611ec25760405162461bcd60e51b815260206004820152601a60248201527f496e636f727265742073746172742070726963652076616c756500000000000060448201526064016109e4565b60008211611f095760405162461bcd60e51b8152602060048201526014602482015273496e636f72726574206d6178574c2076616c756560601b60448201526064016109e4565b604051806101c0016040528060015481526020016000815260200189815260200188815260200160008152602001600081526020018781526020018781526020018681526020018581526020018481526020018381526020018281526020016001151581525060056000600154815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190611fb49291906131fb565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015180516120039160088401916020909101906131fb565b5061012082015180516120209160098401916020909101906131fb565b50610140820151805161203d91600a8401916020909101906131fb565b50610160820151600b820155610180820151600c8201556101a090910151600d909101805460ff1916911515919091179055604051600190600490612083908b90613d9e565b908152604051908190036020019020805491151560ff19909216919091179055600180549060006120b383613c75565b91905055505050505050505050565b606060006120ce612600565b6001600160401b038111156120e5576120e5613535565b60405190808252806020026020018201604052801561211e57816020015b61210b61318a565b8152602001906001900390816121035790505b506001549091506000905b801561083957600061213f61023c600184613c13565b600381111561215057612150613481565b141561245f5760056000612165600184613c13565b8152602001908152602001600020604051806101c001604052908160008201548152602001600182015481526020016002820180546121a390613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546121cf90613c2a565b801561221c5780601f106121f15761010080835404028352916020019161221c565b820191906000526020600020905b8154815290600101906020018083116121ff57829003601f168201915b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201805461226790613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461229390613c2a565b80156122e05780601f106122b5576101008083540402835291602001916122e0565b820191906000526020600020905b8154815290600101906020018083116122c357829003601f168201915b505050505081526020016009820180546122f990613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461232590613c2a565b80156123725780601f1061234757610100808354040283529160200191612372565b820191906000526020600020905b81548152906001019060200180831161235557829003601f168201915b50505050508152602001600a8201805461238b90613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546123b790613c2a565b80156124045780601f106123d957610100808354040283529160200191612404565b820191906000526020600020905b8154815290600101906020018083116123e757829003601f168201915b5050509183525050600b8201546020820152600c8201546040820152600d9091015460ff161515606090910152835184908490811061244557612445613c5f565b6020026020010181905250818061245b90613c75565b9250505b8061246981613c90565b915050612129565b6000546001600160a01b0316331461249b5760405162461bcd60e51b81526004016109e490613d69565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526003602052604090205460ff166124ec5760405162461bcd60e51b81526004016109e490613ca7565b60008c8152600560205260409020600d015460ff1661251d5760405162461bcd60e51b81526004016109e490613dd2565b60008c81526005602090815260409091208c51612542926002909201918e01906131fb565b5060008c8152600560208181526040909220600381018d9055600481018c90559081018a90556006810189905560078101889055865161258a926008909201918801906131fb565b5060008c815260056020908152604090912085516125b0926009909201918701906131fb565b5060008c815260056020908152604090912084516125d692600a909201918601906131fb565b5060009b8c5260056020526040909b20600b810191909155600c0199909955505050505050505050565b600080805b6001548110156109af57600061261a82610841565b600381111561262b5761262b613481565b141561263f578161263b81613c75565b9250505b8061264981613c75565b915050612605565b6000818152600560205260408120600d015460ff166126825760405162461bcd60e51b81526004016109e490613dd2565b60008281526005602052604090206001908101541415612786576000828152600560205260409020600301544210156126cb575060009081526005602052604090206006015490565b600082815260056020819052604082206004810154918101546003909101546126f49042613c13565b6126fe9190613e13565b6127089190613e35565b6000848152600560205260408120600601549192509082111561272c576000612749565b600084815260056020526040902060060154612749908390613c13565b60008581526005602052604090206007015490915081101561277c5760008481526005602052604090206007015461277e565b805b949350505050565b5060009081526005602052604090206006015490565b600080805b6001548110156109af5760026127b682610841565b60038111156127c7576127c7613481565b14156127db57816127d781613c75565b9250505b806127e581613c75565b9150506127a1565b600080805b6001548110156109af57600361280782610841565b600381111561281857612818613481565b141561282c578161282881613c75565b9250505b8061283681613c75565b9150506127f2565b6000858152600560205260409020600d015460ff1661286f5760405162461bcd60e51b81526004016109e490613dd2565b6002546040516001600160a01b0390911690612939906128fd9061289d903390899089908c90602001613e54565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e1592505050565b6001600160a01b0316146129835760405162461bcd60e51b8152602060048201526011602482015270494e56414c4944205349474e415455524560781b60448201526064016109e4565b600061298e86610841565b600381111561299f5761299f613481565b146129df5760405162461bcd60e51b815260206004820152601060248201526f20bab1ba34b7b7103737ba1037b832b760811b60448201526064016109e4565b6129e933866118fc565b15612a2c5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d19531a5cdd1959606a1b60448201526064016109e4565b6000858152600560205260409020600c0154831015612a8d5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420726571756972656d656e74730000000000000060448201526064016109e4565b600854604051632907cef960e11b81526001600160a01b039091169063520f9df290612ac190879087903390600401613ea1565b602060405180830381865afa158015612ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b029190613ef3565b612b4e5760405162461bcd60e51b815260206004820152601a60248201527f4e6f74206f776e6572206f66207374616b656420746f6b656e7300000000000060448201526064016109e4565b6000612b5986612651565b9050612b6d81670de0b6b3a7640000613e35565b6007546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd99190613f10565b1015612c195760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204c4f564560881b60448201526064016109e4565b6007546001600160a01b0316639dc29fac33612c3d84670de0b6b3a7640000613e35565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c8357600080fd5b505af1158015612c97573d6000803e3d6000fd5b5050506000968752505060066020908152604086208054600181018255908752952090940180546001600160a01b0319163317905550505050565b6000546001600160a01b03163314612cfc5760405162461bcd60e51b81526004016109e490613d69565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000546001600160a01b03163314612d545760405162461bcd60e51b81526004016109e490613d69565b6001600160a01b038116612db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e4565b612dc281612dc5565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000612e248585612e39565b91509150612e3181612ea9565b509392505050565b600080825160411415612e705760208301516040840151606085015160001a612e6487828585613064565b94509450505050612ea2565b825160401415612e9a5760208301516040840151612e8f868383613151565b935093505050612ea2565b506000905060025b9250929050565b6000816004811115612ebd57612ebd613481565b1415612ec65750565b6001816004811115612eda57612eda613481565b1415612f285760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e4565b6002816004811115612f3c57612f3c613481565b1415612f8a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e4565b6003816004811115612f9e57612f9e613481565b1415612ff75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e4565b600481600481111561300b5761300b613481565b1415612dc25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109e4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561309b5750600090506003613148565b8460ff16601b141580156130b357508460ff16601c14155b156130c45750600090506004613148565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613118573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661314157600060019250925050613148565b9150600090505b94509492505050565b6000806001600160ff1b0383168161316e60ff86901c601b613dba565b905061317c87828885613064565b935093505050935093915050565b604051806101c00160405280600081526020016000815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581525090565b82805461320790613c2a565b90600052602060002090601f016020900481019282613229576000855561326f565b82601f1061324257805160ff191683800117855561326f565b8280016001018555821561326f579182015b8281111561326f578251825591602001919060010190613254565b5061327b9291506132ac565b5090565b604051806080016040528061329261318a565b815260606020820181905260006040830181905291015290565b5b8082111561327b57600081556001016132ad565b60005b838110156132dc5781810151838201526020016132c4565b838111156132eb576000848401525b50505050565b600081518084526133098160208601602086016132c1565b601f01601f19169290920160200192915050565b60006101c082518452602083015160208501526040830151816040860152613347828601826132f1565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518583038287015261339483826132f1565b9250505061012080840151858303828701526133b083826132f1565b9250505061014080840151858303828701526133cc83826132f1565b925050506101608084015181860152506101808084015181860152506101a0808401516133fc8287018215159052565b5090949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561345b57603f1988860301845261344985835161331d565b9450928501929085019060010161342d565b5092979650505050505050565b60006020828403121561347a57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60208101600483106134b957634e487b7160e01b600052602160045260246000fd5b91905290565b6020815260006134d260208301846132f1565b9392505050565b80356001600160a01b03811681146108b457600080fd5b8015158114612dc257600080fd5b6000806040838503121561351157600080fd5b61351a836134d9565b9150602083013561352a816134f0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261355c57600080fd5b81356001600160401b038082111561357657613576613535565b604051601f8301601f19908116603f0116810190828211818310171561359e5761359e613535565b816040528381528660208588010111156135b757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060008060006101608c8e0312156135f957600080fd5b6001600160401b03808d35111561360f57600080fd5b61361c8e8e358f0161354b565b9b5060208d01359a5060408d0135995060608d0135985060808d0135975060a08d013596508060c08e0135111561365257600080fd5b6136628e60c08f01358f0161354b565b95508060e08e0135111561367557600080fd5b6136858e60e08f01358f0161354b565b9450806101008e0135111561369957600080fd5b506136ab8d6101008e01358e0161354b565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008083601f8401126136df57600080fd5b5081356001600160401b038111156136f657600080fd5b6020830191508360208260051b8501011115612ea257600080fd5b6000806020838503121561372457600080fd5b82356001600160401b0381111561373a57600080fd5b613746858286016136cd565b90969095509350505050565b6020815260006134d2602083018461331d565b600081518084526020808501945080840160005b8381101561379e5781516001600160a01b031687529582019590820190600101613779565b509495945050505050565b6020815260006134d26020830184613765565b6000806000606084860312156137d157600080fd5b83359250602084013591506137e8604085016134d9565b90509250925092565b600081518084526020808501808196508360051b8101915082860160005b858110156138755782840389528151608081518187526138318288018261331d565b91505086820151868203888801526138498282613765565b60408481015190890152606093840151151593909701929092525050978401979084019060010161380f565b5091979650505050505050565b60608152600061389560608301866137f1565b82810360208401526138a781866137f1565b905082810360408401526138bb81856137f1565b9695505050505050565b600080604083850312156138d857600080fd5b6138e1836134d9565b946020939093013593505050565b600080600080600080600080610100898b03121561390c57600080fd5b88356001600160401b038082111561392357600080fd5b61392f8c838d0161354b565b995060208b0135985060408b0135975060608b013591508082111561395357600080fd5b61395f8c838d0161354b565b965060808b013591508082111561397557600080fd5b6139818c838d0161354b565b955060a08b013591508082111561399757600080fd5b506139a48b828c0161354b565b93505060c0890135915060e089013590509295985092959890939650565b6000602082840312156139d457600080fd5b6134d2826134d9565b6000806000806000806000806000806000806101808d8f031215613a0057600080fd5b8c359b506001600160401b0360208e01351115613a1c57600080fd5b613a2c8e60208f01358f0161354b565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d013595506001600160401b0360e08e01351115613a6957600080fd5b613a798e60e08f01358f0161354b565b94506001600160401b036101008e01351115613a9457600080fd5b613aa58e6101008f01358f0161354b565b93506001600160401b036101208e01351115613ac057600080fd5b613ad18e6101208f01358f0161354b565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600060208284031215613b0557600080fd5b81356001600160401b03811115613b1b57600080fd5b61277e8482850161354b565b600080600080600060608688031215613b3f57600080fd5b8535945060208601356001600160401b0380821115613b5d57600080fd5b613b6989838a016136cd565b90965094506040880135915080821115613b8257600080fd5b818801915088601f830112613b9657600080fd5b813581811115613ba557600080fd5b896020828501011115613bb757600080fd5b9699959850939650602001949392505050565b60008060408385031215613bdd57600080fd5b613be6836134d9565b9150613bf4602084016134d9565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b600082821015613c2557613c25613bfd565b500390565b600181811c90821680613c3e57607f821691505b602082108114156109af57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600019821415613c8957613c89613bfd565b5060010190565b600081613c9f57613c9f613bfd565b506000190190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600080835481600182811c915080831680613ce957607f831692505b6020808410821415613d0957634e487b7160e01b86526022600452602486fd5b818015613d1d5760018114613d2e57613d5b565b60ff19861689528489019650613d5b565b60008a81526020902060005b86811015613d535781548b820152908501908301613d3a565b505084890196505b509498975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008251613db08184602087016132c1565b9190910192915050565b60008219821115613dcd57613dcd613bfd565b500190565b60208082526021908201527f41756374696f6e20646f6573206e6f74206578697374206f722072656d6f76656040820152601960fa1b606082015260800190565b600082613e3057634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613e4f57613e4f613bfd565b500290565b606085901b6bffffffffffffffffffffffff1916815260006001600160fb1b03841115613e8057600080fd5b8360051b808660148501376014920191820192909252603401949350505050565b6040808252810183905260006001600160fb1b03841115613ec157600080fd5b8360051b8086606085013760009083016060019081526001600160a01b03939093166020909201919091525092915050565b600060208284031215613f0557600080fd5b81516134d2816134f0565b600060208284031215613f2257600080fd5b505191905056fea2646970667358221220ba3f22d6b85a6b96df0b55083543c85a29c54f30ce5ca2e04aa5f542d3b823f164736f6c634300080a0033
Deployed Bytecode Sourcemap
181:13581:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1185:24;;;;;-1:-1:-1;;;;;1185:24:16;;;;;;-1:-1:-1;;;;;191:32:21;;;173:51;;161:2;146:18;1185:24:16;;;;;;;;10265:383;;;:::i;:::-;;;;;;;:::i;6847:508::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6693:144::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;869:32::-;;;;;;;;;4219:25:21;;;4207:2;4192:18;869:32:16;4073:177:21;9041:266:16;;;:::i;6039:203::-;;;;;;:::i;:::-;;:::i;:::-;;13616:144;;;;;;:::i;:::-;;:::i;2399:1325::-;;;;;;:::i;:::-;;:::i;6252:296::-;;;;;;:::i;:::-;;:::i;1660:101:18:-;;;:::i;6554:129:16:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7365:135::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11065:2243::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;8466:292::-;;;;;;:::i;:::-;;:::i;:::-;;;11780:14:21;;11773:22;11755:41;;11743:2;11728:18;8466:292:16;11615:187:21;10658:397:16;;;:::i;1028:85:18:-;1074:7;1100:6;-1:-1:-1;;;;;1100:6:18;1028:85;;3734:1193:16;;;;;;:::i;:::-;;:::i;9874:381::-;;;:::i;13514:96::-;;;;;;:::i;:::-;;:::i;4937:1092::-;;;;;;:::i;:::-;;:::i;974:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8767:264;;;:::i;7510:946::-;;;;;;:::i;:::-;;:::i;9316:270::-;;;:::i;1218:30::-;;;;;-1:-1:-1;;;;;1218:30:16;;;1030:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9596:268;;;:::i;1378:1011::-;;;;;;:::i;:::-;;:::i;13314:192::-;;;;;;:::i;:::-;;:::i;1910:198:18:-;;;;;;:::i;:::-;;:::i;10265:383:16:-;10315:16;10342:23;10382:18;:16;:18::i;:::-;-1:-1:-1;;;;;10368:33:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;10443:13:16;;10342:59;;-1:-1:-1;10411:6:16;;10430:189;10458:5;;10430:189;;10510:12;10486:20;10502:3;10504:1;10502;:3;:::i;10486:20::-;:36;;;;;;;;:::i;:::-;;10483:126;;;10553:15;:20;10569:3;10571:1;10569;:3;:::i;:::-;10553:20;;;;;;;;;;;10541:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10541:32:16;;;-1:-1:-1;;10541:32:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;;:6;;10548:1;;10541:9;;;;;;:::i;:::-;;;;;;:32;;;;10591:3;;;;;:::i;:::-;;;;10483:126;10465:3;;;;:::i;:::-;;;;10430:189;;;-1:-1:-1;10635:6:16;;10265:383;-1:-1:-1;;10265:383:16:o;6847:508::-;6913:5;6933:27;;;:15;:27;;;;;:34;;;;;6929:60;;-1:-1:-1;6976:13:16;;6847:508;-1:-1:-1;6847:508:16:o;6929:60::-;7021:27;;;;:15;:27;;;;;:37;;;7002:15;:56;6999:350;;7119:27;;;;:15;:27;;;;;:41;;;7077:32;7135:10;7077:20;:32::i;:::-;:39;:83;7073:207;;;-1:-1:-1;7186:10:16;;6847:508;-1:-1:-1;6847:508:16:o;7073:207::-;-1:-1:-1;7253:12:16;;6847:508;-1:-1:-1;6847:508:16:o;6999:350::-;-1:-1:-1;7324:14:16;;6847:508;-1:-1:-1;6847:508:16:o;6999:350::-;6847:508;;;:::o;6693:144::-;6791:27;;;;:15;:27;;;;;:39;;6784:46;;6760:13;;6791:39;6784:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6693:144;;;:::o;9041:266::-;9090:7;;;9135:144;9158:13;;9154:1;:17;9135:144;;;9216:12;9194:18;9210:1;9194:15;:18::i;:::-;:34;;;;;;;;:::i;:::-;;9191:78;;;9247:7;;;;:::i;:::-;;;;9191:78;9173:3;;;;:::i;:::-;;;;9135:144;;;-1:-1:-1;9295:5:16;9041:266;-1:-1:-1;9041:266:16:o;6039:203::-;1322:10;1304:29;;;;:17;:29;;;;;;;;1296:54;;;;-1:-1:-1;;;1296:54:16;;;;;;;:::i;:::-;;;;;;;;;6129:13:::1;6143:15;:27;6159:10;6143:27;;;;;;;;;;;:39;;6129:54;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;6122:61;;-1:-1:-1;;6122:61:16;;::::1;::::0;;;-1:-1:-1;6193:27:16;;;:15:::1;:27:::0;;;;;;:34:::1;;:42:::0;;;;::::1;::::0;;6039:203::o;13616:144::-;1074:7:18;1100:6;-1:-1:-1;;;;;1100:6:18;719:10:1;1240:23:18;1232:68;;;;-1:-1:-1;;;1232:68:18;;;;;;;:::i;:::-;-1:-1:-1;;;;;13711:35:16;;;::::1;;::::0;;;:17:::1;:35;::::0;;;;:42;;-1:-1:-1;;13711:42:16::1;::::0;::::1;;::::0;;;::::1;::::0;;13616:144::o;2399:1325::-;1322:10;1304:29;;;;:17;:29;;;;;;;;1296:54;;;;-1:-1:-1;;;1296:54:16;;;;;;;:::i;:::-;2720:13:::1;2734:12;2720:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;2719:28;2711:64;;;::::0;-1:-1:-1;;;2711:64:16;;20206:2:21;2711:64:16::1;::::0;::::1;20188:21:21::0;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:21;;;20257:54;20328:18;;2711:64:16::1;20004:348:21::0;2711:64:16::1;2810:13;::::0;2794:30:::1;::::0;;;:15:::1;:30;::::0;;;;:37:::1;;::::0;::::1;;2793:38;2785:72;;;::::0;-1:-1:-1;;;2785:72:16;;20559:2:21;2785:72:16::1;::::0;::::1;20541:21:21::0;20598:2;20578:18;;;20571:30;-1:-1:-1;;;20617:18:21;;;20610:52;20679:18;;2785:72:16::1;20357:346:21::0;2785:72:16::1;2888:1;2875:10;:14;2867:46;;;::::0;-1:-1:-1;;;2867:46:16;;20910:2:21;2867:46:16::1;::::0;::::1;20892:21:21::0;20949:2;20929:18;;;20922:30;-1:-1:-1;;;20968:18:21;;;20961:49;21027:18;;2867:46:16::1;20708:343:21::0;2867:46:16::1;2945:1;2931:11;:15;2923:54;;;::::0;-1:-1:-1;;;2923:54:16;;21258:2:21;2923:54:16::1;::::0;::::1;21240:21:21::0;21297:2;21277:18;;;21270:30;21336:28;21316:18;;;21309:56;21382:18;;2923:54:16::1;21056:350:21::0;2923:54:16::1;3007:1;2995:9;:13;2987:50;;;::::0;-1:-1:-1;;;2987:50:16;;21613:2:21;2987:50:16::1;::::0;::::1;21595:21:21::0;21652:2;21632:18;;;21625:30;21691:26;21671:18;;;21664:54;21735:18;;2987:50:16::1;21411:348:21::0;2987:50:16::1;3072:1;3055:14;:18;3047:51;;;::::0;-1:-1:-1;;;3047:51:16;;21966:2:21;3047:51:16::1;::::0;::::1;21948:21:21::0;22005:2;21985:18;;;21978:30;-1:-1:-1;;;22024:18:21;;;22017:50;22084:18;;3047:51:16::1;21764:344:21::0;3047:51:16::1;3142:506;;;;;;;;3168:13;;3142:506;;;;3208:1;3142:506;;;;3239:12;3142:506;;;;3276:10;3142:506;;;;3316:10;3142:506;;;;3355:9;3142:506;;;;3390:11;3142:506;;;;3425:9;3142:506;;;;3456:11;3142:506;;;;3494:12;3142:506;;;;3533:12;3142:506;;;;3574:14;3142:506;;;;3607:4;3142:506;;;;3633:4;3142:506;;;;::::0;3109:15:::1;:30;3125:13;;3109:30;;;;;;;;;;;:539;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;3109:539:16::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3109:539:16::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3109:539:16::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3109:539:16::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;3109:539:16::1;::::0;::::1;;::::0;;;::::1;::::0;;3658:27:::1;::::0;-1:-1:-1;;3658:13:16::1;::::0;:27:::1;::::0;3672:12;;3658:27:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;;;::::1;;-1:-1:-1::0;;3658:34:16;;::::1;::::0;;;::::1;::::0;;;3702:15;;;3658:27:::1;3702:15;::::0;::::1;:::i;:::-;;;;;;2399:1325:::0;;;;;;;;;;;:::o;6252:296::-;1322:10;1304:29;;;;:17;:29;;;;;;;;1296:54;;;;-1:-1:-1;;;1296:54:16;;;;;;;:::i;:::-;6352:6:::1;6348:194;6364:22:::0;;::::1;6348:194;;;6413:13;6427:15;:31;6443:11;;6455:1;6443:14;;;;;;;:::i;:::-;;;;;;;6427:31;;;;;;;;;;;:43;;6413:58;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;6406:65;;-1:-1:-1;;6406:65:16::1;::::0;;6413:58:::1;6485:15;6413:58:::0;6501:11;;6513:1;6501:14;;::::1;;;;;:::i;:::-;;;;;;;6485:31;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;6388:3;;;;;:::i;:::-;;;;6348:194;;;;6252:296:::0;;:::o;1660:101:18:-;1074:7;1100:6;-1:-1:-1;;;;;1100:6:18;719:10:1;1240:23:18;1232:68;;;;-1:-1:-1;;;1232:68:18;;;;;;;:::i;:::-;1724:30:::1;1751:1;1724:18;:30::i;:::-;1660:101::o:0;6554:129:16:-;6617:14;;:::i;:::-;6649:15;:27;6665:10;6649:27;;;;;;;;;;;6642:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6642:34:16;;;-1:-1:-1;;6642:34:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6554:129;-1:-1:-1;;6554:129:16:o;7365:135::-;7471:22;;;;:10;:22;;;;;;;;;7464:29;;;;;;;;;;;;;;;;;7436:17;;7464:29;;;7471:22;7464:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7464:29:16;;;;;;;;;;;;;;;;;;;;;;7365:135;;;:::o;11065:2243::-;11160:23;11185;11210;11244;11270:19;:17;:19::i;:::-;11244:45;;11299:23;11325:19;:17;:19::i;:::-;11299:45;;11354:25;11382:21;:19;:21::i;:::-;11354:49;;11413:31;11468:2;-1:-1:-1;;;;;11447:24:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11413:58;;11481:31;11536:2;-1:-1:-1;;;;;11515:24:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11481:58;;11549:33;11606:8;:15;-1:-1:-1;;;;;11585:37:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;11549:73:16;-1:-1:-1;11632:6:16;11679;11671:380;11691:11;11696:6;11691:2;:11;:::i;:::-;11687:1;:15;11671:380;;;11730:6;:13;11725:1;:18;11722:60;;11762:5;;11722:60;11816:6;11823:1;11816:9;;;;;;;;:::i;:::-;;;;;;;11795:7;11803:1;11795:10;;;;;;;;:::i;:::-;;;;;;;:18;;:30;;;;11860:34;11881:6;11888:1;11881:9;;;;;;;;:::i;:::-;;;;;;;:12;;;11860:20;:34::i;:::-;11839:7;11847:1;11839:10;;;;;;;;:::i;:::-;;;;;;;:18;;:55;;;;11927:29;11943:6;11950:1;11943:9;;;;;;;;:::i;:::-;;;;;;;:12;;;11927:15;:29::i;:::-;11908:7;11916:1;11908:10;;;;;;;;:::i;:::-;;;;;;;:16;;:48;;;;;11988:35;12002:7;12010:6;12017:1;12010:9;;;;;;;;:::i;:::-;;;;;;;:12;;;11988:13;:35::i;:::-;11970:7;11978:1;11970:10;;;;;;;;:::i;:::-;;;;;;;;;;;:53;;;:15;;;;:53;12037:3;;;;:::i;:::-;;;;11704;;;;;:::i;:::-;;;;11671:380;;;12064:1;12060:5;;12075:445;12086:11;12091:6;12086:2;:11;:::i;:::-;12082:1;:15;12075:445;;;12142:6;:13;12126:6;:13;:29;;;;:::i;:::-;12120:1;:36;12117:78;;12175:5;;12117:78;12229:6;12238;:13;12236:1;:15;;;;:::i;:::-;12229:23;;;;;;;;:::i;:::-;;;;;;;12208:7;12216:1;12208:10;;;;;;;;:::i;:::-;;;;;;;:18;;:44;;;;12287:48;12308:6;12317;:13;12315:1;:15;;;;:::i;:::-;12308:23;;;;;;;;:::i;12287:48::-;12266:7;12274:1;12266:10;;;;;;;;:::i;:::-;;;;;;;:18;;:69;;;;12368:43;12384:6;12393;:13;12391:1;:15;;;;:::i;:::-;12384:23;;;;;;;;:::i;12368:43::-;12349:7;12357:1;12349:10;;;;;;;;:::i;:::-;;;;;;;:16;;:62;;;;;12443:49;12457:7;12465:6;12474;:13;12472:1;:15;;;;:::i;:::-;12465:23;;;;;;;;:::i;12443:49::-;12425:7;12433:1;12425:10;;;;;;;;:::i;:::-;;;;;;;;;;;:67;;;:15;;;;:67;12506:3;;;;:::i;:::-;;;;12099;;;;;:::i;:::-;;;;12075:445;;;12529:18;;:::i;:::-;12557:12;;-1:-1:-1;12572:15:16;12597:345;12612:8;:15;12608:1;:19;12597:345;;;12651:6;12647:285;12667:8;:15;12663:1;:19;12647:285;;;12767:4;12743:8;12752:1;12743:11;;;;;;;;:::i;:::-;;;;;;;:21;;;:28;;;;:::i;:::-;12734:4;12710:8;12719:1;12710:11;;;;;;;;:::i;:::-;;;;;;;:21;;;:28;;;;:::i;:::-;12709:63;12706:212;;;12801:8;12810:1;12801:11;;;;;;;;:::i;:::-;;;;;;;12795:17;;12849:8;12858:1;12849:11;;;;;;;;:::i;:::-;;;;;;;12834:8;12843:1;12834:11;;;;;;;;:::i;:::-;;;;;;:26;;;;12896:3;12882:8;12891:1;12882:11;;;;;;;;:::i;:::-;;;;;;:17;;;;12706:212;12684:3;;;;:::i;:::-;;;;12647:285;;;-1:-1:-1;12629:3:16;;;;:::i;:::-;;;;12597:345;;;12959:1;12955:5;;12951:305;12966:8;:15;12962:1;:19;12951:305;;;13024:8;13033:1;13024:11;;;;;;;;:::i;:::-;;;;;;;13001:9;13011:1;13001:12;;;;;;;;:::i;:::-;;;;;;;:20;;:34;;;;13072:36;13093:8;13102:1;13093:11;;;;;;;;:::i;13072:36::-;13049:9;13059:1;13049:12;;;;;;;;:::i;:::-;;;;;;;:20;;:59;;;;13143:31;13159:8;13168:1;13159:11;;;;;;;;:::i;13143:31::-;13122:9;13132:1;13122:12;;;;;;;;:::i;:::-;;;;;;;:18;;:52;;;;;13208:37;13222:7;13230:8;13239:1;13230:11;;;;;;;;:::i;13208:37::-;13188:9;13198:1;13188:12;;;;;;;;:::i;:::-;;;;;;;;;;;:57;;;:17;;;;:57;12983:3;;;;:::i;:::-;;;;12951:305;;;-1:-1:-1;13273:7:16;;13282;;-1:-1:-1;13291:9:16;;-1:-1:-1;11065:2243:16;;-1:-1:-1;;;;;;;;;;11065:2243:16:o;8466:292::-;8547:4;;8563:167;8584:22;;;;:10;:22;;;;;:29;8580:33;;8563:167;;;8638:22;;;;:10;:22;;;;;:25;;-1:-1:-1;;;;;8638:36:16;;;:22;8661:1;;8638:25;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;8638:25:16;:36;8634:86;;;8701:4;8694:11;;;;;8634:86;8615:3;;;;:::i;:::-;;;;8563:167;;;;8746:5;8739:12;;8466:292;;;;;:::o;10658:397::-;10710:16;10737:25;10779:20;:18;:20::i;:::-;-1:-1:-1;;;;;10765:35:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;10842:13:16;;10737:63;;-1:-1:-1;10810:6:16;;10829:193;10857:5;;10829:193;;10909:14;10885:20;10901:3;10903:1;10901;:3;:::i;10885:20::-;:38;;;;;;;;:::i;:::-;;10882:130;;;10956:15;:20;10972:3;10974:1;10972;:3;:::i;:::-;10956:20;;;;;;;;;;;10942:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10942:34:16;;;-1:-1:-1;;10942:34:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;:8;;10951:1;;10942:11;;;;;;:::i;:::-;;;;;;:34;;;;10994:3;;;;;:::i;:::-;;;;10882:130;10864:3;;;;:::i;:::-;;;;10829:193;;3734:1193;1322:10;1304:29;;;;:17;:29;;;;;;;;1296:54;;;;-1:-1:-1;;;1296:54:16;;;;;;;:::i;:::-;3998:13:::1;4012:12;3998:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;3997:28;3989:64;;;::::0;-1:-1:-1;;;3989:64:16;;20206:2:21;3989:64:16::1;::::0;::::1;20188:21:21::0;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:21;;;20257:54;20328:18;;3989:64:16::1;20004:348:21::0;3989:64:16::1;4088:13;::::0;4072:30:::1;::::0;;;:15:::1;:30;::::0;;;;:37:::1;;::::0;::::1;;4071:38;4063:72;;;::::0;-1:-1:-1;;;4063:72:16;;20559:2:21;4063:72:16::1;::::0;::::1;20541:21:21::0;20598:2;20578:18;;;20571:30;-1:-1:-1;;;20617:18:21;;;20610:52;20679:18;;4063:72:16::1;20357:346:21::0;4063:72:16::1;4166:1;4153:10;:14;4145:46;;;::::0;-1:-1:-1;;;4145:46:16;;20910:2:21;4145:46:16::1;::::0;::::1;20892:21:21::0;20949:2;20929:18;;;20922:30;-1:-1:-1;;;20968:18:21;;;20961:49;21027:18;;4145:46:16::1;20708:343:21::0;4145:46:16::1;4223:1;4209:11;:15;4201:54;;;::::0;-1:-1:-1;;;4201:54:16;;21258:2:21;4201:54:16::1;::::0;::::1;21240:21:21::0;21297:2;21277:18;;;21270:30;21336:28;21316:18;;;21309:56;21382:18;;4201:54:16::1;21056:350:21::0;4201:54:16::1;4290:1;4273:14;:18;4265:51;;;::::0;-1:-1:-1;;;4265:51:16;;21966:2:21;4265:51:16::1;::::0;::::1;21948:21:21::0;22005:2;21985:18;;;21978:30;-1:-1:-1;;;22024:18:21;;;22017:50;22084:18;;4265:51:16::1;21764:344:21::0;4265:51:16::1;4360:491;;;;;;;;4386:13;;4360:491;;;;4426:1;4360:491;;;;4457:12;4360:491;;;;4494:10;4360:491;;;;4534:1;4360:491;;;;4564:1;4360:491;;;;4591:11;4360:491;;;;4626:11;4360:491;;;;4659:11;4360:491;;;;4697:12;4360:491;;;;4736:12;4360:491;;;;4777:14;4360:491;;;;4810:4;4360:491;;;;4836:4;4360:491;;;;::::0;4327:15:::1;:30;4343:13;;4327:30;;;;;;;;;;;:524;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;4327:524:16::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4327:524:16::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4327:524:16::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4327:524:16::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;4327:524:16::1;::::0;::::1;;::::0;;;::::1;::::0;;4861:27:::1;::::0;-1:-1:-1;;4861:13:16::1;::::0;:27:::1;::::0;4875:12;;4861:27:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:34;;;::::1;;-1:-1:-1::0;;4861:34:16;;::::1;::::0;;;::::1;::::0;;;4905:15;;;4861:27:::1;4905:15;::::0;::::1;:::i;:::-;;;;;;3734:1193:::0;;;;;;;;:::o;9874:381::-;9924:16;9951:23;9991:18;:16;:18::i;:::-;-1:-1:-1;;;;;9977:33:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;10052:13:16;;9951:59;;-1:-1:-1;10020:6:16;;10039:187;10067:5;;10039:187;;10119:10;10095:20;10111:3;10113:1;10111;:3;:::i;10095:20::-;:34;;;;;;;;:::i;:::-;;10092:124;;;10160:15;:20;10176:3;10178:1;10176;:3;:::i;:::-;10160:20;;;;;;;;;;;10148:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10148:32:16;;;-1:-1:-1;;10148:32:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;;:6;;10155:1;;10148:9;;;;;;:::i;:::-;;;;;;:32;;;;10198:3;;;;;:::i;:::-;;;;10092:124;10074:3;;;;:::i;:::-;;;;10039:187;;13514:96;1074:7:18;1100:6;-1:-1:-1;;;;;1100:6:18;719:10:1;1240:23:18;1232:68;;;;-1:-1:-1;;;1232:68:18;;;;;;;:::i;:::-;13584:6:16::1;:19:::0;;-1:-1:-1;;;;;;13584:19:16::1;-1:-1:-1::0;;;;;13584:19:16;;;::::1;::::0;;;::::1;::::0;;13514:96::o;4937:1092::-;1322:10;1304:29;;;;:17;:29;;;;;;;;1296:54;;;;-1:-1:-1;;;1296:54:16;;;;;;;:::i;:::-;5277:27:::1;::::0;;;:15:::1;:27;::::0;;;;:34:::1;;::::0;::::1;;5269:79;;;;-1:-1:-1::0;;;5269:79:16::1;;;;;;;:::i;:::-;5358:27;::::0;;;:15:::1;:27;::::0;;;;;;;:54;;::::1;::::0;:39:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5422:27:16::1;::::0;;;:15:::1;:27;::::0;;;;;;;:37:::1;::::0;::::1;:50:::0;;;5482:42:::1;::::0;::::1;:55:::0;;;5547:41;;::::1;:53:::0;;;5610:38:::1;::::0;::::1;:52:::0;;;5672:36:::1;::::0;::::1;:48:::0;;;5730;;::::1;::::0;:34:::1;::::0;;::::1;::::0;:48;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5788:27:16::1;::::0;;;:15:::1;:27;::::0;;;;;;;:54;;::::1;::::0;:39:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5852:27:16::1;::::0;;;:15:::1;:27;::::0;;;;;;;:54;;::::1;::::0;:39:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5916:27:16::1;::::0;;;:15:::1;:27;::::0;;;;;:41:::1;::::0;::::1;:58:::0;;;;5984:31:::1;;:38:::0;;;;-1:-1:-1;;;;;;;;;4937:1092:16:o;8767:264::-;8816:7;;;8861:142;8884:13;;8880:1;:17;8861:142;;;8942:10;8920:18;8936:1;8920:15;:18::i;:::-;:32;;;;;;;;:::i;:::-;;8917:76;;;8971:7;;;;:::i;:::-;;;;8917:76;8899:3;;;;:::i;:::-;;;;8861:142;;7510:946;7576:7;7602:27;;;:15;:27;;;;;:34;;;;;7594:79;;;;-1:-1:-1;;;7594:79:16;;;;;;;:::i;:::-;7686:27;;;;:15;:27;;;;;:39;;;;;:44;7683:767;;;7769:27;;;;:15;:27;;;;;:37;;;7751:15;:55;7748:137;;;-1:-1:-1;7832:27:16;;;;:15;:27;;;;;:38;;;;7510:946::o;7748:137::-;7898:17;8034:27;;;:15;:27;;;;;;;:42;;;;7978:41;;;;7937:37;;;;;7919:55;;:15;:55;:::i;:::-;7918:101;;;;:::i;:::-;:158;;;;:::i;:::-;8090:16;8110:27;;;:15;:27;;;;;:38;;;7898:178;;-1:-1:-1;8090:16:16;8110:51;-1:-1:-1;8110:51:16;:123;;8232:1;8110:123;;;8178:27;;;;:15;:27;;;;;:38;;;:50;;8219:9;;8178:50;:::i;:::-;8266:27;;;;:15;:27;;;;;:36;;;8090:143;;-1:-1:-1;8254:48:16;;;:98;;8316:27;;;;:15;:27;;;;;:36;;;8254:98;;;8305:8;8254:98;8247:105;7510:946;-1:-1:-1;;;;7510:946:16:o;7683:767::-;-1:-1:-1;8401:27:16;;;;:15;:27;;;;;:38;;;;7510:946::o;9316:270::-;9367:7;;;9412:146;9435:13;;9431:1;:17;9412:146;;;9493:14;9471:18;9487:1;9471:15;:18::i;:::-;:36;;;;;;;;:::i;:::-;;9468:80;;;9526:7;;;;:::i;:::-;;;;9468:80;9450:3;;;;:::i;:::-;;;;9412:146;;9596:268;9646:7;;;9691:145;9714:13;;9710:1;:17;9691:145;;;9772:13;9750:18;9766:1;9750:15;:18::i;:::-;:35;;;;;;;;:::i;:::-;;9747:79;;;9804:7;;;;:::i;:::-;;;;9747:79;9729:3;;;;:::i;:::-;;;;9691:145;;1378:1011;1504:27;;;;:15;:27;;;;;:34;;;;;1496:80;;;;-1:-1:-1;;;1496:80:16;;;;;;;:::i;:::-;1717:6;;1647:51;;-1:-1:-1;;;;;1717:6:16;;;;1594:119;;1608:92;;1647:51;;1664:10;;1676:9;;;;1687:10;;1647:51;;;:::i;:::-;;;;-1:-1:-1;;1647:51:16;;;;;;;;;1637:62;;1647:51;1637:62;;;;27703:66:21;8412:58:2;;;27691:79:21;27786:12;;;;27779:28;;;;8412:58:2;;;;;;;;;;27823:12:21;;;;8412:58:2;;;8402:69;;;;;;8210:269;1608:92:16;1702:10;;1594:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1594:13:16;;-1:-1:-1;;;1594:119:16:i;:::-;-1:-1:-1;;;;;1594:129:16;;1586:159;;;;-1:-1:-1;;;1586:159:16;;23856:2:21;1586:159:16;;;23838:21:21;23895:2;23875:18;;;23868:30;-1:-1:-1;;;23914:18:21;;;23907:47;23971:18;;1586:159:16;23654:341:21;1586:159:16;1794:10;1763:27;1779:10;1763:15;:27::i;:::-;:41;;;;;;;;:::i;:::-;;1755:70;;;;-1:-1:-1;;;1755:70:16;;24202:2:21;1755:70:16;;;24184:21:21;24241:2;24221:18;;;24214:30;-1:-1:-1;;;24260:18:21;;;24253:46;24316:18;;1755:70:16;24000:340:21;1755:70:16;1844:36;1858:10;1869;1844:13;:36::i;:::-;1843:37;1835:69;;;;-1:-1:-1;;;1835:69:16;;24547:2:21;1835:69:16;;;24529:21:21;24586:2;24566:18;;;24559:30;-1:-1:-1;;;24605:18:21;;;24598:49;24664:18;;1835:69:16;24345:343:21;1835:69:16;1942:27;;;;:15;:27;;;;;:31;;;1922:51;;;1914:89;;;;-1:-1:-1;;;1914:89:16;;24895:2:21;1914:89:16;;;24877:21:21;24934:2;24914:18;;;24907:30;24973:27;24953:18;;;24946:55;25018:18;;1914:89:16;24693:349:21;1914:89:16;2021:15;;:60;;-1:-1:-1;;;2021:60:16;;-1:-1:-1;;;;;2021:15:16;;;;:37;;:60;;2059:9;;;;2070:10;;2021:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2013:99;;;;-1:-1:-1;;;2013:99:16;;26089:2:21;2013:99:16;;;26071:21:21;26128:2;26108:18;;;26101:30;26167:28;26147:18;;;26140:56;26213:18;;2013:99:16;25887:350:21;2013:99:16;2122:20;2145:27;2161:10;2145:15;:27::i;:::-;2122:50;-1:-1:-1;2228:22:16;2122:50;2243:7;2228:22;:::i;:::-;2190:12;;:34;;-1:-1:-1;;;2190:34:16;;2213:10;2190:34;;;173:51:21;-1:-1:-1;;;;;2190:12:16;;;;:22;;146:18:21;;2190:34:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;2182:88;;;;-1:-1:-1;;;2182:88:16;;26633:2:21;2182:88:16;;;26615:21:21;26672:2;26652:18;;;26645:30;-1:-1:-1;;;26691:18:21;;;26684:45;26746:18;;2182:88:16;26431:339:21;2182:88:16;2280:12;;-1:-1:-1;;;;;2280:12:16;:17;2298:10;2310:22;:12;2325:7;2310:22;:::i;:::-;2280:53;;-1:-1:-1;;;;;;2280:53:16;;;;;;;-1:-1:-1;;;;;26967:32:21;;;2280:53:16;;;26949:51:21;27016:18;;;27009:34;26922:18;;2280:53:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2343:22:16;;;;-1:-1:-1;;2343:10:16;:22;;;;;;;:39;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2343:39:16;2371:10;2343:39;;;-1:-1:-1;;;;1378:1011:16:o;13314:192::-;1074:7:18;1100:6;-1:-1:-1;;;;;1100:6:18;719:10:1;1240:23:18;1232:68;;;;-1:-1:-1;;;1232:68:18;;;;;;;:::i;:::-;13414:12:16::1;:33:::0;;-1:-1:-1;;;;;13414:33:16;;::::1;-1:-1:-1::0;;;;;;13414:33:16;;::::1;;::::0;;;13457:15:::1;:42:::0;;;;;::::1;::::0;::::1;;::::0;;13314:192::o;1910:198:18:-;1074:7;1100:6;-1:-1:-1;;;;;1100:6:18;719:10:1;1240:23:18;1232:68;;;;-1:-1:-1;;;1232:68:18;;;;;;;:::i;:::-;-1:-1:-1;;;;;1998:22:18;::::1;1990:73;;;::::0;-1:-1:-1;;;1990:73:18;;27256:2:21;1990:73:18::1;::::0;::::1;27238:21:21::0;27295:2;27275:18;;;27268:30;27334:34;27314:18;;;27307:62;-1:-1:-1;;;27385:18:21;;;27378:36;27431:19;;1990:73:18::1;27054:402:21::0;1990:73:18::1;2073:28;2092:8;2073:18;:28::i;:::-;1910:198:::0;:::o;2262:187::-;2335:16;2354:6;;-1:-1:-1;;;;;2370:17:18;;;-1:-1:-1;;;;;;2370:17:18;;;;;;2402:40;;2354:6;;;;;;;2402:40;;2335:16;2402:40;2325:124;2262:187;:::o;4408:231:2:-;4486:7;4507:17;4526:18;4548:27;4559:4;4565:9;4548:10;:27::i;:::-;4506:69;;;;4586:18;4598:5;4586:11;:18::i;:::-;-1:-1:-1;4622:9:2;4408:231;-1:-1:-1;;;4408:231:2:o;2298:1308::-;2379:7;2388:12;2613:9;:16;2633:2;2613:22;2609:990;;;2909:4;2894:20;;2888:27;2959:4;2944:20;;2938:27;3017:4;3002:20;;2996:27;2652:9;2988:36;3060:25;3071:4;2988:36;2888:27;2938;3060:10;:25::i;:::-;3053:32;;;;;;;;;2609:990;3107:9;:16;3127:2;3107:22;3103:496;;;3382:4;3367:20;;3361:27;3433:4;3418:20;;3412:27;3475:23;3486:4;3361:27;3412;3475:10;:23::i;:::-;3468:30;;;;;;;;3103:496;-1:-1:-1;3547:1:2;;-1:-1:-1;3551:35:2;3103:496;2298:1308;;;;;:::o;569:643::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:571;;;569:643;:::o;634:571::-;745:29;736:5;:38;;;;;;;;:::i;:::-;;732:473;;;791:34;;-1:-1:-1;;;791:34:2;;28048:2:21;791:34:2;;;28030:21:21;28087:2;28067:18;;;28060:30;28126:26;28106:18;;;28099:54;28170:18;;791:34:2;27846:348:21;732:473:2;856:35;847:5;:44;;;;;;;;:::i;:::-;;843:362;;;908:41;;-1:-1:-1;;;908:41:2;;28401:2:21;908:41:2;;;28383:21:21;28440:2;28420:18;;;28413:30;28479:33;28459:18;;;28452:61;28530:18;;908:41:2;28199:355:21;843:362:2;980:30;971:5;:39;;;;;;;;:::i;:::-;;967:238;;;1027:44;;-1:-1:-1;;;1027:44:2;;28761:2:21;1027:44:2;;;28743:21:21;28800:2;28780:18;;;28773:30;28839:34;28819:18;;;28812:62;-1:-1:-1;;;28890:18:21;;;28883:32;28932:19;;1027:44:2;28559:398:21;967:238:2;1102:30;1093:5;:39;;;;;;;;:::i;:::-;;1089:116;;;1149:44;;-1:-1:-1;;;1149:44:2;;29164:2:21;1149:44:2;;;29146:21:21;29203:2;29183:18;;;29176:30;29242:34;29222:18;;;29215:62;-1:-1:-1;;;29293:18:21;;;29286:32;29335:19;;1149:44:2;28962:398:21;5860:1632:2;5991:7;;6925:66;6912:79;;6908:163;;;-1:-1:-1;7024:1:2;;-1:-1:-1;7028:30:2;7008:51;;6908:163;7085:1;:7;;7090:2;7085:7;;:18;;;;;7096:1;:7;;7101:2;7096:7;;7085:18;7081:102;;;-1:-1:-1;7136:1:2;;-1:-1:-1;7140:30:2;7120:51;;7081:102;7297:24;;;7280:14;7297:24;;;;;;;;;29592:25:21;;;29665:4;29653:17;;29633:18;;;29626:45;;;;29687:18;;;29680:34;;;29730:18;;;29723:34;;;7297:24:2;;29564:19:21;;7297:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7297:24:2;;-1:-1:-1;;7297:24:2;;;-1:-1:-1;;;;;;;7336:20:2;;7332:103;;7389:1;7393:29;7373:50;;;;;;;7332:103;7455:6;-1:-1:-1;7463:20:2;;-1:-1:-1;5860:1632:2;;;;;;;;:::o;4902:344::-;5016:7;;-1:-1:-1;;;;;5062:80:2;;5016:7;5169:25;5185:3;5170:18;;;5192:2;5169:25;:::i;:::-;5153:42;;5213:25;5224:4;5230:1;5233;5236;5213:10;:25::i;:::-;5206:32;;;;;;4902:344;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;235:258:21;307:1;317:113;331:6;328:1;325:13;317:113;;;407:11;;;401:18;388:11;;;381:39;353:2;346:10;317:113;;;448:6;445:1;442:13;439:48;;;483:1;474:6;469:3;465:16;458:27;439:48;;235:258;;;:::o;498:::-;540:3;578:5;572:12;605:6;600:3;593:19;621:63;677:6;670:4;665:3;661:14;654:4;647:5;643:16;621:63;:::i;:::-;738:2;717:15;-1:-1:-1;;713:29:21;704:39;;;;745:4;700:50;;498:258;-1:-1:-1;;498:258:21:o;857:1480::-;907:3;935:6;968:5;962:12;957:3;950:25;1024:4;1017:5;1013:16;1007:23;1000:4;995:3;991:14;984:47;1077:4;1070:5;1066:16;1060:23;1115:2;1108:4;1103:3;1099:14;1092:26;1139:45;1180:2;1175:3;1171:12;1157;1139:45;:::i;:::-;1127:57;;;1233:4;1226:5;1222:16;1216:23;1209:4;1204:3;1200:14;1193:47;1289:4;1282:5;1278:16;1272:23;1265:4;1260:3;1256:14;1249:47;1345:4;1338:5;1334:16;1328:23;1321:4;1316:3;1312:14;1305:47;1401:4;1394:5;1390:16;1384:23;1377:4;1372:3;1368:14;1361:47;1457:4;1450:5;1446:16;1440:23;1433:4;1428:3;1424:14;1417:47;1483:6;1537:2;1530:5;1526:14;1520:21;1581:3;1575:4;1571:14;1566:2;1561:3;1557:12;1550:36;1609:39;1643:4;1627:14;1609:39;:::i;:::-;1595:53;;;;1667:6;1721:2;1714:5;1710:14;1704:21;1767:3;1759:6;1755:16;1750:2;1745:3;1741:12;1734:38;1795:41;1829:6;1813:14;1795:41;:::i;:::-;1781:55;;;;1855:6;1909:2;1902:5;1898:14;1892:21;1955:3;1947:6;1943:16;1938:2;1933:3;1929:12;1922:38;1983:41;2017:6;2001:14;1983:41;:::i;:::-;1969:55;;;;2043:6;2096:2;2089:5;2085:14;2079:21;2074:2;2069:3;2065:12;2058:43;;2120:6;2173:2;2166:5;2162:14;2156:21;2151:2;2146:3;2142:12;2135:43;;2197:6;2251:2;2244:5;2240:14;2234:21;2264:45;2305:2;2300:3;2296:12;2280:14;831:13;824:21;812:34;;761:91;2264:45;-1:-1:-1;2325:6:21;;857:1480;-1:-1:-1;;;;857:1480:21:o;2342:841::-;2534:4;2563:2;2603;2592:9;2588:18;2633:2;2622:9;2615:21;2656:6;2691;2685:13;2722:6;2714;2707:22;2760:2;2749:9;2745:18;2738:25;;2822:2;2812:6;2809:1;2805:14;2794:9;2790:30;2786:39;2772:53;;2860:2;2852:6;2848:15;2881:1;2891:263;2905:6;2902:1;2899:13;2891:263;;;2998:2;2994:7;2982:9;2974:6;2970:22;2966:36;2961:3;2954:49;3026:48;3067:6;3058;3052:13;3026:48;:::i;:::-;3016:58;-1:-1:-1;3132:12:21;;;;3097:15;;;;2927:1;2920:9;2891:263;;;-1:-1:-1;3171:6:21;;2342:841;-1:-1:-1;;;;;;;2342:841:21:o;3188:180::-;3247:6;3300:2;3288:9;3279:7;3275:23;3271:32;3268:52;;;3316:1;3313;3306:12;3268:52;-1:-1:-1;3339:23:21;;3188:180;-1:-1:-1;3188:180:21:o;3373:127::-;3434:10;3429:3;3425:20;3422:1;3415:31;3465:4;3462:1;3455:15;3489:4;3486:1;3479:15;3505:338;3647:2;3632:18;;3680:1;3669:13;;3659:144;;3725:10;3720:3;3716:20;3713:1;3706:31;3760:4;3757:1;3750:15;3788:4;3785:1;3778:15;3659:144;3812:25;;;3505:338;:::o;3848:220::-;3997:2;3986:9;3979:21;3960:4;4017:45;4058:2;4047:9;4043:18;4035:6;4017:45;:::i;:::-;4009:53;3848:220;-1:-1:-1;;;3848:220:21:o;4255:173::-;4323:20;;-1:-1:-1;;;;;4372:31:21;;4362:42;;4352:70;;4418:1;4415;4408:12;4433:118;4519:5;4512:13;4505:21;4498:5;4495:32;4485:60;;4541:1;4538;4531:12;4556:315;4621:6;4629;4682:2;4670:9;4661:7;4657:23;4653:32;4650:52;;;4698:1;4695;4688:12;4650:52;4721:29;4740:9;4721:29;:::i;:::-;4711:39;;4800:2;4789:9;4785:18;4772:32;4813:28;4835:5;4813:28;:::i;:::-;4860:5;4850:15;;;4556:315;;;;;:::o;4876:127::-;4937:10;4932:3;4928:20;4925:1;4918:31;4968:4;4965:1;4958:15;4992:4;4989:1;4982:15;5008:719;5051:5;5104:3;5097:4;5089:6;5085:17;5081:27;5071:55;;5122:1;5119;5112:12;5071:55;5158:6;5145:20;-1:-1:-1;;;;;5221:2:21;5217;5214:10;5211:36;;;5227:18;;:::i;:::-;5302:2;5296:9;5270:2;5356:13;;-1:-1:-1;;5352:22:21;;;5376:2;5348:31;5344:40;5332:53;;;5400:18;;;5420:22;;;5397:46;5394:72;;;5446:18;;:::i;:::-;5486:10;5482:2;5475:22;5521:2;5513:6;5506:18;5567:3;5560:4;5555:2;5547:6;5543:15;5539:26;5536:35;5533:55;;;5584:1;5581;5574:12;5533:55;5648:2;5641:4;5633:6;5629:17;5622:4;5614:6;5610:17;5597:54;5695:1;5688:4;5683:2;5675:6;5671:15;5667:26;5660:37;5715:6;5706:15;;;;;;5008:719;;;;:::o;5732:1393::-;5921:6;5929;5937;5945;5953;5961;5969;5977;5985;5993;6001:7;6055:3;6043:9;6034:7;6030:23;6026:33;6023:53;;;6072:1;6069;6062:12;6023:53;-1:-1:-1;;;;;6153:2:21;6141:9;6128:23;6125:31;6122:51;;;6169:1;6166;6159:12;6122:51;6192:67;6251:7;6238:9;6225:23;6214:9;6210:39;6192:67;:::i;:::-;6182:77;;6306:2;6295:9;6291:18;6278:32;6268:42;;6357:2;6346:9;6342:18;6329:32;6319:42;;6408:2;6397:9;6393:18;6380:32;6370:42;;6459:3;6448:9;6444:19;6431:33;6421:43;;6511:3;6500:9;6496:19;6483:33;6473:43;;6566:2;6559:3;6548:9;6544:19;6531:33;6528:41;6525:61;;;6582:1;6579;6572:12;6525:61;6605:77;6674:7;6666:3;6655:9;6651:19;6638:33;6627:9;6623:49;6605:77;:::i;:::-;6595:87;;6732:2;6725:3;6714:9;6710:19;6697:33;6694:41;6691:61;;;6748:1;6745;6738:12;6691:61;6771:77;6840:7;6832:3;6821:9;6817:19;6804:33;6793:9;6789:49;6771:77;:::i;:::-;6761:87;;6898:2;6891:3;6880:9;6876:19;6863:33;6860:41;6857:61;;;6914:1;6911;6904:12;6857:61;;6937:77;7006:7;6998:3;6987:9;6983:19;6970:33;6959:9;6955:49;6937:77;:::i;:::-;6927:87;;7061:3;7050:9;7046:19;7033:33;7023:43;;7114:3;7103:9;7099:19;7086:33;7075:44;;5732:1393;;;;;;;;;;;;;;:::o;7130:367::-;7193:8;7203:6;7257:3;7250:4;7242:6;7238:17;7234:27;7224:55;;7275:1;7272;7265:12;7224:55;-1:-1:-1;7298:20:21;;-1:-1:-1;;;;;7330:30:21;;7327:50;;;7373:1;7370;7363:12;7327:50;7410:4;7402:6;7398:17;7386:29;;7470:3;7463:4;7453:6;7450:1;7446:14;7438:6;7434:27;7430:38;7427:47;7424:67;;;7487:1;7484;7477:12;7502:437;7588:6;7596;7649:2;7637:9;7628:7;7624:23;7620:32;7617:52;;;7665:1;7662;7655:12;7617:52;7705:9;7692:23;-1:-1:-1;;;;;7730:6:21;7727:30;7724:50;;;7770:1;7767;7760:12;7724:50;7809:70;7871:7;7862:6;7851:9;7847:22;7809:70;:::i;:::-;7898:8;;7783:96;;-1:-1:-1;7502:437:21;-1:-1:-1;;;;7502:437:21:o;7944:258::-;8123:2;8112:9;8105:21;8086:4;8143:53;8192:2;8181:9;8177:18;8169:6;8143:53;:::i;8207:461::-;8260:3;8298:5;8292:12;8325:6;8320:3;8313:19;8351:4;8380:2;8375:3;8371:12;8364:19;;8417:2;8410:5;8406:14;8438:1;8448:195;8462:6;8459:1;8456:13;8448:195;;;8527:13;;-1:-1:-1;;;;;8523:39:21;8511:52;;8583:12;;;;8618:15;;;;8559:1;8477:9;8448:195;;;-1:-1:-1;8659:3:21;;8207:461;-1:-1:-1;;;;;8207:461:21:o;8673:261::-;8852:2;8841:9;8834:21;8815:4;8872:56;8924:2;8913:9;8909:18;8901:6;8872:56;:::i;8939:322::-;9016:6;9024;9032;9085:2;9073:9;9064:7;9060:23;9056:32;9053:52;;;9101:1;9098;9091:12;9053:52;9137:9;9124:23;9114:33;;9194:2;9183:9;9179:18;9166:32;9156:42;;9217:38;9251:2;9240:9;9236:18;9217:38;:::i;:::-;9207:48;;8939:322;;;;;:::o;9266:1177::-;9333:3;9371:5;9365:12;9398:6;9393:3;9386:19;9424:4;9465:2;9460:3;9456:12;9490:11;9517;9510:18;;9567:6;9564:1;9560:14;9553:5;9549:26;9537:38;;9609:2;9602:5;9598:14;9630:1;9640:777;9654:6;9651:1;9648:13;9640:777;;;9725:5;9719:4;9715:16;9710:3;9703:29;9761:6;9755:13;9791:4;9834:2;9828:9;9863:2;9857:4;9850:16;9893:54;9943:2;9937:4;9933:13;9919:12;9893:54;:::i;:::-;9879:68;;;9996:2;9992;9988:11;9982:18;10047:4;10039:6;10035:17;10030:2;10024:4;10020:13;10013:40;10080:52;10125:6;10109:14;10080:52;:::i;:::-;10155:4;10200:11;;;10194:18;10179:13;;;10172:41;10236:4;10295:11;;;10289:18;10282:26;10275:34;10260:13;;;;10253:57;;;;-1:-1:-1;;10395:12:21;;;;10360:15;;;;9676:1;9669:9;9640:777;;;-1:-1:-1;10433:4:21;;9266:1177;-1:-1:-1;;;;;;;9266:1177:21:o;10448:903::-;10975:2;10964:9;10957:21;10938:4;11001:70;11067:2;11056:9;11052:18;11044:6;11001:70;:::i;:::-;11119:9;11111:6;11107:22;11102:2;11091:9;11087:18;11080:50;11153:58;11204:6;11196;11153:58;:::i;:::-;11139:72;;11259:9;11251:6;11247:22;11242:2;11231:9;11227:18;11220:50;11287:58;11338:6;11330;11287:58;:::i;:::-;11279:66;10448:903;-1:-1:-1;;;;;;10448:903:21:o;11356:254::-;11424:6;11432;11485:2;11473:9;11464:7;11460:23;11456:32;11453:52;;;11501:1;11498;11491:12;11453:52;11524:29;11543:9;11524:29;:::i;:::-;11514:39;11600:2;11585:18;;;;11572:32;;-1:-1:-1;;;11356:254:21:o;12015:1220::-;12177:6;12185;12193;12201;12209;12217;12225;12233;12286:3;12274:9;12265:7;12261:23;12257:33;12254:53;;;12303:1;12300;12293:12;12254:53;12343:9;12330:23;-1:-1:-1;;;;;12413:2:21;12405:6;12402:14;12399:34;;;12429:1;12426;12419:12;12399:34;12452:50;12494:7;12485:6;12474:9;12470:22;12452:50;:::i;:::-;12442:60;;12549:2;12538:9;12534:18;12521:32;12511:42;;12600:2;12589:9;12585:18;12572:32;12562:42;;12657:2;12646:9;12642:18;12629:32;12613:48;;12686:2;12676:8;12673:16;12670:36;;;12702:1;12699;12692:12;12670:36;12725:52;12769:7;12758:8;12747:9;12743:24;12725:52;:::i;:::-;12715:62;;12830:3;12819:9;12815:19;12802:33;12786:49;;12860:2;12850:8;12847:16;12844:36;;;12876:1;12873;12866:12;12844:36;12899:52;12943:7;12932:8;12921:9;12917:24;12899:52;:::i;:::-;12889:62;;13004:3;12993:9;12989:19;12976:33;12960:49;;13034:2;13024:8;13021:16;13018:36;;;13050:1;13047;13040:12;13018:36;;13073:52;13117:7;13106:8;13095:9;13091:24;13073:52;:::i;:::-;13063:62;;;13172:3;13161:9;13157:19;13144:33;13134:43;;13224:3;13213:9;13209:19;13196:33;13186:43;;12015:1220;;;;;;;;;;;:::o;13240:186::-;13299:6;13352:2;13340:9;13331:7;13327:23;13323:32;13320:52;;;13368:1;13365;13358:12;13320:52;13391:29;13410:9;13391:29;:::i;13431:1500::-;13629:6;13637;13645;13653;13661;13669;13677;13685;13693;13701;13709:7;13718;13772:3;13760:9;13751:7;13747:23;13743:33;13740:53;;;13789:1;13786;13779:12;13740:53;13825:9;13812:23;13802:33;;-1:-1:-1;;;;;13878:2:21;13867:9;13863:18;13850:32;13847:56;13844:76;;;13916:1;13913;13906:12;13844:76;13939;14007:7;14000:2;13989:9;13985:18;13972:32;13961:9;13957:48;13939:76;:::i;:::-;13929:86;;14062:2;14051:9;14047:18;14034:32;14024:42;;14113:2;14102:9;14098:18;14085:32;14075:42;;14164:3;14153:9;14149:19;14136:33;14126:43;;14216:3;14205:9;14201:19;14188:33;14178:43;;14268:3;14257:9;14253:19;14240:33;14230:43;;-1:-1:-1;;;;;14316:3:21;14305:9;14301:19;14288:33;14285:57;14282:77;;;14355:1;14352;14345:12;14282:77;14378;14447:7;14439:3;14428:9;14424:19;14411:33;14400:9;14396:49;14378:77;:::i;:::-;14368:87;;-1:-1:-1;;;;;14498:3:21;14487:9;14483:19;14470:33;14467:57;14464:77;;;14537:1;14534;14527:12;14464:77;14560;14629:7;14621:3;14610:9;14606:19;14593:33;14582:9;14578:49;14560:77;:::i;:::-;14550:87;;-1:-1:-1;;;;;14680:3:21;14669:9;14665:19;14652:33;14649:57;14646:77;;;14719:1;14716;14709:12;14646:77;14742;14811:7;14803:3;14792:9;14788:19;14775:33;14764:9;14760:49;14742:77;:::i;:::-;14732:87;;14867:3;14856:9;14852:19;14839:33;14828:44;;14920:3;14909:9;14905:19;14892:33;14881:44;;13431:1500;;;;;;;;;;;;;;:::o;15160:322::-;15229:6;15282:2;15270:9;15261:7;15257:23;15253:32;15250:52;;;15298:1;15295;15288:12;15250:52;15338:9;15325:23;-1:-1:-1;;;;;15363:6:21;15360:30;15357:50;;;15403:1;15400;15393:12;15357:50;15426;15468:7;15459:6;15448:9;15444:22;15426:50;:::i;15487:974::-;15602:6;15610;15618;15626;15634;15687:2;15675:9;15666:7;15662:23;15658:32;15655:52;;;15703:1;15700;15693:12;15655:52;15739:9;15726:23;15716:33;;15800:2;15789:9;15785:18;15772:32;-1:-1:-1;;;;;15864:2:21;15856:6;15853:14;15850:34;;;15880:1;15877;15870:12;15850:34;15919:70;15981:7;15972:6;15961:9;15957:22;15919:70;:::i;:::-;16008:8;;-1:-1:-1;15893:96:21;-1:-1:-1;16096:2:21;16081:18;;16068:32;;-1:-1:-1;16112:16:21;;;16109:36;;;16141:1;16138;16131:12;16109:36;16179:8;16168:9;16164:24;16154:34;;16226:7;16219:4;16215:2;16211:13;16207:27;16197:55;;16248:1;16245;16238:12;16197:55;16288:2;16275:16;16314:2;16306:6;16303:14;16300:34;;;16330:1;16327;16320:12;16300:34;16375:7;16370:2;16361:6;16357:2;16353:15;16349:24;16346:37;16343:57;;;16396:1;16393;16386:12;16343:57;15487:974;;;;-1:-1:-1;15487:974:21;;-1:-1:-1;16427:2:21;16419:11;;16449:6;15487:974;-1:-1:-1;;;15487:974:21:o;16466:260::-;16534:6;16542;16595:2;16583:9;16574:7;16570:23;16566:32;16563:52;;;16611:1;16608;16601:12;16563:52;16634:29;16653:9;16634:29;:::i;:::-;16624:39;;16682:38;16716:2;16705:9;16701:18;16682:38;:::i;:::-;16672:48;;16466:260;;;;;:::o;16731:127::-;16792:10;16787:3;16783:20;16780:1;16773:31;16823:4;16820:1;16813:15;16847:4;16844:1;16837:15;16863:125;16903:4;16931:1;16928;16925:8;16922:34;;;16936:18;;:::i;:::-;-1:-1:-1;16973:9:21;;16863:125::o;16993:380::-;17072:1;17068:12;;;;17115;;;17136:61;;17190:4;17182:6;17178:17;17168:27;;17136:61;17243:2;17235:6;17232:14;17212:18;17209:38;17206:161;;;17289:10;17284:3;17280:20;17277:1;17270:31;17324:4;17321:1;17314:15;17352:4;17349:1;17342:15;17378:127;17439:10;17434:3;17430:20;17427:1;17420:31;17470:4;17467:1;17460:15;17494:4;17491:1;17484:15;17510:135;17549:3;-1:-1:-1;;17570:17:21;;17567:43;;;17590:18;;:::i;:::-;-1:-1:-1;17637:1:21;17626:13;;17510:135::o;17650:136::-;17689:3;17717:5;17707:39;;17726:18;;:::i;:::-;-1:-1:-1;;;17762:18:21;;17650:136::o;17791:336::-;17993:2;17975:21;;;18032:2;18012:18;;;18005:30;-1:-1:-1;;;18066:2:21;18051:18;;18044:42;18118:2;18103:18;;17791:336::o;18258:1099::-;18386:3;18415:1;18448:6;18442:13;18478:3;18500:1;18528:9;18524:2;18520:18;18510:28;;18588:2;18577:9;18573:18;18610;18600:61;;18654:4;18646:6;18642:17;18632:27;;18600:61;18680:2;18728;18720:6;18717:14;18697:18;18694:38;18691:165;;;-1:-1:-1;;;18755:33:21;;18811:4;18808:1;18801:15;18841:4;18762:3;18829:17;18691:165;18872:18;18899:104;;;;19017:1;19012:320;;;;18865:467;;18899:104;-1:-1:-1;;18932:24:21;;18920:37;;18977:16;;;;-1:-1:-1;18899:104:21;;19012:320;18205:1;18198:14;;;18242:4;18229:18;;19107:1;19121:165;19135:6;19132:1;19129:13;19121:165;;;19213:14;;19200:11;;;19193:35;19256:16;;;;19150:10;;19121:165;;;19125:3;;19315:6;19310:3;19306:16;19299:23;;18865:467;-1:-1:-1;19348:3:21;;18258:1099;-1:-1:-1;;;;;;;;18258:1099:21:o;19362:356::-;19564:2;19546:21;;;19583:18;;;19576:30;19642:34;19637:2;19622:18;;19615:62;19709:2;19694:18;;19362:356::o;19723:276::-;19854:3;19892:6;19886:13;19908:53;19954:6;19949:3;19942:4;19934:6;19930:17;19908:53;:::i;:::-;19977:16;;;;;19723:276;-1:-1:-1;;19723:276:21:o;22113:128::-;22153:3;22184:1;22180:6;22177:1;22174:13;22171:39;;;22190:18;;:::i;:::-;-1:-1:-1;22226:9:21;;22113:128::o;22246:397::-;22448:2;22430:21;;;22487:2;22467:18;;;22460:30;22526:34;22521:2;22506:18;;22499:62;-1:-1:-1;;;22592:2:21;22577:18;;22570:31;22633:3;22618:19;;22246:397::o;22648:217::-;22688:1;22714;22704:132;;22758:10;22753:3;22749:20;22746:1;22739:31;22793:4;22790:1;22783:15;22821:4;22818:1;22811:15;22704:132;-1:-1:-1;22850:9:21;;22648:217::o;22870:168::-;22910:7;22976:1;22972;22968:6;22964:14;22961:1;22958:21;22953:1;22946:9;22939:17;22935:45;22932:71;;;22983:18;;:::i;:::-;-1:-1:-1;23023:9:21;;22870:168::o;23043:606::-;23308:2;23304:15;;;-1:-1:-1;;23300:53:21;23288:66;;23270:3;-1:-1:-1;;;;;23366:31:21;;23363:51;;;23410:1;23407;23400:12;23363:51;23444:6;23441:1;23437:14;23495:6;23487;23482:2;23477:3;23473:12;23460:42;23564:2;23521:16;;23556:11;;;23598:18;;;;23640:2;23632:11;;23043:606;-1:-1:-1;;;;23043:606:21:o;25047:585::-;25264:2;25246:21;;;25283:18;;25276:34;;;-1:-1:-1;;;;;;25322:31:21;;25319:51;;;25366:1;25363;25356:12;25319:51;25400:6;25397:1;25393:14;25457:6;25449;25444:2;25433:9;25429:18;25416:48;25534:1;25487:22;;;25511:2;25483:31;25523:13;;;-1:-1:-1;;;;;25593:32:21;;;;25586:4;25571:20;;;25564:62;;;;-1:-1:-1;25483:31:21;25047:585;-1:-1:-1;;25047:585:21:o;25637:245::-;25704:6;25757:2;25745:9;25736:7;25732:23;25728:32;25725:52;;;25773:1;25770;25763:12;25725:52;25805:9;25799:16;25824:28;25846:5;25824:28;:::i;26242:184::-;26312:6;26365:2;26353:9;26344:7;26340:23;26336:32;26333:52;;;26381:1;26378;26371:12;26333:52;-1:-1:-1;26404:16:21;;26242:184;-1:-1:-1;26242:184:21:o
Swarm Source
ipfs://ba3f22d6b85a6b96df0b55083543c85a29c54f30ce5ca2e04aa5f542d3b823f1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.