ERC-721
Overview
Max Total Supply
484 AQUA
Holders
329
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AquaticWars
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./Base64.sol"; import "./Fish.sol"; import "./AliveFishWithBubble.sol"; import "./DeadFish.sol"; contract AquaticWars is ERC721Enumerable, Ownable { using Strings for uint256; struct Aqua { string name; string fishType; string description; string fishColor1; string fishColor2; string fishColor3; bool alive; uint256 spwanTimestamp; uint256 size; uint256 bubbleStillOnUntilTimestamp; uint256 deathTimestamp; } mapping (uint256 => Aqua) public aquas; uint256 public cost = 1 ether; uint256 public extendBubbleCost = 1 ether; uint256 public takeSteroidsCost = 1 ether; event Eaten (uint256 indexed _eaterId, uint256 indexed _eatenId); constructor() ERC721("AquaticWars", "AQUA") {} function mint() public payable { uint256 supply = totalSupply(); Aqua memory newAqua = Aqua( string(abi.encodePacked('Aquatic Wars #', uint256(supply + 1).toString())), "AquaFish", "Aquatic Wars is 100% on-chain, dynamic, NFT game.", randomNum(361, block.difficulty+10, supply).toString(), randomNum(361, block.timestamp, supply+20).toString(), randomNum(361, block.difficulty+30, block.timestamp).toString(), true, block.timestamp, 1, block.timestamp + 1 days, 0 ); if (msg.sender != owner()) { require(msg.value >= cost); } aquas[supply + 1] = newAqua; _safeMint(msg.sender, supply + 1); cost = (cost * 1001) / 1000; } function randomNum(uint256 _mod, uint256 _seed, uint _salt) public view returns(uint256) { uint256 num = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _seed, _salt))); num = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _seed, _salt, num))) % _mod; return num; } function getAquaByIndex(uint256 _tokenId) public view returns(Aqua memory) { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return aqua; } function getSize(uint256 _tokenId) public view returns(uint256) { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return aqua.size; } function hasBubble(uint256 _tokenId) public view returns(bool){ require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return ((int(block.timestamp) - int(aqua.bubbleStillOnUntilTimestamp)) < 0); } function eat(uint256 _eaterId, uint256 _eatenId) public { require(_exists(_eaterId),"ERC721Metadata: Query for nonexistent token"); require(_exists(_eatenId),"ERC721Metadata: Query for nonexistent token"); require(ownerOf(_eaterId) == msg.sender,"You are not the owner's of the eater Aqua"); require(isAlive(_eatenId),"Eaten Id has already been eaten"); require(isAlive(_eaterId),"Eater Id has already been eaten"); Aqua storage eater = aquas[_eaterId]; Aqua storage eaten = aquas[_eatenId]; require(eater.size > eaten.size, "Eater is not big enough to eat this fish"); require(!hasBubble(_eatenId),"You can't eat fish with a protective bubble"); if(getSize(_eaterId) > getSize(_eatenId) && !hasBubble(_eatenId)){ eaten.alive = false; eater.size = eater.size + 1; eaten.deathTimestamp = block.timestamp; emit Eaten(_eatenId, _eaterId); } } function extendBubble(uint256 _tokenId) payable public { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); require(isAlive(_tokenId),"Eaten Id has already been eaten"); if (msg.sender != owner()) { require(msg.value >= takeSteroidsCost, "You need to pay to take steroids"); } Aqua storage aqua = aquas[_tokenId]; if(hasBubble(_tokenId)){ aqua.bubbleStillOnUntilTimestamp = aqua.bubbleStillOnUntilTimestamp + 1 days; }else{ aqua.bubbleStillOnUntilTimestamp = block.timestamp + 1 days; } } function takeSteroids(uint256 _tokenId) payable public { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); require(isAlive(_tokenId),"Eaten Id has already been eaten"); if (msg.sender != owner()) { require(msg.value >= takeSteroidsCost, "You need to pay to take steroids"); } Aqua storage aqua = aquas[_tokenId]; aqua.size = aqua.size + 1; console.log("aqua.size: " , aqua.size); } function timeAlive(uint256 _tokenId) public view returns(uint256) { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return block.timestamp - aqua.spwanTimestamp; } function calculateDaysAlive(uint256 _tokenId) public view returns(uint256) { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return ((block.timestamp - aqua.spwanTimestamp) / 86400)+1; } function isAlive(uint256 _tokenId) public view returns(bool) { require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token"); Aqua memory aqua = aquas[_tokenId]; return aqua.alive; } function buildImage(uint256 _tokenId) public view returns(string memory) { Aqua memory currentAqua = aquas[_tokenId]; uint256 daysAlive = calculateDaysAlive(_tokenId); uint256 size = getSize(_tokenId); uint256 dimensions1 = 4800-size; uint256 dimensions2 = 10980-(size*2); if(dimensions1 < 0){ dimensions1 = 0; dimensions2 = 1380; } uint256 backgroundFinsColor1 = randomNum(361, block.difficulty, _tokenId+100); if(currentAqua.alive == false){ bytes memory imagePart1 = DeadFish.Fish2String(); bytes memory imagePart2 = bytes( abi.encodePacked( '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>', '</svg>' ) ); string memory svg = Base64.encode(bytes( abi.encodePacked( imagePart1, imagePart2 ) )); return svg; }else{ bytes memory imagePart1 = AliveFishWithBubble.Fish2StringPart1(); bytes memory imagePart2 = bytes( abi.encodePacked( '<defs>', '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradFish" gradientTransform="rotate(90)">', '<stop offset="0%" stop-color="hsl(',currentAqua.fishColor1,', 90%, 40%)"/>', '<stop offset="50%" stop-color="hsl(',currentAqua.fishColor2,', 90%, 37%)"/>', '<stop offset="100%" stop-color="hsl(',currentAqua.fishColor3,', 90%, 37%)"/>', '</linearGradient>', '</defs>' ) ); bytes memory imagePart3 = bytes( abi.encodePacked( '<defs>', '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradFishFin" gradientTransform="rotate(90)">', '<stop offset="0%" stop-color="hsl(',backgroundFinsColor1.toString(),', 80%, 40%)"/>', '<stop offset="50%" stop-color="hsl(',(backgroundFinsColor1+70).toString(),', 80%, 37%)"/>', '<stop offset="100%" stop-color="hsl(',(backgroundFinsColor1+200).toString(),', 80%, 37%)"/>', '</linearGradient>', '</defs>' ) ); if(hasBubble(_tokenId)){ bytes memory imagePart4 = AliveFishWithBubble.Fish2StringPart4(); bytes memory imagePart5 = bytes( abi.encodePacked( '<svg viewBox="-',dimensions1.toString(),' -',dimensions1.toString(),' ',dimensions2.toString(),' ',dimensions2.toString(),'">' ) ); bytes memory imagePart6 = Fish.Fish2String(); bytes memory imagePart7 = bytes( abi.encodePacked( '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>', '<text x="530" y="80" class="small">Days Alive: ',daysAlive.toString(),'</text>', '<text x="35" y="1330" class="small">Size: ',size.toString(),'</text>', '</svg>' ) ); string memory svg = Base64.encode(bytes( abi.encodePacked( imagePart1, imagePart2, imagePart3, imagePart4, imagePart5, imagePart6, imagePart7 ) )); return svg; }else{ bytes memory imagePart4 = bytes( abi.encodePacked( '<rect width="1380" height="1380" fill="url(#gradBackground)"/>', '<svg viewBox="-',dimensions1.toString(),' -',dimensions1.toString(),' ',dimensions2.toString(),' ',dimensions2.toString(),'">' ) ); bytes memory imagePart5 = Fish.Fish2String(); bytes memory imagePart6 = bytes( abi.encodePacked( '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>', '<text x="465" y="80" class="small">Days Alive: ',daysAlive.toString(),'</text>', '<text x="35" y="1330" class="small">Size: ',size.toString(),'</text>', '</svg>' ) ); string memory svg = Base64.encode(bytes( abi.encodePacked( imagePart1, imagePart2, imagePart3, imagePart4, imagePart5, imagePart6 ) )); return svg; } } } function buildMetadata(uint256 _tokenId) public view returns(string memory) { Aqua memory currentImage = aquas[_tokenId]; return string(abi.encodePacked( 'data:application/json;base64,', Base64.encode(bytes(abi.encodePacked( '{"name":"', currentImage.name, '", "description":"', currentImage.description, '", "image": "', 'data:image/svg+xml;base64,', buildImage(_tokenId), '"}'))))); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token"); return buildMetadata(_tokenId); } function setMintCost(uint256 _newCost) public onlyOwner() { cost = _newCost; } function setBubbleCost(uint256 _newCost) public onlyOwner() { extendBubbleCost = _newCost; } function setSteroidsCost(uint256 _newCost) public onlyOwner() { takeSteroidsCost = _newCost; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; library Fish { function Fish2String() public pure returns (bytes memory) { return bytes( abi.encodePacked( '<g transform="translate(0.000000,1380.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">', '<path fill="url(#gradFish)" d="M5255 10965 c-228 -31 -513 -112 -575 -163 -81 -68 -110 -207 -75 -362 10 -41 22 -96 28 -121 9 -42 8 -51 -21 -112 -38 -83 -151 -199 -330 -342 -407 -324 -678 -633 -837 -960 -113 -230 -149 -378 -150 -610 0 -121 5 -170 24 -255 23 -107 69 -237 114 -327 l26 -50 -22 -81 c-13 -45 -27 -86 -32 -90 -6 -5 -44 -22 -85 -37 -276 -101 -388 -241 -302 -376 34 -51 50 -66 114 -103 122 -69 109 -145 -82 -496 -92 -169 -131 -280 -137 -395 -4 -77 -2 -99 17 -149 29 -75 90 -137 168 -168 50 -20 74 -23 200 -23 l142 0 25 -85 c144 -484 385 -945 704 -1345 120 -150 391 -423 536 -539 418 -334 898 -557 1390 -645 197 -35 335 -44 574 -38 316 8 555 46 789 126 57 20 84 25 87 18 71 -233 143 -362 281 -501 164 -168 357 -253 644 -287 124 -14 331 -7 408 15 161 44 236 128 236 261 0 82 -31 154 -86 200 -42 35 -105 118 -124 164 -8 20 -24 70 -35 111 -24 90 -78 208 -119 260 -17 21 -30 42 -30 46 0 5 21 18 46 28 67 28 161 120 245 243 69 101 130 169 261 288 31 28 66 71 78 95 30 59 32 148 5 205 -80 166 -389 285 -740 285 -175 0 -281 -24 -430 -95 -148 -71 -301 -196 -396 -323 -24 -31 -46 -61 -50 -65 -4 -5 -27 10 -50 34 -24 23 -86 75 -137 116 -51 41 -111 97 -133 126 -219 276 -191 743 61 1045 98 117 268 224 418 263 107 27 108 27 128 -33 104 -316 342 -601 667 -797 226 -136 431 -120 701 57 117 77 211 101 461 117 216 14 332 51 411 130 136 136 86 329 -149 572 -205 212 -533 436 -775 529 l-72 28 93 95 c312 320 512 715 597 1175 61 334 48 718 -35 1047 -239 941 -941 1600 -1889 1773 -207 38 -340 48 -621 45 l-260 -3 -50 30 c-338 204 -770 367 -1155 434 -161 28 -540 36 -695 15z m526 -149 c128 -15 353 -55 345 -63 -2 -2 -66 0 -142 6 -481 35 -814 14 -984 -61 -146 -65 -187 -159 -139 -314 54 -173 -10 -319 -203 -466 -253 -192 -620 -540 -789 -748 -149 -182 -272 -370 -341 -520 -19 -41 -40 -86 -46 -100 l-12 -25 6 25 c16 73 61 196 104 285 96 198 217 361 428 577 129 131 185 181 458 406 174 143 286 279 314 381 14 52 12 141 -5 197 -39 128 -41 232 -6 275 39 48 376 131 616 152 101 9 281 6 396 -7z m1934 -481 c473 -27 966 -216 1320 -505 363 -297 627 -723 744 -1202 52 -211 65 -330 65 -568 0 -272 -21 -415 -101 -679 -126 -416 -406 -805 -745 -1036 -279 -190 -473 -281 -783 -369 -79 -22 -144 -36 -440 -92 -149 -28 -442 -37 -733 -23 -151 8 -276 11 -278 7 -2 -3 22 -16 53 -28 154 -58 339 -91 579 -105 l111 -7 -87 -86 c-98 -98 -132 -146 -190 -260 -134 -268 -144 -621 -26 -877 62 -133 110 -191 267 -317 279 -225 379 -433 280 -586 -62 -96 -167 -172 -322 -232 -132 -50 -402 -105 -578 -116 -87 -6 -107 -4 -214 25 -233 62 -382 119 -597 226 -621 311 -1072 855 -1235 1490 -140 546 -46 1054 251 1348 70 69 176 142 252 173 l55 22 85 -63 c162 -120 306 -186 319 -148 2 7 -4 19 -14 27 -10 8 -54 43 -98 77 -117 92 -290 271 -365 377 -125 177 -179 302 -216 497 -24 126 -25 408 -1 525 19 97 66 262 93 333 16 42 17 49 4 58 -24 15 -85 -62 -140 -176 -56 -116 -76 -174 -105 -305 l-20 -95 -45 5 c-25 3 -153 5 -285 4 -311 -1 -580 -30 -878 -95 -54 -11 -101 -18 -104 -15 -8 8 50 189 107 333 312 781 919 1445 1730 1890 575 316 1310 538 1898 572 133 8 178 8 387 -4z m-2862 -2841 c30 -4 47 -12 47 -20 0 -10 -16 -14 -57 -14 -32 -1 -110 -7 -173 -16 -63 -8 -214 -19 -335 -24 -323 -13 -568 -55 -793 -136 -111 -40 -174 -75 -197 -106 -27 -39 -19 -110 24 -214 71 -168 74 -247 15 -336 -22 -35 -116 -118 -133 -118 -4 0 9 34 30 75 76 157 100 296 65 379 -19 46 -80 112 -131 142 -23 13 -50 33 -60 44 -18 20 -18 21 10 50 124 129 721 272 1275 304 85 5 352 -2 413 -10z m62 -185 c4 -17 5 -32 3 -34 -2 -3 -53 2 -114 10 -155 21 -300 18 -480 -9 -29 -5 -33 -4 -18 3 57 25 325 58 491 60 l111 1 7 -31z m-7 -214 c-3 -3 -77 -22 -164 -41 -329 -74 -588 -170 -813 -302 -25 -14 -42 -21 -38 -15 8 13 252 152 332 188 137 63 313 114 512 150 130 24 181 29 171 20z m330 -439 l23 -18 -75 -43 c-104 -59 -161 -102 -237 -182 -132 -136 -232 -325 -284 -538 -10 -39 -19 -73 -21 -76 -2 -3 -31 8 -65 25 -50 25 -76 31 -149 34 -102 5 -161 -10 -255 -66 -126 -76 -185 -152 -185 -240 0 -91 36 -148 210 -332 146 -155 194 -215 228 -289 22 -48 24 -60 17 -135 -17 -187 -5 -239 69 -304 33 -29 117 -62 156 -62 35 0 120 32 148 55 l29 25 53 -93 c228 -401 540 -716 942 -951 82 -48 205 -109 378 -189 l35 -16 -35 6 c-316 49 -555 125 -855 273 -638 313 -1175 859 -1510 1535 -87 176 -141 306 -192 460 -36 108 -75 246 -71 250 2 1 35 13 73 25 406 132 987 489 1404 863 l84 75 31 -37 c17 -20 41 -44 54 -55z m4914 -1155 c83 -166 11 -226 -302 -251 -313 -25 -411 -52 -573 -162 -121 -82 -237 -115 -345 -98 -56 10 -153 53 -202 90 -20 16 -12 14 40 -7 86 -35 216 -43 291 -19 57 19 92 41 194 121 84 66 194 125 290 155 65 20 82 21 255 15 211 -8 254 -1 294 46 41 48 32 111 -29 214 l-35 60 45 -50 c25 -27 60 -79 77 -114z m-1454 -2274 c10 -34 29 -94 41 -133 27 -91 80 -177 159 -258 57 -60 62 -68 62 -110 0 -37 -5 -48 -31 -70 -54 -46 -127 -61 -289 -60 -153 0 -308 24 -424 64 -49 17 -176 85 -176 95 0 1 33 -10 74 -26 314 -122 688 -126 737 -8 16 40 7 67 -60 169 -78 119 -122 231 -129 334 -6 95 7 96 36 3z" />', '<path fill="url(#gradFishFin)" d="M6690 10149 c-605 -157 -1180 -438 -1661 -813 l-63 -49 25 -20 c51 -42 128 -70 180 -65 72 7 117 44 188 153 63 97 126 161 189 191 64 30 116 29 247 -7 107 -29 135 -33 250 -34 171 0 251 23 380 109 125 83 234 217 333 409 61 119 76 157 59 157 -7 -1 -64 -14 -127 -31z"/>', '<path fill="url(#gradFishFin)" d="M4479 8812 c-39 -10 -208 -208 -365 -427 l-79 -110 -3 -120 c-3 -119 -3 -120 23 -145 23 -22 35 -25 98 -24 57 0 80 5 110 23 49 30 132 33 175 5 121 -77 126 -79 182 -79 52 0 60 3 120 52 87 69 179 166 224 233 153 232 68 476 -200 571 -62 22 -235 34 -285 21z"/>', '<path d="M6823 8845 c-147 -45 -282 -208 -329 -395 -20 -80 -22 -216 -4 -290 30 -125 107 -231 199 -273 35 -16 66 -22 126 -22 108 0 173 30 266 124 111 114 171 267 172 441 1 288 -204 486 -430 415z m180 -262 c39 -41 57 -94 57 -165 -1 -164 -121 -246 -197 -135 -47 69 -51 184 -8 267 33 64 102 80 148 33z"/>', '<path d="M9183 8654 c-173 -86 -250 -350 -156 -533 40 -77 95 -114 178 -119 55 -4 73 0 119 22 165 81 248 328 172 510 -55 133 -187 183 -313 120z m46 -220 c52 -66 0 -212 -71 -202 -15 2 -29 16 -41 41 -26 52 -15 111 28 154 40 40 57 41 84 7z"/>', '<path d="M8794 8362 c-130 -104 -263 -138 -514 -129 -183 6 -268 19 -503 78 -160 40 -160 41 -186 21 -34 -25 -39 -47 -40 -187 -3 -463 181 -801 488 -895 79 -25 215 -27 292 -4 192 56 372 227 474 447 61 131 102 279 130 464 21 145 20 208 -5 233 -33 33 -70 25 -136 -28z m-775 -598 c142 -47 281 -155 358 -278 25 -38 25 -40 7 -53 -31 -22 -143 -53 -193 -53 -107 0 -218 55 -301 148 -48 54 -121 187 -135 246 l-6 29 93 -5 c64 -4 119 -14 177 -34z"/>', '</g>', '</svg>' )); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; library AliveFishWithBubble { function Fish2StringPart1() public pure returns (bytes memory) { return bytes( abi.encodePacked( '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1380pt" height="1380pt" viewBox="0 0 1380 1380" preserveAspectRatio="xMidYMid meet">', '<style> .small { font: 50px Comic Sans MS ; } </style>', '<defs>', '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradBackground" gradientTransform="rotate(90)">', '<stop offset="0%" stop-color="hsl(204, 80%, 84%)"/>', '<stop offset="50%" stop-color="hsl(204, 80%, 75%)"/>', '<stop offset="100%" stop-color="hsl(204, 80%, 60%)"/>', '</linearGradient>', '</defs>' ) ); } function Fish2StringPart4() public pure returns (bytes memory) { return bytes( abi.encodePacked( '<defs>', '<radialGradient cx="0.15" cy="0.15" r="0.95" id="gradBubble">', '<stop offset="0%" stop-color="hsl(200, 77%, 100%)"/>', '<stop offset="50%" stop-color="hsl(200, 77%, 80%)"/>', '<stop offset="100%" stop-color="hsl(200, 77%, 60%)"/>', '</radialGradient>', '</defs>', '<rect width="1380" height="1380" fill="url(#gradBackground)"/>' '<circle cx="690" cy="690" r="570" stroke="black" stroke-width="7" fill="url(#gradBubble)"/>' ) ); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; library DeadFish { function Fish2String() public pure returns (bytes memory) { return bytes( abi.encodePacked( '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1380pt" height="1380pt" viewBox="0 0 1380 1380" preserveAspectRatio="xMidYMid meet">', '<style> .small { font: 50px Comic Sans MS ; } </style>', '<defs>', '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradBackground" gradientTransform="rotate(90)">', '<stop offset="0%" stop-color="hsl(204, 80%, 84%)"/>', '<stop offset="50%" stop-color="hsl(204, 80%, 75%)"/>', '<stop offset="100%" stop-color="hsl(204, 80%, 60%)"/>', '</linearGradient>', '</defs>', '<rect width="1380" height="1380" fill="url(#gradBackground)"/>' ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// 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/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/AliveFishWithBubble.sol": { "AliveFishWithBubble": "0x6955b9915db05d6c42ac183c922c2bef72906673" }, "contracts/DeadFish.sol": { "DeadFish": "0xa1ab1d42fc84af0ed1ce6587e7defbc03febee98" }, "contracts/Fish.sol": { "Fish": "0x0be66de4fe323cbf7ab851a948e63edff94f95f2" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_eaterId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_eatenId","type":"uint256"}],"name":"Eaten","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"aquas","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"fishType","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"fishColor1","type":"string"},{"internalType":"string","name":"fishColor2","type":"string"},{"internalType":"string","name":"fishColor3","type":"string"},{"internalType":"bool","name":"alive","type":"bool"},{"internalType":"uint256","name":"spwanTimestamp","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"bubbleStillOnUntilTimestamp","type":"uint256"},{"internalType":"uint256","name":"deathTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buildImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buildMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"calculateDaysAlive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eaterId","type":"uint256"},{"internalType":"uint256","name":"_eatenId","type":"uint256"}],"name":"eat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"extendBubble","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"extendBubbleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAquaByIndex","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"fishType","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"fishColor1","type":"string"},{"internalType":"string","name":"fishColor2","type":"string"},{"internalType":"string","name":"fishColor3","type":"string"},{"internalType":"bool","name":"alive","type":"bool"},{"internalType":"uint256","name":"spwanTimestamp","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"bubbleStillOnUntilTimestamp","type":"uint256"},{"internalType":"uint256","name":"deathTimestamp","type":"uint256"}],"internalType":"struct AquaticWars.Aqua","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasBubble","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isAlive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mod","type":"uint256"},{"internalType":"uint256","name":"_seed","type":"uint256"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"randomNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setBubbleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setSteroidsCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"takeSteroids","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"takeSteroidsCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"timeAlive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000600c55670de0b6b3a7640000600d55670de0b6b3a7640000600e553480156200003557600080fd5b50604080518082018252600b81526a417175617469635761727360a81b6020808301918252835180850190945260048452634151554160e01b908401528151919291620000859160009162000114565b5080516200009b90600190602084019062000114565b505050620000b8620000b2620000be60201b60201c565b620000c2565b620001f7565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012290620001ba565b90600052602060002090601f01602090048101928262000146576000855562000191565b82601f106200016157805160ff191683800117855562000191565b8280016001018555821562000191579182015b828111156200019157825182559160200191906001019062000174565b506200019f929150620001a3565b5090565b5b808211156200019f5760008155600101620001a4565b600181811c90821680620001cf57607f821691505b60208210811415620001f157634e487b7160e01b600052602260045260246000fd5b50919050565b615eeb80620002076000396000f3fe60806040526004361061023b5760003560e01c8063704416471161012e578063c3a0a278116100ab578063e985e9c51161006f578063e985e9c514610678578063edf87704146106c1578063ee2dc001146106e1578063f2fde38b14610701578063fcd1a0101461072157600080fd5b8063c3a0a278146105d5578063c6ebc8ea14610602578063c87b56dd14610618578063d24bd15614610638578063d84b23611461065857600080fd5b80638da5cb5b116100f25780638da5cb5b1461054257806395d89b4114610560578063a22cb46514610575578063b88d4fde14610595578063c1b52ee2146105b557600080fd5b806370441647146104ba57806370a08231146104cd578063715018a6146104ed57806380eb4981146105025780638545f4ea1461052257600080fd5b806314a55fb4116101bc5780632f745c59116101805780632f745c59146104325780633ccfd60b1461045257806342842e0e1461045a5780634f6ccce71461047a5780636352211e1461049a57600080fd5b806314a55fb41461038657806318160ddd146103bd57806323b872dd146103d257806328294640146103f25780632ba80eba1461041257600080fd5b8063095ea7b311610203578063095ea7b3146103135780630da534e6146103355780631249c58b1461034857806313faede61461035057806314884cbb1461036657600080fd5b806301ffc9a714610240578063023c23db1461027557806306fdde03146102a357806307d426d3146102c5578063081812fc146102db575b600080fd5b34801561024c57600080fd5b5061026061025b366004614ec8565b610741565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004614f6a565b61076c565b60405190815260200161026c565b3480156102af57600080fd5b506102b8610b64565b60405161026c9190615920565b3480156102d157600080fd5b50610295600e5481565b3480156102e757600080fd5b506102fb6102f6366004614f6a565b610bf6565b6040516001600160a01b03909116815260200161026c565b34801561031f57600080fd5b5061033361032e366004614e9f565b610c7e565b005b610333610343366004614f6a565b610d94565b610333610e8a565b34801561035c57600080fd5b50610295600c5481565b34801561037257600080fd5b50610260610381366004614f6a565b611121565b34801561039257600080fd5b506103a66103a1366004614f6a565b611522565b60405161026c9b9a99989796959493929190615933565b3480156103c957600080fd5b50600854610295565b3480156103de57600080fd5b506103336103ed366004614d87565b6118a9565b3480156103fe57600080fd5b5061029561040d366004614fa3565b6118da565b34801561041e57600080fd5b506102b861042d366004614f6a565b61197c565b34801561043e57600080fd5b5061029561044d366004614e9f565b6122b2565b610333612348565b34801561046657600080fd5b50610333610475366004614d87565b6123e6565b34801561048657600080fd5b50610295610495366004614f6a565b612401565b3480156104a657600080fd5b506102fb6104b5366004614f6a565b6124a2565b6103336104c8366004614f6a565b612519565b3480156104d957600080fd5b506102956104e8366004614d3b565b612617565b3480156104f957600080fd5b5061033361269e565b34801561050e57600080fd5b5061033361051d366004614f6a565b6126d4565b34801561052e57600080fd5b5061033361053d366004614f6a565b612703565b34801561054e57600080fd5b50600a546001600160a01b03166102fb565b34801561056c57600080fd5b506102b8612732565b34801561058157600080fd5b50610333610590366004614e65565b612741565b3480156105a157600080fd5b506103336105b0366004614dc2565b61274c565b3480156105c157600080fd5b506103336105d0366004614f82565b612784565b3480156105e157600080fd5b506105f56105f0366004614f6a565b612a24565b60405161026c9190615b59565b34801561060e57600080fd5b50610295600d5481565b34801561062457600080fd5b506102b8610633366004614f6a565b612e6b565b34801561064457600080fd5b50610295610653366004614f6a565b612ee3565b34801561066457600080fd5b50610260610673366004614f6a565b6132df565b34801561068457600080fd5b50610260610693366004614d55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cd57600080fd5b506102b86106dc366004614f6a565b6136cd565b3480156106ed57600080fd5b506102956106fc366004614f6a565b613ae7565b34801561070d57600080fd5b5061033361071c366004614d3b565b613ef6565b34801561072d57600080fd5b5061033361073c366004614f6a565b613f8e565b60006001600160e01b0319821663780e9d6360e01b1480610766575061076682613fbd565b92915050565b60006107778261400d565b61079c5760405162461bcd60e51b815260040161079390615a36565b60405180910390fd5b6000828152600b6020526040808220815161016081019092528054829082906107c490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090615d82565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050815260200160018201805461085690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461088290615d82565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b505050505081526020016002820180546108e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461091490615d82565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050815260200160038201805461097a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690615d82565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b50505050508152602001600482018054610a0c90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3890615d82565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b50505050508152602001600582018054610a9e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610aca90615d82565b8015610b175780601f10610aec57610100808354040283529160200191610b17565b820191906000526020600020905b815481529060010190602001808311610afa57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261010001519392505050565b606060008054610b7390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f90615d82565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b5050505050905090565b6000610c018261400d565b610c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b506000908152600460205260409020546001600160a01b031690565b6000610c89826124a2565b9050806001600160a01b0316836001600160a01b03161415610cf75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610793565b336001600160a01b0382161480610d135750610d138133610693565b610d855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610793565b610d8f838361402a565b505050565b610d9d8161400d565b610db95760405162461bcd60e51b815260040161079390615a36565b610dc2816132df565b610dde5760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b03163314610e4257600e54341015610e425760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b60205260409020610e5982611121565b15610e79576009810154610e709062015180615cb5565b60098201555050565b610e704262015180615cb5565b5050565b6000610e9560085490565b90506000604051806101600160405280610eba846001610eb59190615cb5565b614098565b604051602001610eca919061558d565b604051602081830303815290604052815260200160405180604001604052806008815260200167082e2eac28cd2e6d60c31b8152508152602001604051806060016040528060318152602001615e85603191398152602001610f3c610eb5610169610f3644600a615cb5565b876118da565b8152602001610f56610eb56101694261040d886014615cb5565b8152602001610f75610eb5610169610f6f44601e615cb5565b426118da565b8152602001600115158152602001428152602001600181526020014262015180610f9f9190615cb5565b815260200160008152509050610fbd600a546001600160a01b031690565b6001600160a01b0316336001600160a01b031614610fe457600c54341015610fe457600080fd5b80600b6000610ff4856001615cb5565b815260208082019290925260400160002082518051919261101a92849290910190614c86565b5060208281015180516110339260018501920190614c86565b506040820151805161104f916002840191602090910190614c86565b506060820151805161106b916003840191602090910190614c86565b5060808201518051611087916004840191602090910190614c86565b5060a082015180516110a3916005840191602090910190614c86565b5060c082015160068201805460ff191691151591909117905560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101556110fd336110f8846001615cb5565b6141ba565b6103e8600c546103e96111109190615ce1565b61111a9190615ccd565b600c555050565b600061112c8261400d565b6111485760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061117090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615d82565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050815260200160018201805461120290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461122e90615d82565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200160028201805461129490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546112c090615d82565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b5050505050815260200160038201805461132690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461135290615d82565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081526020016004820180546113b890615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546113e490615d82565b80156114315780601f1061140657610100808354040283529160200191611431565b820191906000526020600020905b81548152906001019060200180831161141457829003601f168201915b5050505050815260200160058201805461144a90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461147690615d82565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261012081015190915060009061151a9042615d00565b129392505050565b600b6020526000908152604090208054819061153d90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461156990615d82565b80156115b65780601f1061158b576101008083540402835291602001916115b6565b820191906000526020600020905b81548152906001019060200180831161159957829003601f168201915b5050505050908060010180546115cb90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790615d82565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b50505050509080600201805461165990615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461168590615d82565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050908060030180546116e790615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461171390615d82565b80156117605780601f1061173557610100808354040283529160200191611760565b820191906000526020600020905b81548152906001019060200180831161174357829003601f168201915b50505050509080600401805461177590615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546117a190615d82565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509080600501805461180390615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90615d82565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b5050506006840154600785015460088601546009870154600a90970154959660ff9093169591945092508b565b6118b333826141d4565b6118cf5760405162461bcd60e51b815260040161079390615b08565b610d8f8383836142ba565b604080514260208083018290523360601b6bffffffffffffffffffffffff19168385018190526054840187905260748085018790528551808603909101815260948501865280519083012060b485019390935260d484015260e883018690526101088301859052610128808401839052845180850390910181526101489093019093528151919092012060009190611973908690615dd8565b95945050505050565b60606000600b6000848152602001908152602001600020604051806101600160405290816000820180546119af90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546119db90615d82565b8015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b50505050508152602001600182018054611a4190615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d90615d82565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b50505050508152602001600282018054611ad390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611aff90615d82565b8015611b4c5780601f10611b2157610100808354040283529160200191611b4c565b820191906000526020600020905b815481529060010190602001808311611b2f57829003601f168201915b50505050508152602001600382018054611b6590615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9190615d82565b8015611bde5780601f10611bb357610100808354040283529160200191611bde565b820191906000526020600020905b815481529060010190602001808311611bc157829003601f168201915b50505050508152602001600482018054611bf790615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390615d82565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050508152602001600582018054611c8990615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590615d82565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015290506000611d5084613ae7565b90506000611d5d8561076c565b90506000611d6d826112c0615d3f565b90506000611d7c836002615ce1565b611d8890612ae4615d3f565b90506000611d9e6101694461040d8b6064615cb5565b60c0870151909150611e9557600073a1ab1d42fc84af0ed1ce6587e7defbc03febee9863807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b158015611df057600080fd5b505af4158015611e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2c9190810190614f00565b90506000611e398a614098565b604051602001611e499190615455565b60405160208183030381529060405290506000611e868383604051602001611e729291906150cf565b604051602081830303815290604052614465565b9b9a5050505050505050505050565b6000736955b9915db05d6c42ac183c922c2bef7290667363e695d1506040518163ffffffff1660e01b815260040160006040518083038186803b158015611edb57600080fd5b505af4158015611eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f179190810190614f00565b90506000876060015188608001518960a00151604051602001611f3c93929190615608565b60405160208183030381529060405290506000611f5884614098565b611f66610eb5866046615cb5565b611f74610eb58760c8615cb5565b604051602001611f869392919061574f565b6040516020818303038152906040529050611fa08b611121565b15612171576000736955b9915db05d6c42ac183c922c2bef729066736389788cfa6040518163ffffffff1660e01b815260040160006040518083038186803b158015611feb57600080fd5b505af4158015611fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120279190810190614f00565b9050600061203488614098565b61203d89614098565b61204689614098565b61204f8a614098565b6040516020016120629493929190615844565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120f59190810190614f00565b905060006121028f614098565b61210b8d614098565b6121148d614098565b604051602001612126939291906152d6565b6040516020818303038152906040529050600061215988888888888888604051602001611e72979695949392919061517d565b9050809e505050505050505050505050505050919050565b600061217c87614098565b61218588614098565b61218e88614098565b61219789614098565b6040516020016121aa9493929190615499565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b15801561220157600080fd5b505af4158015612215573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223d9190810190614f00565b9050600061224a8e614098565b6122538c614098565b61225c8c614098565b60405160200161226e939291906153d6565b6040516020818303038152906040529050600061229f878787878787604051602001611e72969594939291906150fe565b9f9e505050505050505050505050505050565b60006122bd83612617565b821061231f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610793565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146123725760405162461bcd60e51b815260040161079390615ad3565b6000612386600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b50509050806123e357600080fd5b50565b610d8f8383836040518060200160405280600081525061274c565b600061240c60085490565b821061246f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610793565b6008828154811061249057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610793565b6125228161400d565b61253e5760405162461bcd60e51b815260040161079390615a36565b612547816132df565b6125635760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b031633146125c757600e543410156125c75760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b6020526040902060088101546125e5906001615cb5565b6008820181905560408051808201909152600b81526a030b8bab09739b4bd329d160ad1b6020820152610e86916145db565b60006001600160a01b0382166126825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610793565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146126c85760405162461bcd60e51b815260040161079390615ad3565b6126d26000614620565b565b600a546001600160a01b031633146126fe5760405162461bcd60e51b815260040161079390615ad3565b600e55565b600a546001600160a01b0316331461272d5760405162461bcd60e51b815260040161079390615ad3565b600c55565b606060018054610b7390615d82565b610e86338383614672565b61275633836141d4565b6127725760405162461bcd60e51b815260040161079390615b08565b61277e84848484614741565b50505050565b61278d8261400d565b6127a95760405162461bcd60e51b815260040161079390615a36565b6127b28161400d565b6127ce5760405162461bcd60e51b815260040161079390615a36565b336127d8836124a2565b6001600160a01b0316146128405760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e65722773206f6620746865206560448201526861746572204171756160b81b6064820152608401610793565b612849816132df565b6128655760405162461bcd60e51b8152600401610793906159ff565b61286e826132df565b6128ba5760405162461bcd60e51b815260206004820152601f60248201527f45617465722049642068617320616c7265616479206265656e20656174656e006044820152606401610793565b6000828152600b6020526040808220838352912060088082015490830154116129365760405162461bcd60e51b815260206004820152602860248201527f4561746572206973206e6f742062696720656e6f75676820746f2065617420746044820152670d0d2e640ccd2e6d60c31b6064820152608401610793565b61293f83611121565b156129a05760405162461bcd60e51b815260206004820152602b60248201527f596f752063616e2774206561742066697368207769746820612070726f74656360448201526a7469766520627562626c6560a81b6064820152608401610793565b6129a98361076c565b6129b28561076c565b1180156129c557506129c383611121565b155b1561277e5760068101805460ff1916905560088201546129e6906001615cb5565b600883015542600a820155604051849084907f8d200ab8996878eb7c4e6051f07ecaf41372be7348232c623b3c58e80d2e83e490600090a350505050565b612a83604051806101600160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081525090565b612a8c8261400d565b612aa85760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612ad090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612afc90615d82565b8015612b495780601f10612b1e57610100808354040283529160200191612b49565b820191906000526020600020905b815481529060010190602001808311612b2c57829003601f168201915b50505050508152602001600182018054612b6290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8e90615d82565b8015612bdb5780601f10612bb057610100808354040283529160200191612bdb565b820191906000526020600020905b815481529060010190602001808311612bbe57829003601f168201915b50505050508152602001600282018054612bf490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2090615d82565b8015612c6d5780601f10612c4257610100808354040283529160200191612c6d565b820191906000526020600020905b815481529060010190602001808311612c5057829003601f168201915b50505050508152602001600382018054612c8690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb290615d82565b8015612cff5780601f10612cd457610100808354040283529160200191612cff565b820191906000526020600020905b815481529060010190602001808311612ce257829003601f168201915b50505050508152602001600482018054612d1890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4490615d82565b8015612d915780601f10612d6657610100808354040283529160200191612d91565b820191906000526020600020905b815481529060010190602001808311612d7457829003601f168201915b50505050508152602001600582018054612daa90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd690615d82565b8015612e235780601f10612df857610100808354040283529160200191612e23565b820191906000526020600020905b815481529060010190602001808311612e0657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a0909101529392505050565b6060612e768261400d565b612eda5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610793565b610766826136cd565b6000612eee8261400d565b612f0a5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612f3290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5e90615d82565b8015612fab5780601f10612f8057610100808354040283529160200191612fab565b820191906000526020600020905b815481529060010190602001808311612f8e57829003601f168201915b50505050508152602001600182018054612fc490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615d82565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050815260200160028201805461305690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461308290615d82565b80156130cf5780601f106130a4576101008083540402835291602001916130cf565b820191906000526020600020905b8154815290600101906020018083116130b257829003601f168201915b505050505081526020016003820180546130e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461311490615d82565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050815260200160048201805461317a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546131a690615d82565b80156131f35780601f106131c8576101008083540402835291602001916131f3565b820191906000526020600020905b8154815290600101906020018083116131d657829003601f168201915b5050505050815260200160058201805461320c90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461323890615d82565b80156132855780601f1061325a57610100808354040283529160200191613285565b820191906000526020600020905b81548152906001019060200180831161326857829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506132d89042615d3f565b9392505050565b60006132ea8261400d565b6133065760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061332e90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461335a90615d82565b80156133a75780601f1061337c576101008083540402835291602001916133a7565b820191906000526020600020905b81548152906001019060200180831161338a57829003601f168201915b505050505081526020016001820180546133c090615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546133ec90615d82565b80156134395780601f1061340e57610100808354040283529160200191613439565b820191906000526020600020905b81548152906001019060200180831161341c57829003601f168201915b5050505050815260200160028201805461345290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461347e90615d82565b80156134cb5780601f106134a0576101008083540402835291602001916134cb565b820191906000526020600020905b8154815290600101906020018083116134ae57829003601f168201915b505050505081526020016003820180546134e490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461351090615d82565b801561355d5780601f106135325761010080835404028352916020019161355d565b820191906000526020600020905b81548152906001019060200180831161354057829003601f168201915b5050505050815260200160048201805461357690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546135a290615d82565b80156135ef5780601f106135c4576101008083540402835291602001916135ef565b820191906000526020600020905b8154815290600101906020018083116135d257829003601f168201915b5050505050815260200160058201805461360890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461363490615d82565b80156136815780601f1061365657610100808354040283529160200191613681565b820191906000526020600020905b81548152906001019060200180831161366457829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260c001519392505050565b60606000600b60008481526020019081526020016000206040518061016001604052908160008201805461370090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461372c90615d82565b80156137795780601f1061374e57610100808354040283529160200191613779565b820191906000526020600020905b81548152906001019060200180831161375c57829003601f168201915b5050505050815260200160018201805461379290615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546137be90615d82565b801561380b5780601f106137e05761010080835404028352916020019161380b565b820191906000526020600020905b8154815290600101906020018083116137ee57829003601f168201915b5050505050815260200160028201805461382490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461385090615d82565b801561389d5780601f106138725761010080835404028352916020019161389d565b820191906000526020600020905b81548152906001019060200180831161388057829003601f168201915b505050505081526020016003820180546138b690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546138e290615d82565b801561392f5780601f106139045761010080835404028352916020019161392f565b820191906000526020600020905b81548152906001019060200180831161391257829003601f168201915b5050505050815260200160048201805461394890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461397490615d82565b80156139c15780601f10613996576101008083540402835291602001916139c1565b820191906000526020600020905b8154815290600101906020018083116139a457829003601f168201915b505050505081526020016005820180546139da90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0690615d82565b8015613a535780601f10613a2857610100808354040283529160200191613a53565b820191906000526020600020905b815481529060010190602001808311613a3657829003601f168201915b5050509183525050600682015460ff161515602082015260078201546040808301919091526008830154606083015260098301546080830152600a9092015460a090910152815190820151919250613ac091613aae8661197c565b604051602001611e729392919061520f565b604051602001613ad091906155c3565b604051602081830303815290604052915050919050565b6000613af28261400d565b613b0e5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290613b3690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613b6290615d82565b8015613baf5780601f10613b8457610100808354040283529160200191613baf565b820191906000526020600020905b815481529060010190602001808311613b9257829003601f168201915b50505050508152602001600182018054613bc890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613bf490615d82565b8015613c415780601f10613c1657610100808354040283529160200191613c41565b820191906000526020600020905b815481529060010190602001808311613c2457829003601f168201915b50505050508152602001600282018054613c5a90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8690615d82565b8015613cd35780601f10613ca857610100808354040283529160200191613cd3565b820191906000526020600020905b815481529060010190602001808311613cb657829003601f168201915b50505050508152602001600382018054613cec90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613d1890615d82565b8015613d655780601f10613d3a57610100808354040283529160200191613d65565b820191906000526020600020905b815481529060010190602001808311613d4857829003601f168201915b50505050508152602001600482018054613d7e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613daa90615d82565b8015613df75780601f10613dcc57610100808354040283529160200191613df7565b820191906000526020600020905b815481529060010190602001808311613dda57829003601f168201915b50505050508152602001600582018054613e1090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613e3c90615d82565b8015613e895780601f10613e5e57610100808354040283529160200191613e89565b820191906000526020600020905b815481529060010190602001808311613e6c57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506201518090613ee19042615d3f565b613eeb9190615ccd565b6132d8906001615cb5565b600a546001600160a01b03163314613f205760405162461bcd60e51b815260040161079390615ad3565b6001600160a01b038116613f855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b6123e381614620565b600a546001600160a01b03163314613fb85760405162461bcd60e51b815260040161079390615ad3565b600d55565b60006001600160e01b031982166380ac58cd60e01b1480613fee57506001600160e01b03198216635b5e139f60e01b145b8061076657506301ffc9a760e01b6001600160e01b0319831614610766565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061405f826124a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816140bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e657806140d081615dbd565b91506140df9050600a83615ccd565b91506140c0565b60008167ffffffffffffffff81111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156141b25761414e600183615d3f565b915061415b600a86615dd8565b614166906030615cb5565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615ccd565b945061413d565b949350505050565b610e86828260405180602001604052806000815250614774565b60006141df8261400d565b6142405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b600061424b836124a2565b9050806001600160a01b0316846001600160a01b031614806142865750836001600160a01b031661427b84610bf6565b6001600160a01b0316145b806141b257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166141b2565b826001600160a01b03166142cd826124a2565b6001600160a01b0316146143355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610793565b6001600160a01b0382166143975760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6143a28383836147a7565b6143ad60008261402a565b6001600160a01b03831660009081526003602052604081208054600192906143d6908490615d3f565b90915550506001600160a01b0382166000908152600360205260408120805460019290614404908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081516000141561448557505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e4560409139905060006003845160026144b49190615cb5565b6144be9190615ccd565b6144c9906004615ce1565b905060006144d8826020615cb5565b67ffffffffffffffff8111156144fe57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614528576020820181803683370190505b509050818152600183018586518101602084015b818310156145965760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161453c565b6003895106600181146145b057600281146145c1576145cd565b613d3d60f01b6001198301526145cd565b603d60f81b6000198301525b509398975050505050505050565b610e8682826040516024016145f19291906159dd565b60408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905261485f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156146d45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610793565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61474c8484846142ba565b61475884848484614880565b61277e5760405162461bcd60e51b815260040161079390615a81565b61477e838361498d565b61478b6000848484614880565b610d8f5760405162461bcd60e51b815260040161079390615a81565b6001600160a01b038316614802576147fd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614825565b816001600160a01b0316836001600160a01b031614614825576148258382614acc565b6001600160a01b03821661483c57610d8f81614b69565b826001600160a01b0316826001600160a01b031614610d8f57610d8f8282614c42565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60006001600160a01b0384163b1561498257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906148c49033908990889088906004016158ed565b602060405180830381600087803b1580156148de57600080fd5b505af192505050801561490e575060408051601f3d908101601f1916820190925261490b91810190614ee4565b60015b614968573d80801561493c576040519150601f19603f3d011682016040523d82523d6000602084013e614941565b606091505b5080516149605760405162461bcd60e51b815260040161079390615a81565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506141b2565b506001949350505050565b6001600160a01b0382166149e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610793565b6149ec8161400d565b15614a395760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610793565b614a45600083836147a7565b6001600160a01b0382166000908152600360205260408120805460019290614a6e908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614ad984612617565b614ae39190615d3f565b600083815260076020526040902054909150808214614b36576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b7b90600190615d3f565b60008381526009602052604081205460088054939450909284908110614bb157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110614be057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614c2657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614c4d83612617565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054614c9290615d82565b90600052602060002090601f016020900481019282614cb45760008555614cfa565b82601f10614ccd57805160ff1916838001178555614cfa565b82800160010185558215614cfa579182015b82811115614cfa578251825591602001919060010190614cdf565b50614d06929150614d0a565b5090565b5b80821115614d065760008155600101614d0b565b80356001600160a01b0381168114614d3657600080fd5b919050565b600060208284031215614d4c578081fd5b6132d882614d1f565b60008060408385031215614d67578081fd5b614d7083614d1f565b9150614d7e60208401614d1f565b90509250929050565b600080600060608486031215614d9b578081fd5b614da484614d1f565b9250614db260208501614d1f565b9150604084013590509250925092565b60008060008060808587031215614dd7578081fd5b614de085614d1f565b9350614dee60208601614d1f565b925060408501359150606085013567ffffffffffffffff811115614e10578182fd5b8501601f81018713614e20578182fd5b8035614e33614e2e82615c8d565b615c5c565b818152886020838501011115614e47578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614e77578182fd5b614e8083614d1f565b915060208301358015158114614e94578182fd5b809150509250929050565b60008060408385031215614eb1578182fd5b614eba83614d1f565b946020939093013593505050565b600060208284031215614ed9578081fd5b81356132d881615e2e565b600060208284031215614ef5578081fd5b81516132d881615e2e565b600060208284031215614f11578081fd5b815167ffffffffffffffff811115614f27578182fd5b8201601f81018413614f37578182fd5b8051614f45614e2e82615c8d565b818152856020838501011115614f59578384fd5b611973826020830160208601615d56565b600060208284031215614f7b578081fd5b5035919050565b60008060408385031215614f94578182fd5b50508035926020909101359150565b600080600060608486031215614fb7578283fd5b505081359360208301359350604090920135919050565b60008151808452614fe6816020860160208601615d56565b601f01601f19169290920160200192915050565b7f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22688152620e6d8560eb1b602082015260230190565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152630d0e6d8560e31b602082015260240190565b7f3c7465787420783d2233352220793d2238302220636c6173733d22736d616c6c8152630111f11960e51b602082015260240190565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2268738152610d8560f31b602082015260220190565b600083516150e1818460208801615d56565b8351908301906150f5818360208801615d56565b01949350505050565b6000875160206151118285838d01615d56565b8851918401916151248184848d01615d56565b88519201916151368184848c01615d56565b87519201916151488184848b01615d56565b865192019161515a8184848a01615d56565b855192019161516c8184848901615d56565b919091019998505050505050505050565b6000885160206151908285838e01615d56565b8951918401916151a38184848e01615d56565b89519201916151b58184848d01615d56565b88519201916151c78184848c01615d56565b87519201916151d98184848b01615d56565b86519201916151eb8184848a01615d56565b85519201916151fd8184848901615d56565b919091019a9950505050505050505050565b683d913730b6b2911d1160b91b81528351600090615234816009850160208901615d56565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161526681601b840160208901615d56565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516152ba816042840160208801615d56565b61227d60f01b6042929091019182015260440195945050505050565b60006152e182615065565b85516152f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223533302220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b603692019182018190526153a2603d83017f3c7465787420783d2233352220793d22313333302220636c6173733d22736d6181526903636111f29b4bd329d160b51b6020820152602a0190565b915084516153b4818460208901615d56565b91909101908152651e17b9bb339f60d11b6007820152600d0195945050505050565b60006153e182615065565b85516153f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223436352220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b600061546082615065565b8351615470818360208801615d56565b661e17ba32bc3a1f60c91b9101908152651e17b9bb339f60d11b6007820152600d019392505050565b7f3c726563742077696474683d223133383022206865696768743d22313338302281527f2066696c6c3d2275726c2823677261644261636b67726f756e6429222f3e000060208201526e3c7376672076696577426f783d222d60881b603e8201526000855161550f81604d850160208a01615d56565b61202d60f01b604d91840191820152855161553181604f840160208a01615d56565b808201915050600160fd1b80604f8301528551615555816050850160208a01615d56565b60509201918201528351615570816051840160208801615d56565b61111f60f11b605192909101918201526053019695505050505050565b6d417175617469632057617273202360901b8152600082516155b681600e850160208701615d56565b91909101600e0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516155fb81601d850160208701615d56565b91909101601d0192915050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d2267726164466973682220677261646960268201527f656e745472616e73666f726d3d22726f7461746528393029223e000000000000604682015260006156946060830161509b565b85516156a4818360208a01615d56565b6d16101c981296101a18129491179f60911b91019081526156c7600e8201614ffa565b905084516156d9818360208901615d56565b6d16101c98129610199b929491179f60911b9101818152906156fd600e830161502f565b9150845161570f818460208901615d56565b91909101908152701e17b634b732b0b923b930b234b2b73a1f60791b600e820152661e17b232b3399f60c91b601f820152602681015b9695505050505050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d22677261644669736846696e2220677260268201527f616469656e745472616e73666f726d3d22726f7461746528393029223e000000604682015260006157db6063830161509b565b85516157eb818360208a01615d56565b6d16101c181296101a18129491179f60911b910190815261580e600e8201614ffa565b90508451615820818360208901615d56565b6d16101c18129610199b929491179f60911b9101818152906156fd600e830161502f565b6e3c7376672076696577426f783d222d60881b8152845160009061586f81600f850160208a01615d56565b61202d60f01b600f918401918201528551615891816011840160208a01615d56565b808201915050600160fd1b80601183015285516158b5816012850160208a01615d56565b601292019182015283516158d0816013840160208801615d56565b61111f60f11b601392909101918201526015019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061574590830184614fce565b6020815260006132d86020830184614fce565b60006101608083526159478184018f614fce565b9050828103602084015261595b818e614fce565b9050828103604084015261596f818d614fce565b90508281036060840152615983818c614fce565b90508281036080840152615997818b614fce565b905082810360a08401526159ab818a614fce565b97151560c0840152505060e0810194909452610100840192909252610120830152610140909101529695505050505050565b6040815260006159f06040830185614fce565b90508260208301529392505050565b6020808252601f908201527f456174656e2049642068617320616c7265616479206265656e20656174656e00604082015260600190565b6020808252602b908201527f4552433732314d657461646174613a20517565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251610160806020850152615b78610180850183614fce565b91506020850151601f1980868503016040870152615b968483614fce565b93506040870151915080868503016060870152615bb38483614fce565b93506060870151915080868503016080870152615bd08483614fce565b935060808701519150808685030160a0870152615bed8483614fce565b935060a08701519150808685030160c087015250615c0b8382614fce565b92505060c0850151615c2160e086018215159052565b5060e0850151610100858101919091528501516101208086019190915285015161014080860191909152909401519390920192909252919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615c8557615c85615e18565b604052919050565b600067ffffffffffffffff821115615ca757615ca7615e18565b50601f01601f191660200190565b60008219821115615cc857615cc8615dec565b500190565b600082615cdc57615cdc615e02565b500490565b6000816000190483118215151615615cfb57615cfb615dec565b500290565b60008083128015600160ff1b850184121615615d1e57615d1e615dec565b6001600160ff1b0384018313811615615d3957615d39615dec565b50500390565b600082821015615d5157615d51615dec565b500390565b60005b83811015615d71578181015183820152602001615d59565b8381111561277e5750506000910152565b600181811c90821680615d9657607f821691505b60208210811415615db757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615dd157615dd1615dec565b5060010190565b600082615de757615de7615e02565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146123e357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4171756174696320576172732069732031303025206f6e2d636861696e2c2064796e616d69632c204e46542067616d652ea264697066735822122096d3491e38ada46f7241314df1a374e18f87786388209de074fd0c30d85ca35364736f6c63430008040033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063704416471161012e578063c3a0a278116100ab578063e985e9c51161006f578063e985e9c514610678578063edf87704146106c1578063ee2dc001146106e1578063f2fde38b14610701578063fcd1a0101461072157600080fd5b8063c3a0a278146105d5578063c6ebc8ea14610602578063c87b56dd14610618578063d24bd15614610638578063d84b23611461065857600080fd5b80638da5cb5b116100f25780638da5cb5b1461054257806395d89b4114610560578063a22cb46514610575578063b88d4fde14610595578063c1b52ee2146105b557600080fd5b806370441647146104ba57806370a08231146104cd578063715018a6146104ed57806380eb4981146105025780638545f4ea1461052257600080fd5b806314a55fb4116101bc5780632f745c59116101805780632f745c59146104325780633ccfd60b1461045257806342842e0e1461045a5780634f6ccce71461047a5780636352211e1461049a57600080fd5b806314a55fb41461038657806318160ddd146103bd57806323b872dd146103d257806328294640146103f25780632ba80eba1461041257600080fd5b8063095ea7b311610203578063095ea7b3146103135780630da534e6146103355780631249c58b1461034857806313faede61461035057806314884cbb1461036657600080fd5b806301ffc9a714610240578063023c23db1461027557806306fdde03146102a357806307d426d3146102c5578063081812fc146102db575b600080fd5b34801561024c57600080fd5b5061026061025b366004614ec8565b610741565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004614f6a565b61076c565b60405190815260200161026c565b3480156102af57600080fd5b506102b8610b64565b60405161026c9190615920565b3480156102d157600080fd5b50610295600e5481565b3480156102e757600080fd5b506102fb6102f6366004614f6a565b610bf6565b6040516001600160a01b03909116815260200161026c565b34801561031f57600080fd5b5061033361032e366004614e9f565b610c7e565b005b610333610343366004614f6a565b610d94565b610333610e8a565b34801561035c57600080fd5b50610295600c5481565b34801561037257600080fd5b50610260610381366004614f6a565b611121565b34801561039257600080fd5b506103a66103a1366004614f6a565b611522565b60405161026c9b9a99989796959493929190615933565b3480156103c957600080fd5b50600854610295565b3480156103de57600080fd5b506103336103ed366004614d87565b6118a9565b3480156103fe57600080fd5b5061029561040d366004614fa3565b6118da565b34801561041e57600080fd5b506102b861042d366004614f6a565b61197c565b34801561043e57600080fd5b5061029561044d366004614e9f565b6122b2565b610333612348565b34801561046657600080fd5b50610333610475366004614d87565b6123e6565b34801561048657600080fd5b50610295610495366004614f6a565b612401565b3480156104a657600080fd5b506102fb6104b5366004614f6a565b6124a2565b6103336104c8366004614f6a565b612519565b3480156104d957600080fd5b506102956104e8366004614d3b565b612617565b3480156104f957600080fd5b5061033361269e565b34801561050e57600080fd5b5061033361051d366004614f6a565b6126d4565b34801561052e57600080fd5b5061033361053d366004614f6a565b612703565b34801561054e57600080fd5b50600a546001600160a01b03166102fb565b34801561056c57600080fd5b506102b8612732565b34801561058157600080fd5b50610333610590366004614e65565b612741565b3480156105a157600080fd5b506103336105b0366004614dc2565b61274c565b3480156105c157600080fd5b506103336105d0366004614f82565b612784565b3480156105e157600080fd5b506105f56105f0366004614f6a565b612a24565b60405161026c9190615b59565b34801561060e57600080fd5b50610295600d5481565b34801561062457600080fd5b506102b8610633366004614f6a565b612e6b565b34801561064457600080fd5b50610295610653366004614f6a565b612ee3565b34801561066457600080fd5b50610260610673366004614f6a565b6132df565b34801561068457600080fd5b50610260610693366004614d55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cd57600080fd5b506102b86106dc366004614f6a565b6136cd565b3480156106ed57600080fd5b506102956106fc366004614f6a565b613ae7565b34801561070d57600080fd5b5061033361071c366004614d3b565b613ef6565b34801561072d57600080fd5b5061033361073c366004614f6a565b613f8e565b60006001600160e01b0319821663780e9d6360e01b1480610766575061076682613fbd565b92915050565b60006107778261400d565b61079c5760405162461bcd60e51b815260040161079390615a36565b60405180910390fd5b6000828152600b6020526040808220815161016081019092528054829082906107c490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090615d82565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050815260200160018201805461085690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461088290615d82565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b505050505081526020016002820180546108e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461091490615d82565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050815260200160038201805461097a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690615d82565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b50505050508152602001600482018054610a0c90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3890615d82565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b50505050508152602001600582018054610a9e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610aca90615d82565b8015610b175780601f10610aec57610100808354040283529160200191610b17565b820191906000526020600020905b815481529060010190602001808311610afa57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261010001519392505050565b606060008054610b7390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f90615d82565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b5050505050905090565b6000610c018261400d565b610c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b506000908152600460205260409020546001600160a01b031690565b6000610c89826124a2565b9050806001600160a01b0316836001600160a01b03161415610cf75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610793565b336001600160a01b0382161480610d135750610d138133610693565b610d855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610793565b610d8f838361402a565b505050565b610d9d8161400d565b610db95760405162461bcd60e51b815260040161079390615a36565b610dc2816132df565b610dde5760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b03163314610e4257600e54341015610e425760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b60205260409020610e5982611121565b15610e79576009810154610e709062015180615cb5565b60098201555050565b610e704262015180615cb5565b5050565b6000610e9560085490565b90506000604051806101600160405280610eba846001610eb59190615cb5565b614098565b604051602001610eca919061558d565b604051602081830303815290604052815260200160405180604001604052806008815260200167082e2eac28cd2e6d60c31b8152508152602001604051806060016040528060318152602001615e85603191398152602001610f3c610eb5610169610f3644600a615cb5565b876118da565b8152602001610f56610eb56101694261040d886014615cb5565b8152602001610f75610eb5610169610f6f44601e615cb5565b426118da565b8152602001600115158152602001428152602001600181526020014262015180610f9f9190615cb5565b815260200160008152509050610fbd600a546001600160a01b031690565b6001600160a01b0316336001600160a01b031614610fe457600c54341015610fe457600080fd5b80600b6000610ff4856001615cb5565b815260208082019290925260400160002082518051919261101a92849290910190614c86565b5060208281015180516110339260018501920190614c86565b506040820151805161104f916002840191602090910190614c86565b506060820151805161106b916003840191602090910190614c86565b5060808201518051611087916004840191602090910190614c86565b5060a082015180516110a3916005840191602090910190614c86565b5060c082015160068201805460ff191691151591909117905560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101556110fd336110f8846001615cb5565b6141ba565b6103e8600c546103e96111109190615ce1565b61111a9190615ccd565b600c555050565b600061112c8261400d565b6111485760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061117090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615d82565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050815260200160018201805461120290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461122e90615d82565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200160028201805461129490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546112c090615d82565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b5050505050815260200160038201805461132690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461135290615d82565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081526020016004820180546113b890615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546113e490615d82565b80156114315780601f1061140657610100808354040283529160200191611431565b820191906000526020600020905b81548152906001019060200180831161141457829003601f168201915b5050505050815260200160058201805461144a90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461147690615d82565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261012081015190915060009061151a9042615d00565b129392505050565b600b6020526000908152604090208054819061153d90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461156990615d82565b80156115b65780601f1061158b576101008083540402835291602001916115b6565b820191906000526020600020905b81548152906001019060200180831161159957829003601f168201915b5050505050908060010180546115cb90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790615d82565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b50505050509080600201805461165990615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461168590615d82565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050908060030180546116e790615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461171390615d82565b80156117605780601f1061173557610100808354040283529160200191611760565b820191906000526020600020905b81548152906001019060200180831161174357829003601f168201915b50505050509080600401805461177590615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546117a190615d82565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509080600501805461180390615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90615d82565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b5050506006840154600785015460088601546009870154600a90970154959660ff9093169591945092508b565b6118b333826141d4565b6118cf5760405162461bcd60e51b815260040161079390615b08565b610d8f8383836142ba565b604080514260208083018290523360601b6bffffffffffffffffffffffff19168385018190526054840187905260748085018790528551808603909101815260948501865280519083012060b485019390935260d484015260e883018690526101088301859052610128808401839052845180850390910181526101489093019093528151919092012060009190611973908690615dd8565b95945050505050565b60606000600b6000848152602001908152602001600020604051806101600160405290816000820180546119af90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546119db90615d82565b8015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b50505050508152602001600182018054611a4190615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d90615d82565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b50505050508152602001600282018054611ad390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611aff90615d82565b8015611b4c5780601f10611b2157610100808354040283529160200191611b4c565b820191906000526020600020905b815481529060010190602001808311611b2f57829003601f168201915b50505050508152602001600382018054611b6590615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9190615d82565b8015611bde5780601f10611bb357610100808354040283529160200191611bde565b820191906000526020600020905b815481529060010190602001808311611bc157829003601f168201915b50505050508152602001600482018054611bf790615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390615d82565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050508152602001600582018054611c8990615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590615d82565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015290506000611d5084613ae7565b90506000611d5d8561076c565b90506000611d6d826112c0615d3f565b90506000611d7c836002615ce1565b611d8890612ae4615d3f565b90506000611d9e6101694461040d8b6064615cb5565b60c0870151909150611e9557600073a1ab1d42fc84af0ed1ce6587e7defbc03febee9863807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b158015611df057600080fd5b505af4158015611e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2c9190810190614f00565b90506000611e398a614098565b604051602001611e499190615455565b60405160208183030381529060405290506000611e868383604051602001611e729291906150cf565b604051602081830303815290604052614465565b9b9a5050505050505050505050565b6000736955b9915db05d6c42ac183c922c2bef7290667363e695d1506040518163ffffffff1660e01b815260040160006040518083038186803b158015611edb57600080fd5b505af4158015611eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f179190810190614f00565b90506000876060015188608001518960a00151604051602001611f3c93929190615608565b60405160208183030381529060405290506000611f5884614098565b611f66610eb5866046615cb5565b611f74610eb58760c8615cb5565b604051602001611f869392919061574f565b6040516020818303038152906040529050611fa08b611121565b15612171576000736955b9915db05d6c42ac183c922c2bef729066736389788cfa6040518163ffffffff1660e01b815260040160006040518083038186803b158015611feb57600080fd5b505af4158015611fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120279190810190614f00565b9050600061203488614098565b61203d89614098565b61204689614098565b61204f8a614098565b6040516020016120629493929190615844565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120f59190810190614f00565b905060006121028f614098565b61210b8d614098565b6121148d614098565b604051602001612126939291906152d6565b6040516020818303038152906040529050600061215988888888888888604051602001611e72979695949392919061517d565b9050809e505050505050505050505050505050919050565b600061217c87614098565b61218588614098565b61218e88614098565b61219789614098565b6040516020016121aa9493929190615499565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b15801561220157600080fd5b505af4158015612215573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223d9190810190614f00565b9050600061224a8e614098565b6122538c614098565b61225c8c614098565b60405160200161226e939291906153d6565b6040516020818303038152906040529050600061229f878787878787604051602001611e72969594939291906150fe565b9f9e505050505050505050505050505050565b60006122bd83612617565b821061231f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610793565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146123725760405162461bcd60e51b815260040161079390615ad3565b6000612386600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b50509050806123e357600080fd5b50565b610d8f8383836040518060200160405280600081525061274c565b600061240c60085490565b821061246f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610793565b6008828154811061249057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610793565b6125228161400d565b61253e5760405162461bcd60e51b815260040161079390615a36565b612547816132df565b6125635760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b031633146125c757600e543410156125c75760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b6020526040902060088101546125e5906001615cb5565b6008820181905560408051808201909152600b81526a030b8bab09739b4bd329d160ad1b6020820152610e86916145db565b60006001600160a01b0382166126825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610793565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146126c85760405162461bcd60e51b815260040161079390615ad3565b6126d26000614620565b565b600a546001600160a01b031633146126fe5760405162461bcd60e51b815260040161079390615ad3565b600e55565b600a546001600160a01b0316331461272d5760405162461bcd60e51b815260040161079390615ad3565b600c55565b606060018054610b7390615d82565b610e86338383614672565b61275633836141d4565b6127725760405162461bcd60e51b815260040161079390615b08565b61277e84848484614741565b50505050565b61278d8261400d565b6127a95760405162461bcd60e51b815260040161079390615a36565b6127b28161400d565b6127ce5760405162461bcd60e51b815260040161079390615a36565b336127d8836124a2565b6001600160a01b0316146128405760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e65722773206f6620746865206560448201526861746572204171756160b81b6064820152608401610793565b612849816132df565b6128655760405162461bcd60e51b8152600401610793906159ff565b61286e826132df565b6128ba5760405162461bcd60e51b815260206004820152601f60248201527f45617465722049642068617320616c7265616479206265656e20656174656e006044820152606401610793565b6000828152600b6020526040808220838352912060088082015490830154116129365760405162461bcd60e51b815260206004820152602860248201527f4561746572206973206e6f742062696720656e6f75676820746f2065617420746044820152670d0d2e640ccd2e6d60c31b6064820152608401610793565b61293f83611121565b156129a05760405162461bcd60e51b815260206004820152602b60248201527f596f752063616e2774206561742066697368207769746820612070726f74656360448201526a7469766520627562626c6560a81b6064820152608401610793565b6129a98361076c565b6129b28561076c565b1180156129c557506129c383611121565b155b1561277e5760068101805460ff1916905560088201546129e6906001615cb5565b600883015542600a820155604051849084907f8d200ab8996878eb7c4e6051f07ecaf41372be7348232c623b3c58e80d2e83e490600090a350505050565b612a83604051806101600160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081525090565b612a8c8261400d565b612aa85760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612ad090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612afc90615d82565b8015612b495780601f10612b1e57610100808354040283529160200191612b49565b820191906000526020600020905b815481529060010190602001808311612b2c57829003601f168201915b50505050508152602001600182018054612b6290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8e90615d82565b8015612bdb5780601f10612bb057610100808354040283529160200191612bdb565b820191906000526020600020905b815481529060010190602001808311612bbe57829003601f168201915b50505050508152602001600282018054612bf490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2090615d82565b8015612c6d5780601f10612c4257610100808354040283529160200191612c6d565b820191906000526020600020905b815481529060010190602001808311612c5057829003601f168201915b50505050508152602001600382018054612c8690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb290615d82565b8015612cff5780601f10612cd457610100808354040283529160200191612cff565b820191906000526020600020905b815481529060010190602001808311612ce257829003601f168201915b50505050508152602001600482018054612d1890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4490615d82565b8015612d915780601f10612d6657610100808354040283529160200191612d91565b820191906000526020600020905b815481529060010190602001808311612d7457829003601f168201915b50505050508152602001600582018054612daa90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd690615d82565b8015612e235780601f10612df857610100808354040283529160200191612e23565b820191906000526020600020905b815481529060010190602001808311612e0657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a0909101529392505050565b6060612e768261400d565b612eda5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610793565b610766826136cd565b6000612eee8261400d565b612f0a5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612f3290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5e90615d82565b8015612fab5780601f10612f8057610100808354040283529160200191612fab565b820191906000526020600020905b815481529060010190602001808311612f8e57829003601f168201915b50505050508152602001600182018054612fc490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615d82565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050815260200160028201805461305690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461308290615d82565b80156130cf5780601f106130a4576101008083540402835291602001916130cf565b820191906000526020600020905b8154815290600101906020018083116130b257829003601f168201915b505050505081526020016003820180546130e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461311490615d82565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050815260200160048201805461317a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546131a690615d82565b80156131f35780601f106131c8576101008083540402835291602001916131f3565b820191906000526020600020905b8154815290600101906020018083116131d657829003601f168201915b5050505050815260200160058201805461320c90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461323890615d82565b80156132855780601f1061325a57610100808354040283529160200191613285565b820191906000526020600020905b81548152906001019060200180831161326857829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506132d89042615d3f565b9392505050565b60006132ea8261400d565b6133065760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061332e90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461335a90615d82565b80156133a75780601f1061337c576101008083540402835291602001916133a7565b820191906000526020600020905b81548152906001019060200180831161338a57829003601f168201915b505050505081526020016001820180546133c090615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546133ec90615d82565b80156134395780601f1061340e57610100808354040283529160200191613439565b820191906000526020600020905b81548152906001019060200180831161341c57829003601f168201915b5050505050815260200160028201805461345290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461347e90615d82565b80156134cb5780601f106134a0576101008083540402835291602001916134cb565b820191906000526020600020905b8154815290600101906020018083116134ae57829003601f168201915b505050505081526020016003820180546134e490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461351090615d82565b801561355d5780601f106135325761010080835404028352916020019161355d565b820191906000526020600020905b81548152906001019060200180831161354057829003601f168201915b5050505050815260200160048201805461357690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546135a290615d82565b80156135ef5780601f106135c4576101008083540402835291602001916135ef565b820191906000526020600020905b8154815290600101906020018083116135d257829003601f168201915b5050505050815260200160058201805461360890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461363490615d82565b80156136815780601f1061365657610100808354040283529160200191613681565b820191906000526020600020905b81548152906001019060200180831161366457829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260c001519392505050565b60606000600b60008481526020019081526020016000206040518061016001604052908160008201805461370090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461372c90615d82565b80156137795780601f1061374e57610100808354040283529160200191613779565b820191906000526020600020905b81548152906001019060200180831161375c57829003601f168201915b5050505050815260200160018201805461379290615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546137be90615d82565b801561380b5780601f106137e05761010080835404028352916020019161380b565b820191906000526020600020905b8154815290600101906020018083116137ee57829003601f168201915b5050505050815260200160028201805461382490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461385090615d82565b801561389d5780601f106138725761010080835404028352916020019161389d565b820191906000526020600020905b81548152906001019060200180831161388057829003601f168201915b505050505081526020016003820180546138b690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546138e290615d82565b801561392f5780601f106139045761010080835404028352916020019161392f565b820191906000526020600020905b81548152906001019060200180831161391257829003601f168201915b5050505050815260200160048201805461394890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461397490615d82565b80156139c15780601f10613996576101008083540402835291602001916139c1565b820191906000526020600020905b8154815290600101906020018083116139a457829003601f168201915b505050505081526020016005820180546139da90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0690615d82565b8015613a535780601f10613a2857610100808354040283529160200191613a53565b820191906000526020600020905b815481529060010190602001808311613a3657829003601f168201915b5050509183525050600682015460ff161515602082015260078201546040808301919091526008830154606083015260098301546080830152600a9092015460a090910152815190820151919250613ac091613aae8661197c565b604051602001611e729392919061520f565b604051602001613ad091906155c3565b604051602081830303815290604052915050919050565b6000613af28261400d565b613b0e5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290613b3690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613b6290615d82565b8015613baf5780601f10613b8457610100808354040283529160200191613baf565b820191906000526020600020905b815481529060010190602001808311613b9257829003601f168201915b50505050508152602001600182018054613bc890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613bf490615d82565b8015613c415780601f10613c1657610100808354040283529160200191613c41565b820191906000526020600020905b815481529060010190602001808311613c2457829003601f168201915b50505050508152602001600282018054613c5a90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8690615d82565b8015613cd35780601f10613ca857610100808354040283529160200191613cd3565b820191906000526020600020905b815481529060010190602001808311613cb657829003601f168201915b50505050508152602001600382018054613cec90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613d1890615d82565b8015613d655780601f10613d3a57610100808354040283529160200191613d65565b820191906000526020600020905b815481529060010190602001808311613d4857829003601f168201915b50505050508152602001600482018054613d7e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613daa90615d82565b8015613df75780601f10613dcc57610100808354040283529160200191613df7565b820191906000526020600020905b815481529060010190602001808311613dda57829003601f168201915b50505050508152602001600582018054613e1090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613e3c90615d82565b8015613e895780601f10613e5e57610100808354040283529160200191613e89565b820191906000526020600020905b815481529060010190602001808311613e6c57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506201518090613ee19042615d3f565b613eeb9190615ccd565b6132d8906001615cb5565b600a546001600160a01b03163314613f205760405162461bcd60e51b815260040161079390615ad3565b6001600160a01b038116613f855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b6123e381614620565b600a546001600160a01b03163314613fb85760405162461bcd60e51b815260040161079390615ad3565b600d55565b60006001600160e01b031982166380ac58cd60e01b1480613fee57506001600160e01b03198216635b5e139f60e01b145b8061076657506301ffc9a760e01b6001600160e01b0319831614610766565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061405f826124a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816140bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e657806140d081615dbd565b91506140df9050600a83615ccd565b91506140c0565b60008167ffffffffffffffff81111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156141b25761414e600183615d3f565b915061415b600a86615dd8565b614166906030615cb5565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615ccd565b945061413d565b949350505050565b610e86828260405180602001604052806000815250614774565b60006141df8261400d565b6142405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b600061424b836124a2565b9050806001600160a01b0316846001600160a01b031614806142865750836001600160a01b031661427b84610bf6565b6001600160a01b0316145b806141b257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166141b2565b826001600160a01b03166142cd826124a2565b6001600160a01b0316146143355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610793565b6001600160a01b0382166143975760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6143a28383836147a7565b6143ad60008261402a565b6001600160a01b03831660009081526003602052604081208054600192906143d6908490615d3f565b90915550506001600160a01b0382166000908152600360205260408120805460019290614404908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081516000141561448557505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e4560409139905060006003845160026144b49190615cb5565b6144be9190615ccd565b6144c9906004615ce1565b905060006144d8826020615cb5565b67ffffffffffffffff8111156144fe57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614528576020820181803683370190505b509050818152600183018586518101602084015b818310156145965760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161453c565b6003895106600181146145b057600281146145c1576145cd565b613d3d60f01b6001198301526145cd565b603d60f81b6000198301525b509398975050505050505050565b610e8682826040516024016145f19291906159dd565b60408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905261485f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156146d45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610793565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61474c8484846142ba565b61475884848484614880565b61277e5760405162461bcd60e51b815260040161079390615a81565b61477e838361498d565b61478b6000848484614880565b610d8f5760405162461bcd60e51b815260040161079390615a81565b6001600160a01b038316614802576147fd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614825565b816001600160a01b0316836001600160a01b031614614825576148258382614acc565b6001600160a01b03821661483c57610d8f81614b69565b826001600160a01b0316826001600160a01b031614610d8f57610d8f8282614c42565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60006001600160a01b0384163b1561498257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906148c49033908990889088906004016158ed565b602060405180830381600087803b1580156148de57600080fd5b505af192505050801561490e575060408051601f3d908101601f1916820190925261490b91810190614ee4565b60015b614968573d80801561493c576040519150601f19603f3d011682016040523d82523d6000602084013e614941565b606091505b5080516149605760405162461bcd60e51b815260040161079390615a81565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506141b2565b506001949350505050565b6001600160a01b0382166149e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610793565b6149ec8161400d565b15614a395760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610793565b614a45600083836147a7565b6001600160a01b0382166000908152600360205260408120805460019290614a6e908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614ad984612617565b614ae39190615d3f565b600083815260076020526040902054909150808214614b36576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b7b90600190615d3f565b60008381526009602052604081205460088054939450909284908110614bb157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110614be057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614c2657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614c4d83612617565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054614c9290615d82565b90600052602060002090601f016020900481019282614cb45760008555614cfa565b82601f10614ccd57805160ff1916838001178555614cfa565b82800160010185558215614cfa579182015b82811115614cfa578251825591602001919060010190614cdf565b50614d06929150614d0a565b5090565b5b80821115614d065760008155600101614d0b565b80356001600160a01b0381168114614d3657600080fd5b919050565b600060208284031215614d4c578081fd5b6132d882614d1f565b60008060408385031215614d67578081fd5b614d7083614d1f565b9150614d7e60208401614d1f565b90509250929050565b600080600060608486031215614d9b578081fd5b614da484614d1f565b9250614db260208501614d1f565b9150604084013590509250925092565b60008060008060808587031215614dd7578081fd5b614de085614d1f565b9350614dee60208601614d1f565b925060408501359150606085013567ffffffffffffffff811115614e10578182fd5b8501601f81018713614e20578182fd5b8035614e33614e2e82615c8d565b615c5c565b818152886020838501011115614e47578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614e77578182fd5b614e8083614d1f565b915060208301358015158114614e94578182fd5b809150509250929050565b60008060408385031215614eb1578182fd5b614eba83614d1f565b946020939093013593505050565b600060208284031215614ed9578081fd5b81356132d881615e2e565b600060208284031215614ef5578081fd5b81516132d881615e2e565b600060208284031215614f11578081fd5b815167ffffffffffffffff811115614f27578182fd5b8201601f81018413614f37578182fd5b8051614f45614e2e82615c8d565b818152856020838501011115614f59578384fd5b611973826020830160208601615d56565b600060208284031215614f7b578081fd5b5035919050565b60008060408385031215614f94578182fd5b50508035926020909101359150565b600080600060608486031215614fb7578283fd5b505081359360208301359350604090920135919050565b60008151808452614fe6816020860160208601615d56565b601f01601f19169290920160200192915050565b7f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22688152620e6d8560eb1b602082015260230190565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152630d0e6d8560e31b602082015260240190565b7f3c7465787420783d2233352220793d2238302220636c6173733d22736d616c6c8152630111f11960e51b602082015260240190565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2268738152610d8560f31b602082015260220190565b600083516150e1818460208801615d56565b8351908301906150f5818360208801615d56565b01949350505050565b6000875160206151118285838d01615d56565b8851918401916151248184848d01615d56565b88519201916151368184848c01615d56565b87519201916151488184848b01615d56565b865192019161515a8184848a01615d56565b855192019161516c8184848901615d56565b919091019998505050505050505050565b6000885160206151908285838e01615d56565b8951918401916151a38184848e01615d56565b89519201916151b58184848d01615d56565b88519201916151c78184848c01615d56565b87519201916151d98184848b01615d56565b86519201916151eb8184848a01615d56565b85519201916151fd8184848901615d56565b919091019a9950505050505050505050565b683d913730b6b2911d1160b91b81528351600090615234816009850160208901615d56565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161526681601b840160208901615d56565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516152ba816042840160208801615d56565b61227d60f01b6042929091019182015260440195945050505050565b60006152e182615065565b85516152f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223533302220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b603692019182018190526153a2603d83017f3c7465787420783d2233352220793d22313333302220636c6173733d22736d6181526903636111f29b4bd329d160b51b6020820152602a0190565b915084516153b4818460208901615d56565b91909101908152651e17b9bb339f60d11b6007820152600d0195945050505050565b60006153e182615065565b85516153f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223436352220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b600061546082615065565b8351615470818360208801615d56565b661e17ba32bc3a1f60c91b9101908152651e17b9bb339f60d11b6007820152600d019392505050565b7f3c726563742077696474683d223133383022206865696768743d22313338302281527f2066696c6c3d2275726c2823677261644261636b67726f756e6429222f3e000060208201526e3c7376672076696577426f783d222d60881b603e8201526000855161550f81604d850160208a01615d56565b61202d60f01b604d91840191820152855161553181604f840160208a01615d56565b808201915050600160fd1b80604f8301528551615555816050850160208a01615d56565b60509201918201528351615570816051840160208801615d56565b61111f60f11b605192909101918201526053019695505050505050565b6d417175617469632057617273202360901b8152600082516155b681600e850160208701615d56565b91909101600e0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516155fb81601d850160208701615d56565b91909101601d0192915050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d2267726164466973682220677261646960268201527f656e745472616e73666f726d3d22726f7461746528393029223e000000000000604682015260006156946060830161509b565b85516156a4818360208a01615d56565b6d16101c981296101a18129491179f60911b91019081526156c7600e8201614ffa565b905084516156d9818360208901615d56565b6d16101c98129610199b929491179f60911b9101818152906156fd600e830161502f565b9150845161570f818460208901615d56565b91909101908152701e17b634b732b0b923b930b234b2b73a1f60791b600e820152661e17b232b3399f60c91b601f820152602681015b9695505050505050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d22677261644669736846696e2220677260268201527f616469656e745472616e73666f726d3d22726f7461746528393029223e000000604682015260006157db6063830161509b565b85516157eb818360208a01615d56565b6d16101c181296101a18129491179f60911b910190815261580e600e8201614ffa565b90508451615820818360208901615d56565b6d16101c18129610199b929491179f60911b9101818152906156fd600e830161502f565b6e3c7376672076696577426f783d222d60881b8152845160009061586f81600f850160208a01615d56565b61202d60f01b600f918401918201528551615891816011840160208a01615d56565b808201915050600160fd1b80601183015285516158b5816012850160208a01615d56565b601292019182015283516158d0816013840160208801615d56565b61111f60f11b601392909101918201526015019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061574590830184614fce565b6020815260006132d86020830184614fce565b60006101608083526159478184018f614fce565b9050828103602084015261595b818e614fce565b9050828103604084015261596f818d614fce565b90508281036060840152615983818c614fce565b90508281036080840152615997818b614fce565b905082810360a08401526159ab818a614fce565b97151560c0840152505060e0810194909452610100840192909252610120830152610140909101529695505050505050565b6040815260006159f06040830185614fce565b90508260208301529392505050565b6020808252601f908201527f456174656e2049642068617320616c7265616479206265656e20656174656e00604082015260600190565b6020808252602b908201527f4552433732314d657461646174613a20517565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251610160806020850152615b78610180850183614fce565b91506020850151601f1980868503016040870152615b968483614fce565b93506040870151915080868503016060870152615bb38483614fce565b93506060870151915080868503016080870152615bd08483614fce565b935060808701519150808685030160a0870152615bed8483614fce565b935060a08701519150808685030160c087015250615c0b8382614fce565b92505060c0850151615c2160e086018215159052565b5060e0850151610100858101919091528501516101208086019190915285015161014080860191909152909401519390920192909252919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615c8557615c85615e18565b604052919050565b600067ffffffffffffffff821115615ca757615ca7615e18565b50601f01601f191660200190565b60008219821115615cc857615cc8615dec565b500190565b600082615cdc57615cdc615e02565b500490565b6000816000190483118215151615615cfb57615cfb615dec565b500290565b60008083128015600160ff1b850184121615615d1e57615d1e615dec565b6001600160ff1b0384018313811615615d3957615d39615dec565b50500390565b600082821015615d5157615d51615dec565b500390565b60005b83811015615d71578181015183820152602001615d59565b8381111561277e5750506000910152565b600181811c90821680615d9657607f821691505b60208210811415615db757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615dd157615dd1615dec565b5060010190565b600082615de757615de7615e02565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146123e357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4171756174696320576172732069732031303025206f6e2d636861696e2c2064796e616d69632c204e46542067616d652ea264697066735822122096d3491e38ada46f7241314df1a374e18f87786388209de074fd0c30d85ca35364736f6c63430008040033
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.