ETH Price: $3,393.73 (+1.37%)

Chickens (Chickens)
 

Overview

TokenID

601

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Chickens

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-08
*/

// File: contracts/ITraits.sol


pragma solidity ^0.8.0;

interface ITraits {
  function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/ERC721.sol

pragma solidity ^0.8.7;


/// @notice Modern and gas efficient ERC-721 + ERC-20/EIP-2612-like implementation,
/// including the MetaData, and partially, Enumerable extensions.
contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
    event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
    
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
    
    address        implementation_;
    address public admin; //Lame requirement from opensea
    
    /*///////////////////////////////////////////////////////////////
                             ERC-721 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;
    uint256 public oldSupply;
    uint256 public minted;
    
    mapping(address => uint256) public balanceOf;
    
    mapping(uint256 => address) public ownerOf;
        
    mapping(uint256 => address) public getApproved;
 
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             VIEW FUNCTION
    //////////////////////////////////////////////////////////////*/

    function owner() external view returns (address) {
        return admin;
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-20-LIKE LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function transfer(address to, uint256 tokenId) external {
        require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
        
        _transfer(msg.sender, to, tokenId);
        
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-721 LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function supportsInterface(bytes4 interfaceId) external pure returns (bool supported) {
        supported = interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;
    }
    
    function approve(address spender, uint256 tokenId) external {
        address owner_ = ownerOf[tokenId];
        
        require(msg.sender == owner_ || isApprovedForAll[owner_][msg.sender], "NOT_APPROVED");
        
        getApproved[tokenId] = spender;
        
        emit Approval(owner_, spender, tokenId); 
    }
    
    function setApprovalForAll(address operator, bool approved) external {
        isApprovedForAll[msg.sender][operator] = approved;
        
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(address from, address to, uint256 tokenId) public {
        require(
            msg.sender == from 
            || msg.sender == getApproved[tokenId]
            || isApprovedForAll[from][msg.sender], 
            "NOT_APPROVED"
        );
        
        _transfer(from, to, tokenId);
        
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId) external {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {
        transferFrom(from, to, tokenId); 
        
        if (to.code.length != 0) {
            // selector = `onERC721Received(address,address,uint,bytes)`
            (, bytes memory returned) = to.staticcall(abi.encodeWithSelector(0x150b7a02,
                msg.sender, from, tokenId, data));
                
            bytes4 selector = abi.decode(returned, (bytes4));
            
            require(selector == 0x150b7a02, "NOT_ERC721_RECEIVER");
        }
    }
    
    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf[tokenId] == from, "not owner");

        balanceOf[from]--; 
        balanceOf[to]++;
        
        delete getApproved[tokenId];
        
        ownerOf[tokenId] = to;
        emit Transfer(from, to, tokenId); 

    }

    function _mint(address to, uint256 tokenId) internal { 
        require(ownerOf[tokenId] == address(0), "ALREADY_MINTED");

        uint supply = oldSupply + minted++;
        uint maxSupply = 5000;
        require(supply <= maxSupply, "MAX SUPPLY REACHED");
        totalSupply++;
                
        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to]++;
        }
        
        ownerOf[tokenId] = to;
                
        emit Transfer(address(0), to, tokenId); 
    }
    
    function _burn(uint256 tokenId) internal { 
        address owner_ = ownerOf[tokenId];
        
        require(ownerOf[tokenId] != address(0), "NOT_MINTED");
        
        totalSupply--;
        balanceOf[owner_]--;
        
        delete ownerOf[tokenId];
                
        emit Transfer(owner_, address(0), tokenId); 
    }
}


// File: contracts/ERC20.sol

pragma solidity ^0.8.7;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)

contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;
    string public symbol;
    uint8  public decimals;

    /*///////////////////////////////////////////////////////////////
                             ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    mapping(address => bool) public isMinter;

    address public ruler;

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol, uint8 _decimals) { 
        ruler = msg.sender;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);

        return true;
    }

    function transfer(address to, uint256 value) external returns (bool) {
        balanceOf[msg.sender] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(msg.sender, to, value);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= value;
        }

        balanceOf[from] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(from, to, value);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                             ORC PRIVILEGE
    //////////////////////////////////////////////////////////////*/

    function mint(address to, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO MINT");
        _mint(to, value);
    }

    function burn(address from, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO BURN");
        _burn(from, value);
    }

    /*///////////////////////////////////////////////////////////////
                         Ruler Function
    //////////////////////////////////////////////////////////////*/

    function setMinter(address minter, bool status) external {
        require(msg.sender == ruler, "NOT ALLOWED TO RULE");

        isMinter[minter] = status;
    }

    function setRuler(address ruler_) external {
        require(msg.sender == ruler ||ruler == address(0), "NOT ALLOWED TO RULE");

        ruler = ruler_;
    }


    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 value) internal {
        totalSupply += value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] -= value;

        // This is safe because a user won't ever
        // have a balance larger than totalSupply!
        unchecked {
            totalSupply -= value;
        }

        emit Transfer(from, address(0), value);
    }
}
// File: hardhat/console.sol


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));
	}

}

// File: contracts/Chicken.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;





contract Chickens is ERC721 {
    uint256 public constant MAX_SUPPLY = 5000;
    bool public mintActive;

    uint8[] public raritiesFatness;
    uint8[] public aliasesFatness;
    // used to ensure there are no duplicates
    mapping(uint256 => uint256) public existingCombinations;
    // fatness level: 1-5
    uint256[] public feedingPrice;

    mapping(address => bool) public auth;
    mapping(uint256 => Chicken) internal chickens;
    mapping(uint256 => Action) public activities;
    // god chickens : Chicken, Cow, Omnipollo, FatHen
    mapping(uint256 => uint8) public godChicken; // tokenId => godId
    uint8 public godMinted;

    // reference to Traits
    ITraits public traits;
    ERC20 public egg;
    uint256 public eggClaimedTotal;

    bytes32 internal entropySauce;
    mapping(uint256 => uint256) public mintBlocks;

    function setAddresses(
        address _traits,
        address _egg
    ) external onlyOwner {
        traits = ITraits(_traits);
        egg = ERC20(_egg);
    }

    function setAuth(address add, bool isAuth) external onlyOwner {
        auth[add] = isAuth;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        admin = newOwner;
    }

    function setMintStatus(bool _status) external onlyOwner {
        mintActive = _status;
    }

    // Render

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        // chickens[tokenId] empty check
        require(mintBlocks[tokenId] != block.number, "ERC721Metadata: URI query for nonexistent token");
        return traits.tokenURI(tokenId);
    }

    event ActionMade(
        address owner,
        uint256 id,
        uint256 timestamp,
        uint8 activity
    );
    event ActionFeedChickens(
        address owner,
        uint256 id,
        uint256 newLevel
    );
    event GodChickenMinted(
        address owner,
        uint256 tokenId,
        uint8 godId
    );

    struct Chicken {
        uint8 comb;
        uint8 face;
        uint8 body;
        // Colors - Primary, Secondary, Tertiary
        uint8 color1;
        uint8 color2;
        uint8 color3;
        uint8 fatness;
        uint8 lvlFatness;
        uint16 level;
    }
    enum Actions {
        UNSTAKED,
        FARMING,
        LEVELUP
    }
    struct Action {
        address owner;
        uint88 timestamp;
        Actions action;
    }

    // Constructor
    constructor() {
        admin = msg.sender;
    }

    function initialize() public onlyOwner {
        admin = msg.sender;
        auth[msg.sender] = true;

        mintActive = false;
        // A.J. Walker's Alias Algorithm
        raritiesFatness = [189, 253, 127, 94, 31];
        aliasesFatness = [1, 4, 0, 0, 0];
        feedingPrice = [
            3 ether,
            5 ether,
            10 ether,
            20 ether
        ];
    }

    // Modifiers

    modifier noCheaters() {
        uint256 size = 0;
        address acc = msg.sender;
        assembly {
            size := extcodesize(acc)
        }

        require(
            auth[msg.sender] || (msg.sender == tx.origin && size == 0),
            "you're trying to cheat!"
        );
        _;

        // We'll use the last caller hash to add entropy to next caller
        entropySauce = keccak256(abi.encodePacked(acc, block.coinbase, entropySauce));
    }

    modifier ownerOfChicken(uint256 id) {
        require(
            ownerOf[id] == msg.sender || activities[id].owner == msg.sender,
            "not your chicken"
        );
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == admin);
        _;
    }

    // Public Functions

    function mintChickens() public noCheaters {
        require(mintActive, "Must be active to mint");
        require(totalSupply <= MAX_SUPPLY, "All supply minted");
        uint256 cost = mintPriceEgg();
        if (cost > 0) egg.burn(msg.sender, cost);
        _mintChicken(msg.sender);
    }

    function feedChickens(uint256 id) public noCheaters {
        _claim(id);

        uint8 lvlFatness = chickens[id].lvlFatness;
        require(lvlFatness < 5, "Already max level");
        egg.burn(msg.sender, feedingPrice[lvlFatness-1]);
        chickens[id].lvlFatness = lvlFatness + 1;

        emit ActionFeedChickens(msg.sender, id, lvlFatness + 1);
    }

    function mintGodChickens(uint256 id) public noCheaters {
        require(godMinted < 4, "Minted all");
        require(chickens[id].level >= 24, "Low level");
        _claim(id);
        egg.burn(msg.sender, 300 ether);

        godMinted++;
        godChicken[id] = godMinted;

        emit GodChickenMinted(msg.sender, id, godMinted);
    }

    function doAction(uint256 id, Actions action_)
        public
        ownerOfChicken(id)
        noCheaters
    {
        _doAction(id, msg.sender, action_);
    }

    function _doAction(
        uint256 id,
        address chickenOwner,
        Actions action_
    ) internal {
        Action memory action = activities[id];
        require(action.action != action_, "already doing that");
        // if ((action.action == Actions.FARMING) && (action_ == Actions.LEVELUP) || (action.action == Actions.LEVELUP) && (action_ == Actions.FARMING)) // not allowed?

        // Picking the largest value between block.timestamp, action.timestamp and startingTime
        uint88 timestamp = uint88(
            block.timestamp > action.timestamp
                ? block.timestamp
                : action.timestamp
        );

        if (action.action == Actions.UNSTAKED) _transfer(chickenOwner, address(this), id);
        else {
            if (block.timestamp > action.timestamp) _claim(id);
            timestamp = timestamp > action.timestamp ? timestamp : action.timestamp;
        }

        address owner_ = action_ == Actions.UNSTAKED ? address(0) : chickenOwner;
        if (action_ == Actions.UNSTAKED) _transfer(address(this), chickenOwner, id);

        activities[id] = Action({
            owner: owner_,
            timestamp: timestamp,
            action: action_
        });
        emit ActionMade(chickenOwner, id, block.timestamp, uint8(action_));
    }

    function doActionWithManyChickens(uint256[] calldata ids, Actions action_)
        external
    {
        for (uint256 index = 0; index < ids.length; index++) {
            require(
                ownerOf[ids[index]] == msg.sender || activities[ids[index]].owner == msg.sender,
                "Not your chicken"
            );
            _doAction(ids[index], msg.sender, action_);
        }
    }

    function claim(uint256[] calldata ids) external {
        for (uint256 index = 0; index < ids.length; index++) {
            _claim(ids[index]);
        }
    }

    function _claim(uint256 id) internal noCheaters {
        Action memory action = activities[id];

        if (block.timestamp <= action.timestamp) return;

        uint256 timeDiff = uint256(block.timestamp - action.timestamp);

        if (action.action == Actions.FARMING) {
            uint256 eggAmount = claimableEgg(timeDiff, id, action.owner);
            egg.mint(action.owner, eggAmount);
            eggClaimedTotal += eggAmount;
        } else if (action.action == Actions.LEVELUP) {
            chickens[id].level += uint16(timeDiff / 1 days);
        }

        activities[id].timestamp = uint88(block.timestamp);
    }

    // Viewers

    function getTokenTraits(uint256 tokenId) external view virtual returns (Chicken memory) {
        if (mintBlocks[tokenId] == block.number) return chickens[0];
        return chickens[tokenId];
    }

    function mintPriceEgg() public view returns (uint256) {
        uint256 supply = minted;
        if (supply < 2500) return 0;
        if (supply < 3000) return 10 ether;
        if (supply < 3500) return 20 ether;
        if (supply < 4000) return 25 ether;
        if (supply < 4500) return 30 ether;
        if (supply < 5000) return 50 ether;
        return 50 ether;
    }

    function claimable(uint256 id) external view returns (uint256) {
        if (activities[id].action == Actions.FARMING) {
            uint256 timeDiff = block.timestamp > activities[id].timestamp
                ? uint256(block.timestamp - activities[id].timestamp)
                : 0;
            return claimableEgg(timeDiff, id, activities[id].owner);
        }
        if (activities[id].action == Actions.LEVELUP) {
            uint256 timeDiff = block.timestamp > activities[id].timestamp
                ? uint256(block.timestamp - activities[id].timestamp)
                : 0;
            return timeDiff / 1 days;
        }
        return 0;
    }

    function name() external pure returns (string memory) {
        return "Chickens";
    }

    function symbol() external pure returns (string memory) {
        return "Chickens";
    }

    // Internal Functions

    function _mintChicken(address to) internal {
        uint16 id = uint16(totalSupply + 1);
        mintBlocks[id] = block.number;
        uint256 seed = random(id);
        generate(id, seed);
        _mint(to, id);
    }

    function claimableEgg(uint256 timeDiff, uint256 id, address owner_) internal view returns (uint256)
    {
        if(eggClaimedTotal >= 250_000 ether) return 0;
        Chicken memory chicken = chickens[id];
        uint256 eggAmount = (timeDiff * 1 ether * chicken.lvlFatness) / 1 days;
        return eggAmount;
    }

    function generate(uint256 tokenId, uint256 seed) internal returns (Chicken memory t) {
        t = selectTraits(seed);
        chickens[tokenId] = t;
        return t;

        // keep the following code for future use, current version using different seed, so no need for now
        // if (existingCombinations[structToHash(t)] == 0) {
        //     chickens[tokenId] = t;
        //     existingCombinations[structToHash(t)] = tokenId;
        //     return t;
        // }
        // return generate(tokenId, random(seed));
    }

    function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) {
        if (traitType == 0) return uint8(seed) % 12;
        if (traitType == 1) return uint8(seed) % 12;
        if (traitType == 2) return uint8(seed) % 12;
        if (traitType == 3) return uint8(seed) % 20;
        if (traitType == 4) return uint8(seed) % 20;
        if (traitType == 5) return uint8(seed) % 20;
        if (traitType == 6) return uint8(seed) % 5;

        // fatness rarity
        uint8 trait = uint8(seed) % uint8(raritiesFatness.length);
        if (seed >> 8 < raritiesFatness[trait]) return trait;
        return aliasesFatness[trait];
    }

    function selectTraits(uint256 seed) internal view returns (Chicken memory t) {    
        t.comb = selectTrait(uint16(seed & 0xFFFF), 0);
        seed >>= 16;
        t.face = selectTrait(uint16(seed & 0xFFFF), 1);
        seed >>= 16;
        t.body = selectTrait(uint16(seed & 0xFFFF), 2);
        seed >>= 16;
        t.color1 = selectTrait(uint16(seed & 0xFFFF), 3);
        seed >>= 16;
        t.color2 = selectTrait(uint16(seed & 0xFFFF), 4);
        seed >>= 16;
        t.color3 = selectTrait(uint16(seed & 0xFFFF), 5);
        seed >>= 16;
        t.fatness = selectTrait(uint16(seed & 0xFFFF), 6);
        seed >>= 16;
        t.lvlFatness = selectTrait(uint16(seed & 0xFFFF), 7) + 1;
        t.level = 1;
    }

    function structToHash(Chicken memory s) internal pure returns (uint256) {
        return uint256(bytes32(
        abi.encodePacked(
            s.comb,
            s.face,
            s.body,
            s.color1,
            s.color2,
            s.color3,
            s.fatness,
            s.lvlFatness
        )
        ));
    }

    function random(uint256 seed) internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(
            tx.origin,
            blockhash(block.number - 1),
            block.timestamp,
            seed
        )));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"ActionFeedChickens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"activity","type":"uint8"}],"name":"ActionMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","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":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"godId","type":"uint8"}],"name":"GodChickenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activities","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint88","name":"timestamp","type":"uint88"},{"internalType":"enum Chickens.Actions","name":"action","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliasesFatness","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"auth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Chickens.Actions","name":"action_","type":"uint8"}],"name":"doAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum Chickens.Actions","name":"action_","type":"uint8"}],"name":"doActionWithManyChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"egg","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eggClaimedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"feedChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraits","outputs":[{"components":[{"internalType":"uint8","name":"comb","type":"uint8"},{"internalType":"uint8","name":"face","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"color1","type":"uint8"},{"internalType":"uint8","name":"color2","type":"uint8"},{"internalType":"uint8","name":"color3","type":"uint8"},{"internalType":"uint8","name":"fatness","type":"uint8"},{"internalType":"uint8","name":"lvlFatness","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"}],"internalType":"struct Chickens.Chicken","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"godChicken","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"godMinted","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintGodChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPriceEgg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"oldSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"raritiesFatness","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_egg","type":"address"}],"name":"setAddresses","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":"address","name":"add","type":"address"},{"internalType":"bool","name":"isAuth","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":[],"name":"traits","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600180546001600160a01b03191633179055612f70806100326000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80638de7ddd311610167578063cc1ed202116100ce578063e1fc334f11610087578063e1fc334f14610667578063e3abc3741461067f578063e985e9c514610692578063f2fde38b146106c0578063f363c7b5146106d3578063f851a440146106db57600080fd5b8063cc1ed202146105de578063cd5d2118146105f1578063d0fb0f8c14610614578063d1d58b2514610634578063d8d8422914610647578063dc2f500c1461065457600080fd5b8063a9059cbb11610120578063a9059cbb14610577578063b88d4fde1461058a578063bc39eb5f1461059d578063bfc56b4a146105b0578063c06abfc7146105b8578063c87b56dd146105cb57600080fd5b80638de7ddd31461050857806390107afe1461051157806394e568471461052457806395d89b41146102d9578063a1b8f37414610544578063a22cb4651461056457600080fd5b806332cb6b0c1161020b5780636352211e116101c45780636352211e146104805780636ba4c138146104a957806370a08231146104bc57806376f0d51a146104dc5780638129fc1c146104ef5780638da5cb5b146104f757600080fd5b806332cb6b0c14610400578063338eebf4146104095780633cb16c671461043e57806342842e0e146104515780634f02c420146104645780635f69c1ac1461046d57600080fd5b80630b44a2181161025d5780630b44a2181461035c5780630d1657e81461036f57806318160ddd146103c45780631f85e3ca146103cd57806323b872dd146103e057806325fd90f3146103f357600080fd5b806301ffc9a71461029a57806305850844146102c257806306fdde03146102d9578063081812fc14610306578063095ea7b314610347575b600080fd5b6102ad6102a836600461279f565b6106ee565b60405190151581526020015b60405180910390f35b6102cb60035481565b6040519081526020016102b9565b604080518082019091526008815267436869636b656e7360c01b60208201525b6040516102b9919061280c565b61032f61031436600461281f565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b61035a610355366004612854565b610725565b005b61035a61036a36600461288e565b61080a565b6103b561037d36600461281f565b6010602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b6040516102b9939291906128d7565b6102cb60025481565b61035a6103db366004612922565b61084c565b61035a6103ee36600461293d565b610876565b6009546102ad9060ff1681565b6102cb61138881565b61042c61041736600461281f565b60116020526000908152604090205460ff1681565b60405160ff90911681526020016102b9565b6102cb61044c36600461281f565b61091c565b61035a61045f36600461293d565b61093d565b6102cb60045481565b61042c61047b36600461281f565b610958565b61032f61048e36600461281f565b6006602052600090815260409020546001600160a01b031681565b61035a6104b73660046129c5565b61098c565b6102cb6104ca366004612a07565b60056020526000908152604090205481565b61035a6104ea366004612a31565b6109ca565b61035a610ad0565b6001546001600160a01b031661032f565b6102cb60145481565b61035a61051f366004612a54565b610bea565b61053761053236600461281f565b610c39565b6040516102b99190612a7e565b6102cb61055236600461281f565b600c6020526000908152604090205481565b61035a61057236600461288e565b610db2565b61035a610585366004612854565b610e1e565b61035a610598366004612b9b565b610e7f565b61042c6105ab36600461281f565b610fb6565b6102cb610fc6565b60135461032f906001600160a01b031681565b6102f96105d936600461281f565b61106f565b61035a6105ec366004612c46565b61115d565b6102ad6105ff366004612a07565b600e6020526000908152604090205460ff1681565b6102cb61062236600461281f565b60166020526000908152604090205481565b6102cb61064236600461281f565b611259565b60125461042c9060ff1681565b61035a61066236600461281f565b6113ad565b60125461032f9061010090046001600160a01b031681565b61035a61068d36600461281f565b6115d2565b6102ad6106a0366004612a54565b600860209081526000928352604080842090915290825290205460ff1681565b61035a6106ce366004612a07565b6117c3565b61035a6117fc565b60015461032f906001600160a01b031681565b60006380ac58cd60e01b6001600160e01b03198316148061071f5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600660205260409020546001600160a01b03163381148061076e57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b6107ae5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b0316331461082157600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331461086357600080fd5b6009805460ff1916911515919091179055565b336001600160a01b03841614806108a357506000818152600760205260409020546001600160a01b031633145b806108d157506001600160a01b038316600090815260086020908152604080832033845290915290205460ff165b61090c5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016107a5565b61091783838361198c565b505050565b600d818154811061092c57600080fd5b600091825260209091200154905081565b61091783838360405180602001604052806000815250610e7f565b600b818154811061096857600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60005b81811015610917576109b88383838181106109ac576109ac612c9a565b90506020020135611aa4565b806109c281612cc6565b91505061098f565b60008281526006602052604090205482906001600160a01b0316331480610a0757506000818152601060205260409020546001600160a01b031633145b610a465760405162461bcd60e51b815260206004820152601060248201526f3737ba103cb7bab91031b434b1b5b2b760811b60448201526064016107a5565b336000818152600e6020526040902054813b919060ff1680610a7057503332148015610a70575081155b610a8c5760405162461bcd60e51b81526004016107a590612cdf565b610a97853386611d08565b8041601554604051602001610aae93929190612d16565b60408051601f1981840301815291905280516020909101206015555050505050565b6001546001600160a01b03163314610ae757600080fd5b600180546001600160a01b0319163390811782556000908152600e6020908152604091829020805460ff19908116909417905560098054909316909255805160a08101825260bd815260fd92810192909252607f90820152605e6060820152601f6080820152610b5b90600a90600561263a565b506040805160a08101825260018152600460208201526000918101829052606081018290526080810191909152610b9690600b90600561263a565b50604080516080810182526729a2241af62c00008152674563918244f400006020820152678ac7230489e80000918101919091526801158e460913d000006060820152610be790600d9060046126e0565b50565b6001546001600160a01b03163314610c0157600080fd5b60128054610100600160a81b0319166101006001600160a01b0394851602179055601380546001600160a01b03191691909216179055565b610c41612728565b600082815260166020526040902054439003610d1457505060008052600f602090815260408051610120810182527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3755460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152600160281b8104831660a0830152600160301b8104831660c0830152600160381b810490921660e0820152600160401b90910461ffff169181019190915290565b506000908152600f6020908152604091829020825161012081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152600160281b8104841660a0830152600160301b8104841660c0830152600160381b810490931660e0820152600160401b90920461ffff169082015290565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b03163314610e705760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b60448201526064016107a5565b610e7b33838361198c565b5050565b610e8a848484610876565b6001600160a01b0383163b15610fb0576000836001600160a01b031663150b7a0233878686604051602401610ec29493929190612d44565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610efb9190612d77565b600060405180830381855afa9150503d8060008114610f36576040519150601f19603f3d011682016040523d82523d6000602084013e610f3b565b606091505b50915050600081806020019051810190610f559190612d93565b9050630a85bd0160e11b6001600160e01b0319821614610fad5760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b60448201526064016107a5565b50505b50505050565b600a818154811061096857600080fd5b6004546000906109c4811015610fde57600091505090565b610bb8811015610ff757678ac7230489e8000091505090565b610dac811015611011576801158e460913d0000091505090565b610fa081101561102b5768015af1d78b58c4000091505090565b611194811015611045576801a055690d9db8000091505090565b61138881101561105f576802b5e3af16b188000091505090565b6802b5e3af16b188000091505090565b6000818152601660205260409020546060904390036110e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a5565b60125460405163c87b56dd60e01b8152600481018490526101009091046001600160a01b03169063c87b56dd90602401600060405180830381865afa158015611135573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261071f9190810190612db0565b60005b82811015610fb057336006600086868581811061117f5761117f612c9a565b60209081029290920135835250810191909152604001600020546001600160a01b031614806111e5575033601060008686858181106111c0576111c0612c9a565b60209081029290920135835250810191909152604001600020546001600160a01b0316145b6112245760405162461bcd60e51b815260206004820152601060248201526f2737ba103cb7bab91031b434b1b5b2b760811b60448201526064016107a5565b61124784848381811061123957611239612c9a565b905060200201353384611d08565b8061125181612cc6565b915050611160565b60006001600083815260106020526040902054600160f81b900460ff166002811115611287576112876128c1565b0361131057600082815260106020526040812054600160a01b90046001600160581b031642116112b85760006112e1565b6000838152601060205260409020546112e190600160a01b90046001600160581b031642612e27565b60008481526010602052604090205490915061130990829085906001600160a01b0316611ff7565b9392505050565b6002600083815260106020526040902054600160f81b900460ff16600281111561133c5761133c6128c1565b036113a557600082815260106020526040812054600160a01b90046001600160581b0316421161136d576000611396565b60008381526010602052604090205461139690600160a01b90046001600160581b031642612e27565b90506113096201518082612e50565b506000919050565b336000818152600e6020526040902054813b919060ff16806113d7575033321480156113d7575081155b6113f35760405162461bcd60e51b81526004016107a590612cdf565b601254600460ff909116106114375760405162461bcd60e51b815260206004820152600a602482015269135a5b9d195908185b1b60b21b60448201526064016107a5565b6000838152600f60205260409020546018600160401b90910461ffff16101561148e5760405162461bcd60e51b8152602060048201526009602482015268131bddc81b195d995b60ba1b60448201526064016107a5565b61149783611aa4565b601354604051632770a7eb60e21b8152336004820152681043561a882930000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156114eb57600080fd5b505af11580156114ff573d6000803e3d6000fd5b50506012805460ff1692509050600061151783612e64565b82546101009290920a60ff81810219909316918316021790915560128054600087815260116020908152604091829020805493861660ff199094169390931790925591548251338152918201889052909216908201527f5adfc489bdc5da44dd63a1543f510c2154fe2b5c77842bf01fd0ad15d0b60094915060600160405180910390a180416015546040516020016115b293929190612d16565b60408051601f198184030181529190528051602090910120601555505050565b336000818152600e6020526040902054813b919060ff16806115fc575033321480156115fc575081155b6116185760405162461bcd60e51b81526004016107a590612cdf565b61162183611aa4565b6000838152600f6020526040902054600160381b900460ff166005811061167e5760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481b585e081b195d995b607a1b60448201526064016107a5565b6013546001600160a01b0316639dc29fac33600d61169d600186612e83565b60ff16815481106116b0576116b0612c9a565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b505050508060016117279190612e9c565b6000858152600f60205260409020805460ff92909216600160381b0260ff60381b199092169190911790557f620f7ca5296af9ceccd4e69cf6fdf017af8e9d4129a4aeab21a21d1fbfc59a993385611780846001612e9c565b604080516001600160a01b039094168452602084019290925260ff169082015260600160405180910390a15080416015546040516020016115b293929190612d16565b6001546001600160a01b031633146117da57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336000818152600e6020526040902054813b919060ff168061182657503332148015611826575081155b6118425760405162461bcd60e51b81526004016107a590612cdf565b60095460ff1661188d5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081899481858dd1a5d99481d1bc81b5a5b9d60521b60448201526064016107a5565b61138860025411156118d55760405162461bcd60e51b8152602060048201526011602482015270105b1b081cdd5c1c1b1e481b5a5b9d1959607a1b60448201526064016107a5565b60006118df610fc6565b9050801561194c57601354604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561193357600080fd5b505af1158015611947573d6000803e3d6000fd5b505050505b611955336120ea565b50804160155460405160200161196d93929190612d16565b60408051601f1981840301815291905280516020909101206015555050565b6000818152600660205260409020546001600160a01b038481169116146119e15760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064016107a5565b6001600160a01b0383166000908152600560205260408120805491611a0583612eb5565b90915550506001600160a01b0382166000908152600560205260408120805491611a2e83612cc6565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b336000818152600e6020526040902054813b919060ff1680611ace57503332148015611ace575081155b611aea5760405162461bcd60e51b81526004016107a590612cdf565b6000838152601060209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166002811115611b4957611b496128c1565b6002811115611b5a57611b5a6128c1565b81525050905080602001516001600160581b03164211611b7a5750611cf1565b600081602001516001600160581b031642611b959190612e27565b9050600182604001516002811115611baf57611baf6128c1565b03611c4c576000611bc582878560000151611ff7565b60135484516040516340c10f1960e01b81526001600160a01b0391821660048201526024810184905292935016906340c10f1990604401600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b505050508060146000828254611c409190612ecc565b90915550611cba915050565b600282604001516002811115611c6457611c646128c1565b03611cba57611c766201518082612e50565b6000868152600f602052604090208054600890611c9f908490600160401b900461ffff16612edf565b92506101000a81548161ffff021916908361ffff1602179055505b5050600083815260106020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b0316021790555b80416015546040516020016115b293929190612d16565b6000838152601060209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166002811115611d6757611d676128c1565b6002811115611d7857611d786128c1565b9052509050816002811115611d8f57611d8f6128c1565b81604001516002811115611da557611da56128c1565b03611de75760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b60448201526064016107a5565b600081602001516001600160581b03164211611e105781602001516001600160581b0316611e12565b425b9050600082604001516002811115611e2c57611e2c6128c1565b03611e4157611e3c84308761198c565b611e8b565b81602001516001600160581b0316421115611e5f57611e5f85611aa4565b81602001516001600160581b0316816001600160581b031611611e86578160200151611e88565b805b90505b600080846002811115611ea057611ea06128c1565b14611eab5784611eae565b60005b90506000846002811115611ec457611ec46128c1565b03611ed457611ed430868861198c565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856002811115611f0f57611f0f6128c1565b905260008781526010602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b836002811115611f8157611f816128c1565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036858742876002811115611fbf57611fbf6128c1565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050565b60006934f086f3b33b684000006014541061201457506000611309565b6000838152600f60209081526040808320815161012081018352905460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152600160281b8104831660a0830152600160301b8104831660c0830152600160381b810490921660e08201819052600160401b90920461ffff169281019290925290919062015180906120cc88670de0b6b3a7640000612f01565b6120d69190612f01565b6120e09190612e50565b9695505050505050565b600060025460016120fb9190612ecc565b61ffff8116600081815260166020526040812043905591925061211d9061213c565b905061212d8261ffff168261219b565b50610917838361ffff166122b0565b60003261214a600143612e27565b60405160609290921b6bffffffffffffffffffffffff191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b6121a3612728565b6121ac826123f4565b6000848152600f60209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160e08a0151610100808c015160ff98891661ffff19909b169a909a179a8816029990991763ffff00001916620100009587169590950263ff0000001916949094176301000000938616939093029290921765ffff0000000019166401000000009185169190910265ff0000000000191617600160281b918416919091021767ffff0000000000001916600160301b9183169190910260ff60381b191617600160381b91909416029290921769ffff00000000000000001916600160401b61ffff90921691909102179055905092915050565b6000818152600660205260409020546001600160a01b0316156123065760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107a5565b600480546000918261231783612cc6565b919050556003546123289190612ecc565b9050611388808211156123725760405162461bcd60e51b81526020600482015260126024820152711350560814d5541413164814915050d2115160721b60448201526064016107a5565b6002805490600061238283612cc6565b90915550506001600160a01b038416600081815260056020908152604080832080546001019055868352600690915280822080546001600160a01b0319168417905551859291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450505050565b6123fc612728565b61240b8261ffff1660006124fa565b60ff16815260109190911c9061242661ffff831660016124fa565b60ff16602082015260109190911c9061244461ffff831660026124fa565b60ff16604082015260109190911c9061246261ffff831660036124fa565b60ff16606082015260109190911c9061248061ffff831660046124fa565b60ff16608082015260109190911c9061249e61ffff831660056124fa565b60ff1660a082015260109190911c906124bc61ffff831660066124fa565b60ff1660c082015260109190911c906124da61ffff831660076124fa565b6124e5906001612e9c565b60ff1660e08201526001610100820152919050565b60008160ff1660000361251957612512600c84612f18565b905061071f565b8160ff1660010361252f57612512600c84612f18565b8160ff1660020361254557612512600c84612f18565b8160ff1660030361255b57612512601484612f18565b8160ff1660040361257157612512601484612f18565b8160ff1660050361258757612512601484612f18565b8160ff1660060361259d57612512600584612f18565b600a546000906125ad9085612f18565b9050600a8160ff16815481106125c5576125c5612c9a565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c90911610156125fb57905061071f565b600b8160ff168154811061261157612611612c9a565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805482825590600052602060002090601f016020900481019282156126d05791602002820160005b838211156126a157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612663565b80156126ce5782816101000a81549060ff02191690556001016020816000010492830192600103026126a1565b505b506126dc929150612774565b5090565b8280548282559060005260206000209081019282156126d0579160200282015b828111156126d0578251829068ffffffffffffffffff16905591602001919060010190612700565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5b808211156126dc5760008155600101612775565b6001600160e01b031981168114610be757600080fd5b6000602082840312156127b157600080fd5b813561130981612789565b60005b838110156127d75781810151838201526020016127bf565b50506000910152565b600081518084526127f88160208601602086016127bc565b601f01601f19169290920160200192915050565b60208152600061130960208301846127e0565b60006020828403121561283157600080fd5b5035919050565b80356001600160a01b038116811461284f57600080fd5b919050565b6000806040838503121561286757600080fd5b61287083612838565b946020939093013593505050565b8035801515811461284f57600080fd5b600080604083850312156128a157600080fd5b6128aa83612838565b91506128b86020840161287e565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03841681526001600160581b0383166020820152606081016003831061291457634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b60006020828403121561293457600080fd5b6113098261287e565b60008060006060848603121561295257600080fd5b61295b84612838565b925061296960208501612838565b9150604084013590509250925092565b60008083601f84011261298b57600080fd5b50813567ffffffffffffffff8111156129a357600080fd5b6020830191508360208260051b85010111156129be57600080fd5b9250929050565b600080602083850312156129d857600080fd5b823567ffffffffffffffff8111156129ef57600080fd5b6129fb85828601612979565b90969095509350505050565b600060208284031215612a1957600080fd5b61130982612838565b80356003811061284f57600080fd5b60008060408385031215612a4457600080fd5b823591506128b860208401612a22565b60008060408385031215612a6757600080fd5b612a7083612838565b91506128b860208401612838565b60006101208201905060ff835116825260ff60208401511660208301526040830151612aaf604084018260ff169052565b506060830151612ac4606084018260ff169052565b506080830151612ad9608084018260ff169052565b5060a0830151612aee60a084018260ff169052565b5060c0830151612b0360c084018260ff169052565b5060e0830151612b1860e084018260ff169052565b506101009283015161ffff16919092015290565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b6b57612b6b612b2c565b604052919050565b600067ffffffffffffffff821115612b8d57612b8d612b2c565b50601f01601f191660200190565b60008060008060808587031215612bb157600080fd5b612bba85612838565b9350612bc860208601612838565b925060408501359150606085013567ffffffffffffffff811115612beb57600080fd5b8501601f81018713612bfc57600080fd5b8035612c0f612c0a82612b73565b612b42565b818152886020838501011115612c2457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060408486031215612c5b57600080fd5b833567ffffffffffffffff811115612c7257600080fd5b612c7e86828701612979565b9094509250612c91905060208501612a22565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612cd857612cd8612cb0565b5060010190565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152602882015260480190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120e0908301846127e0565b60008251612d898184602087016127bc565b9190910192915050565b600060208284031215612da557600080fd5b815161130981612789565b600060208284031215612dc257600080fd5b815167ffffffffffffffff811115612dd957600080fd5b8201601f81018413612dea57600080fd5b8051612df8612c0a82612b73565b818152856020838501011115612e0d57600080fd5b612e1e8260208301602086016127bc565b95945050505050565b8181038181111561071f5761071f612cb0565b634e487b7160e01b600052601260045260246000fd5b600082612e5f57612e5f612e3a565b500490565b600060ff821660ff8103612e7a57612e7a612cb0565b60010192915050565b60ff828116828216039081111561071f5761071f612cb0565b60ff818116838216019081111561071f5761071f612cb0565b600081612ec457612ec4612cb0565b506000190190565b8082018082111561071f5761071f612cb0565b61ffff818116838216019080821115612efa57612efa612cb0565b5092915050565b808202811582820484141761071f5761071f612cb0565b600060ff831680612f2b57612f2b612e3a565b8060ff8416069150509291505056fea26469706673582212207be02979b966c3b87dc35399b6952e10d84e46159058626faa66eb12d30f788864736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c80638de7ddd311610167578063cc1ed202116100ce578063e1fc334f11610087578063e1fc334f14610667578063e3abc3741461067f578063e985e9c514610692578063f2fde38b146106c0578063f363c7b5146106d3578063f851a440146106db57600080fd5b8063cc1ed202146105de578063cd5d2118146105f1578063d0fb0f8c14610614578063d1d58b2514610634578063d8d8422914610647578063dc2f500c1461065457600080fd5b8063a9059cbb11610120578063a9059cbb14610577578063b88d4fde1461058a578063bc39eb5f1461059d578063bfc56b4a146105b0578063c06abfc7146105b8578063c87b56dd146105cb57600080fd5b80638de7ddd31461050857806390107afe1461051157806394e568471461052457806395d89b41146102d9578063a1b8f37414610544578063a22cb4651461056457600080fd5b806332cb6b0c1161020b5780636352211e116101c45780636352211e146104805780636ba4c138146104a957806370a08231146104bc57806376f0d51a146104dc5780638129fc1c146104ef5780638da5cb5b146104f757600080fd5b806332cb6b0c14610400578063338eebf4146104095780633cb16c671461043e57806342842e0e146104515780634f02c420146104645780635f69c1ac1461046d57600080fd5b80630b44a2181161025d5780630b44a2181461035c5780630d1657e81461036f57806318160ddd146103c45780631f85e3ca146103cd57806323b872dd146103e057806325fd90f3146103f357600080fd5b806301ffc9a71461029a57806305850844146102c257806306fdde03146102d9578063081812fc14610306578063095ea7b314610347575b600080fd5b6102ad6102a836600461279f565b6106ee565b60405190151581526020015b60405180910390f35b6102cb60035481565b6040519081526020016102b9565b604080518082019091526008815267436869636b656e7360c01b60208201525b6040516102b9919061280c565b61032f61031436600461281f565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102b9565b61035a610355366004612854565b610725565b005b61035a61036a36600461288e565b61080a565b6103b561037d36600461281f565b6010602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b6040516102b9939291906128d7565b6102cb60025481565b61035a6103db366004612922565b61084c565b61035a6103ee36600461293d565b610876565b6009546102ad9060ff1681565b6102cb61138881565b61042c61041736600461281f565b60116020526000908152604090205460ff1681565b60405160ff90911681526020016102b9565b6102cb61044c36600461281f565b61091c565b61035a61045f36600461293d565b61093d565b6102cb60045481565b61042c61047b36600461281f565b610958565b61032f61048e36600461281f565b6006602052600090815260409020546001600160a01b031681565b61035a6104b73660046129c5565b61098c565b6102cb6104ca366004612a07565b60056020526000908152604090205481565b61035a6104ea366004612a31565b6109ca565b61035a610ad0565b6001546001600160a01b031661032f565b6102cb60145481565b61035a61051f366004612a54565b610bea565b61053761053236600461281f565b610c39565b6040516102b99190612a7e565b6102cb61055236600461281f565b600c6020526000908152604090205481565b61035a61057236600461288e565b610db2565b61035a610585366004612854565b610e1e565b61035a610598366004612b9b565b610e7f565b61042c6105ab36600461281f565b610fb6565b6102cb610fc6565b60135461032f906001600160a01b031681565b6102f96105d936600461281f565b61106f565b61035a6105ec366004612c46565b61115d565b6102ad6105ff366004612a07565b600e6020526000908152604090205460ff1681565b6102cb61062236600461281f565b60166020526000908152604090205481565b6102cb61064236600461281f565b611259565b60125461042c9060ff1681565b61035a61066236600461281f565b6113ad565b60125461032f9061010090046001600160a01b031681565b61035a61068d36600461281f565b6115d2565b6102ad6106a0366004612a54565b600860209081526000928352604080842090915290825290205460ff1681565b61035a6106ce366004612a07565b6117c3565b61035a6117fc565b60015461032f906001600160a01b031681565b60006380ac58cd60e01b6001600160e01b03198316148061071f5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000818152600660205260409020546001600160a01b03163381148061076e57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b6107ae5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b0316331461082157600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331461086357600080fd5b6009805460ff1916911515919091179055565b336001600160a01b03841614806108a357506000818152600760205260409020546001600160a01b031633145b806108d157506001600160a01b038316600090815260086020908152604080832033845290915290205460ff165b61090c5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064016107a5565b61091783838361198c565b505050565b600d818154811061092c57600080fd5b600091825260209091200154905081565b61091783838360405180602001604052806000815250610e7f565b600b818154811061096857600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60005b81811015610917576109b88383838181106109ac576109ac612c9a565b90506020020135611aa4565b806109c281612cc6565b91505061098f565b60008281526006602052604090205482906001600160a01b0316331480610a0757506000818152601060205260409020546001600160a01b031633145b610a465760405162461bcd60e51b815260206004820152601060248201526f3737ba103cb7bab91031b434b1b5b2b760811b60448201526064016107a5565b336000818152600e6020526040902054813b919060ff1680610a7057503332148015610a70575081155b610a8c5760405162461bcd60e51b81526004016107a590612cdf565b610a97853386611d08565b8041601554604051602001610aae93929190612d16565b60408051601f1981840301815291905280516020909101206015555050505050565b6001546001600160a01b03163314610ae757600080fd5b600180546001600160a01b0319163390811782556000908152600e6020908152604091829020805460ff19908116909417905560098054909316909255805160a08101825260bd815260fd92810192909252607f90820152605e6060820152601f6080820152610b5b90600a90600561263a565b506040805160a08101825260018152600460208201526000918101829052606081018290526080810191909152610b9690600b90600561263a565b50604080516080810182526729a2241af62c00008152674563918244f400006020820152678ac7230489e80000918101919091526801158e460913d000006060820152610be790600d9060046126e0565b50565b6001546001600160a01b03163314610c0157600080fd5b60128054610100600160a81b0319166101006001600160a01b0394851602179055601380546001600160a01b03191691909216179055565b610c41612728565b600082815260166020526040902054439003610d1457505060008052600f602090815260408051610120810182527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3755460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152600160281b8104831660a0830152600160301b8104831660c0830152600160381b810490921660e0820152600160401b90910461ffff169181019190915290565b506000908152600f6020908152604091829020825161012081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152600160281b8104841660a0830152600160301b8104841660c0830152600160381b810490931660e0820152600160401b90920461ffff169082015290565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b03163314610e705760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b60448201526064016107a5565b610e7b33838361198c565b5050565b610e8a848484610876565b6001600160a01b0383163b15610fb0576000836001600160a01b031663150b7a0233878686604051602401610ec29493929190612d44565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610efb9190612d77565b600060405180830381855afa9150503d8060008114610f36576040519150601f19603f3d011682016040523d82523d6000602084013e610f3b565b606091505b50915050600081806020019051810190610f559190612d93565b9050630a85bd0160e11b6001600160e01b0319821614610fad5760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b60448201526064016107a5565b50505b50505050565b600a818154811061096857600080fd5b6004546000906109c4811015610fde57600091505090565b610bb8811015610ff757678ac7230489e8000091505090565b610dac811015611011576801158e460913d0000091505090565b610fa081101561102b5768015af1d78b58c4000091505090565b611194811015611045576801a055690d9db8000091505090565b61138881101561105f576802b5e3af16b188000091505090565b6802b5e3af16b188000091505090565b6000818152601660205260409020546060904390036110e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a5565b60125460405163c87b56dd60e01b8152600481018490526101009091046001600160a01b03169063c87b56dd90602401600060405180830381865afa158015611135573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261071f9190810190612db0565b60005b82811015610fb057336006600086868581811061117f5761117f612c9a565b60209081029290920135835250810191909152604001600020546001600160a01b031614806111e5575033601060008686858181106111c0576111c0612c9a565b60209081029290920135835250810191909152604001600020546001600160a01b0316145b6112245760405162461bcd60e51b815260206004820152601060248201526f2737ba103cb7bab91031b434b1b5b2b760811b60448201526064016107a5565b61124784848381811061123957611239612c9a565b905060200201353384611d08565b8061125181612cc6565b915050611160565b60006001600083815260106020526040902054600160f81b900460ff166002811115611287576112876128c1565b0361131057600082815260106020526040812054600160a01b90046001600160581b031642116112b85760006112e1565b6000838152601060205260409020546112e190600160a01b90046001600160581b031642612e27565b60008481526010602052604090205490915061130990829085906001600160a01b0316611ff7565b9392505050565b6002600083815260106020526040902054600160f81b900460ff16600281111561133c5761133c6128c1565b036113a557600082815260106020526040812054600160a01b90046001600160581b0316421161136d576000611396565b60008381526010602052604090205461139690600160a01b90046001600160581b031642612e27565b90506113096201518082612e50565b506000919050565b336000818152600e6020526040902054813b919060ff16806113d7575033321480156113d7575081155b6113f35760405162461bcd60e51b81526004016107a590612cdf565b601254600460ff909116106114375760405162461bcd60e51b815260206004820152600a602482015269135a5b9d195908185b1b60b21b60448201526064016107a5565b6000838152600f60205260409020546018600160401b90910461ffff16101561148e5760405162461bcd60e51b8152602060048201526009602482015268131bddc81b195d995b60ba1b60448201526064016107a5565b61149783611aa4565b601354604051632770a7eb60e21b8152336004820152681043561a882930000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156114eb57600080fd5b505af11580156114ff573d6000803e3d6000fd5b50506012805460ff1692509050600061151783612e64565b82546101009290920a60ff81810219909316918316021790915560128054600087815260116020908152604091829020805493861660ff199094169390931790925591548251338152918201889052909216908201527f5adfc489bdc5da44dd63a1543f510c2154fe2b5c77842bf01fd0ad15d0b60094915060600160405180910390a180416015546040516020016115b293929190612d16565b60408051601f198184030181529190528051602090910120601555505050565b336000818152600e6020526040902054813b919060ff16806115fc575033321480156115fc575081155b6116185760405162461bcd60e51b81526004016107a590612cdf565b61162183611aa4565b6000838152600f6020526040902054600160381b900460ff166005811061167e5760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481b585e081b195d995b607a1b60448201526064016107a5565b6013546001600160a01b0316639dc29fac33600d61169d600186612e83565b60ff16815481106116b0576116b0612c9a565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b505050508060016117279190612e9c565b6000858152600f60205260409020805460ff92909216600160381b0260ff60381b199092169190911790557f620f7ca5296af9ceccd4e69cf6fdf017af8e9d4129a4aeab21a21d1fbfc59a993385611780846001612e9c565b604080516001600160a01b039094168452602084019290925260ff169082015260600160405180910390a15080416015546040516020016115b293929190612d16565b6001546001600160a01b031633146117da57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336000818152600e6020526040902054813b919060ff168061182657503332148015611826575081155b6118425760405162461bcd60e51b81526004016107a590612cdf565b60095460ff1661188d5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081899481858dd1a5d99481d1bc81b5a5b9d60521b60448201526064016107a5565b61138860025411156118d55760405162461bcd60e51b8152602060048201526011602482015270105b1b081cdd5c1c1b1e481b5a5b9d1959607a1b60448201526064016107a5565b60006118df610fc6565b9050801561194c57601354604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561193357600080fd5b505af1158015611947573d6000803e3d6000fd5b505050505b611955336120ea565b50804160155460405160200161196d93929190612d16565b60408051601f1981840301815291905280516020909101206015555050565b6000818152600660205260409020546001600160a01b038481169116146119e15760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b60448201526064016107a5565b6001600160a01b0383166000908152600560205260408120805491611a0583612eb5565b90915550506001600160a01b0382166000908152600560205260408120805491611a2e83612cc6565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b336000818152600e6020526040902054813b919060ff1680611ace57503332148015611ace575081155b611aea5760405162461bcd60e51b81526004016107a590612cdf565b6000838152601060209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166002811115611b4957611b496128c1565b6002811115611b5a57611b5a6128c1565b81525050905080602001516001600160581b03164211611b7a5750611cf1565b600081602001516001600160581b031642611b959190612e27565b9050600182604001516002811115611baf57611baf6128c1565b03611c4c576000611bc582878560000151611ff7565b60135484516040516340c10f1960e01b81526001600160a01b0391821660048201526024810184905292935016906340c10f1990604401600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b505050508060146000828254611c409190612ecc565b90915550611cba915050565b600282604001516002811115611c6457611c646128c1565b03611cba57611c766201518082612e50565b6000868152600f602052604090208054600890611c9f908490600160401b900461ffff16612edf565b92506101000a81548161ffff021916908361ffff1602179055505b5050600083815260106020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b0316021790555b80416015546040516020016115b293929190612d16565b6000838152601060209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff166002811115611d6757611d676128c1565b6002811115611d7857611d786128c1565b9052509050816002811115611d8f57611d8f6128c1565b81604001516002811115611da557611da56128c1565b03611de75760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b60448201526064016107a5565b600081602001516001600160581b03164211611e105781602001516001600160581b0316611e12565b425b9050600082604001516002811115611e2c57611e2c6128c1565b03611e4157611e3c84308761198c565b611e8b565b81602001516001600160581b0316421115611e5f57611e5f85611aa4565b81602001516001600160581b0316816001600160581b031611611e86578160200151611e88565b805b90505b600080846002811115611ea057611ea06128c1565b14611eab5784611eae565b60005b90506000846002811115611ec457611ec46128c1565b03611ed457611ed430868861198c565b6040518060600160405280826001600160a01b03168152602001836001600160581b03168152602001856002811115611f0f57611f0f6128c1565b905260008781526010602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b836002811115611f8157611f816128c1565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036858742876002811115611fbf57611fbf6128c1565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050565b60006934f086f3b33b684000006014541061201457506000611309565b6000838152600f60209081526040808320815161012081018352905460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152600160281b8104831660a0830152600160301b8104831660c0830152600160381b810490921660e08201819052600160401b90920461ffff169281019290925290919062015180906120cc88670de0b6b3a7640000612f01565b6120d69190612f01565b6120e09190612e50565b9695505050505050565b600060025460016120fb9190612ecc565b61ffff8116600081815260166020526040812043905591925061211d9061213c565b905061212d8261ffff168261219b565b50610917838361ffff166122b0565b60003261214a600143612e27565b60405160609290921b6bffffffffffffffffffffffff191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b6121a3612728565b6121ac826123f4565b6000848152600f60209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160e08a0151610100808c015160ff98891661ffff19909b169a909a179a8816029990991763ffff00001916620100009587169590950263ff0000001916949094176301000000938616939093029290921765ffff0000000019166401000000009185169190910265ff0000000000191617600160281b918416919091021767ffff0000000000001916600160301b9183169190910260ff60381b191617600160381b91909416029290921769ffff00000000000000001916600160401b61ffff90921691909102179055905092915050565b6000818152600660205260409020546001600160a01b0316156123065760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107a5565b600480546000918261231783612cc6565b919050556003546123289190612ecc565b9050611388808211156123725760405162461bcd60e51b81526020600482015260126024820152711350560814d5541413164814915050d2115160721b60448201526064016107a5565b6002805490600061238283612cc6565b90915550506001600160a01b038416600081815260056020908152604080832080546001019055868352600690915280822080546001600160a01b0319168417905551859291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450505050565b6123fc612728565b61240b8261ffff1660006124fa565b60ff16815260109190911c9061242661ffff831660016124fa565b60ff16602082015260109190911c9061244461ffff831660026124fa565b60ff16604082015260109190911c9061246261ffff831660036124fa565b60ff16606082015260109190911c9061248061ffff831660046124fa565b60ff16608082015260109190911c9061249e61ffff831660056124fa565b60ff1660a082015260109190911c906124bc61ffff831660066124fa565b60ff1660c082015260109190911c906124da61ffff831660076124fa565b6124e5906001612e9c565b60ff1660e08201526001610100820152919050565b60008160ff1660000361251957612512600c84612f18565b905061071f565b8160ff1660010361252f57612512600c84612f18565b8160ff1660020361254557612512600c84612f18565b8160ff1660030361255b57612512601484612f18565b8160ff1660040361257157612512601484612f18565b8160ff1660050361258757612512601484612f18565b8160ff1660060361259d57612512600584612f18565b600a546000906125ad9085612f18565b9050600a8160ff16815481106125c5576125c5612c9a565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c90911610156125fb57905061071f565b600b8160ff168154811061261157612611612c9a565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805482825590600052602060002090601f016020900481019282156126d05791602002820160005b838211156126a157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302612663565b80156126ce5782816101000a81549060ff02191690556001016020816000010492830192600103026126a1565b505b506126dc929150612774565b5090565b8280548282559060005260206000209081019282156126d0579160200282015b828111156126d0578251829068ffffffffffffffffff16905591602001919060010190612700565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5b808211156126dc5760008155600101612775565b6001600160e01b031981168114610be757600080fd5b6000602082840312156127b157600080fd5b813561130981612789565b60005b838110156127d75781810151838201526020016127bf565b50506000910152565b600081518084526127f88160208601602086016127bc565b601f01601f19169290920160200192915050565b60208152600061130960208301846127e0565b60006020828403121561283157600080fd5b5035919050565b80356001600160a01b038116811461284f57600080fd5b919050565b6000806040838503121561286757600080fd5b61287083612838565b946020939093013593505050565b8035801515811461284f57600080fd5b600080604083850312156128a157600080fd5b6128aa83612838565b91506128b86020840161287e565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03841681526001600160581b0383166020820152606081016003831061291457634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b60006020828403121561293457600080fd5b6113098261287e565b60008060006060848603121561295257600080fd5b61295b84612838565b925061296960208501612838565b9150604084013590509250925092565b60008083601f84011261298b57600080fd5b50813567ffffffffffffffff8111156129a357600080fd5b6020830191508360208260051b85010111156129be57600080fd5b9250929050565b600080602083850312156129d857600080fd5b823567ffffffffffffffff8111156129ef57600080fd5b6129fb85828601612979565b90969095509350505050565b600060208284031215612a1957600080fd5b61130982612838565b80356003811061284f57600080fd5b60008060408385031215612a4457600080fd5b823591506128b860208401612a22565b60008060408385031215612a6757600080fd5b612a7083612838565b91506128b860208401612838565b60006101208201905060ff835116825260ff60208401511660208301526040830151612aaf604084018260ff169052565b506060830151612ac4606084018260ff169052565b506080830151612ad9608084018260ff169052565b5060a0830151612aee60a084018260ff169052565b5060c0830151612b0360c084018260ff169052565b5060e0830151612b1860e084018260ff169052565b506101009283015161ffff16919092015290565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612b6b57612b6b612b2c565b604052919050565b600067ffffffffffffffff821115612b8d57612b8d612b2c565b50601f01601f191660200190565b60008060008060808587031215612bb157600080fd5b612bba85612838565b9350612bc860208601612838565b925060408501359150606085013567ffffffffffffffff811115612beb57600080fd5b8501601f81018713612bfc57600080fd5b8035612c0f612c0a82612b73565b612b42565b818152886020838501011115612c2457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060408486031215612c5b57600080fd5b833567ffffffffffffffff811115612c7257600080fd5b612c7e86828701612979565b9094509250612c91905060208501612a22565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612cd857612cd8612cb0565b5060010190565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152602882015260480190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120e0908301846127e0565b60008251612d898184602087016127bc565b9190910192915050565b600060208284031215612da557600080fd5b815161130981612789565b600060208284031215612dc257600080fd5b815167ffffffffffffffff811115612dd957600080fd5b8201601f81018413612dea57600080fd5b8051612df8612c0a82612b73565b818152856020838501011115612e0d57600080fd5b612e1e8260208301602086016127bc565b95945050505050565b8181038181111561071f5761071f612cb0565b634e487b7160e01b600052601260045260246000fd5b600082612e5f57612e5f612e3a565b500490565b600060ff821660ff8103612e7a57612e7a612cb0565b60010192915050565b60ff828116828216039081111561071f5761071f612cb0565b60ff818116838216019081111561071f5761071f612cb0565b600081612ec457612ec4612cb0565b506000190190565b8082018082111561071f5761071f612cb0565b61ffff818116838216019080821115612efa57612efa612cb0565b5092915050565b808202811582820484141761071f5761071f612cb0565b600060ff831680612f2b57612f2b612e3a565b8060ff8416069150509291505056fea26469706673582212207be02979b966c3b87dc35399b6952e10d84e46159058626faa66eb12d30f788864736f6c63430008120033

Deployed Bytecode Sourcemap

74289:12280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2584:171;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;2584:171:0;;;;;;;;1399:24;;;;;;;;;738:25:1;;;726:2;711:18;1399:24:0;592:177:1;83193:90:0;83258:17;;;;;;;;;;;;-1:-1:-1;;;83258:17:0;;;;83193:90;;;;;;;:::i;1580:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1580:46:0;;;;;;-1:-1:-1;;;;;1879:32:1;;;1861:51;;1849:2;1834:18;1580:46:0;1715:203:1;2767:330:0;;;;;;:::i;:::-;;:::i;:::-;;75337:99;;;;;;:::i;:::-;;:::i;74745:44::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;74745:44:0;;;-1:-1:-1;;;74745:44:0;;-1:-1:-1;;;;;74745:44:0;;-1:-1:-1;;;74745:44:0;;;;;;;;;;;;;;;:::i;1366:26::-;;;;;;75551:95;;;;;;:::i;:::-;;:::i;3326:334::-;;;;;;:::i;:::-;;:::i;74372:22::-;;;;;;;;;74324:41;;74361:4;74324:41;;74851:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4228:4:1;4216:17;;;4198:36;;4186:2;4171:18;74851:43:0;4056:184:1;74612:29:0;;;;;;:::i;:::-;;:::i;3672:136::-;;;;;;:::i;:::-;;:::i;1430:21::-;;;;;;74440:29;;;;;;:::i;:::-;;:::i;1521:42::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1521:42:0;;;81066:164;;;;;;:::i;:::-;;:::i;1464:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;79130:169;;;;;;:::i;:::-;;:::i;76847:405::-;;;:::i;1900:80::-;1967:5;;-1:-1:-1;;;;;1967:5:0;1900:80;;75031:30;;;;;;75160:169;;;;;;:::i;:::-;;:::i;81912:201::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;74523:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3109:209;;;;;;:::i;:::-;;:::i;2188:192::-;;;;;;:::i;:::-;;:::i;3820:583::-;;;;;;:::i;:::-;;:::i;74403:30::-;;;;;;:::i;:::-;;:::i;82121:385::-;;;:::i;75008:16::-;;;;;-1:-1:-1;;;;;75008:16:0;;;75671:269;;;;;;:::i;:::-;;:::i;80648:410::-;;;;;;:::i;:::-;;:::i;74650:36::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;75106:45;;;;;;:::i;:::-;;;;;;;;;;;;;;82514:671;;;;;;:::i;:::-;;:::i;74921:22::-;;;;;;;;;78770:352;;;;;;:::i;:::-;;:::i;74980:21::-;;;;;;;;-1:-1:-1;;;;;74980:21:0;;;78393:369;;;;;;:::i;:::-;;:::i;1636:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;75444:99;;;;;;:::i;:::-;;:::i;78087:298::-;;;:::i;1112:20::-;;;;;-1:-1:-1;;;;;1112:20:0;;;2584:171;2654:14;-1:-1:-1;;;;;;;;;2693:25:0;;;;:54;;-1:-1:-1;;;;;;;;;;2722:25:0;;;2693:54;2681:66;2584:171;-1:-1:-1;;2584:171:0:o;2767:330::-;2838:14;2855:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2855:16:0;2900:10;:20;;;:60;;-1:-1:-1;;;;;;2924:24:0;;;;;;:16;:24;;;;;;;;2949:10;2924:36;;;;;;;;;;2900:60;2892:85;;;;-1:-1:-1;;;2892:85:0;;9881:2:1;2892:85:0;;;9863:21:1;9920:2;9900:18;;;9893:30;-1:-1:-1;;;9939:18:1;;;9932:42;9991:18;;2892:85:0;;;;;;;;;2998:20;;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;2998:30:0;-1:-1:-1;;;;;2998:30:0;;;;;;;;;3054:34;;2998:20;;3054:34;;;;;;;2827:270;2767:330;;:::o;75337:99::-;78026:5;;-1:-1:-1;;;;;78026:5:0;78012:10;:19;78004:28;;;;;;-1:-1:-1;;;;;75410:9:0;;;::::1;;::::0;;;:4:::1;:9;::::0;;;;:18;;-1:-1:-1;;75410:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;75337:99::o;75551:95::-;78026:5;;-1:-1:-1;;;;;78026:5:0;78012:10;:19;78004:28;;;;;;75618:10:::1;:20:::0;;-1:-1:-1;;75618:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;75551:95::o;3326:334::-;3431:10;-1:-1:-1;;;;;3431:18:0;;;;:70;;-1:-1:-1;3481:20:0;;;;:11;:20;;;;;;-1:-1:-1;;;;;3481:20:0;3467:10;:34;3431:70;:121;;;-1:-1:-1;;;;;;3518:22:0;;;;;;:16;:22;;;;;;;;3541:10;3518:34;;;;;;;;;;3431:121;3409:184;;;;-1:-1:-1;;;3409:184:0;;9881:2:1;3409:184:0;;;9863:21:1;9920:2;9900:18;;;9893:30;-1:-1:-1;;;9939:18:1;;;9932:42;9991:18;;3409:184:0;9679:336:1;3409:184:0;3614:28;3624:4;3630:2;3634:7;3614:9;:28::i;:::-;3326:334;;;:::o;74612:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74612:29:0;:::o;3672:136::-;3761:39;3778:4;3784:2;3788:7;3761:39;;;;;;;;;;;;:16;:39::i;74440:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81066:164::-;81130:13;81125:98;81149:18;;;81125:98;;;81193:18;81200:3;;81204:5;81200:10;;;;;;;:::i;:::-;;;;;;;81193:6;:18::i;:::-;81169:7;;;;:::i;:::-;;;;81125:98;;79130:169;77837:11;;;;:7;:11;;;;;;79217:2;;-1:-1:-1;;;;;77837:11:0;77852:10;77837:25;;:63;;-1:-1:-1;77866:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;77866:20:0;77890:10;77866:34;77837:63;77815:129;;;;-1:-1:-1;;;77815:129:0;;10626:2:1;77815:129:0;;;10608:21:1;10665:2;10645:18;;;10638:30;-1:-1:-1;;;10684:18:1;;;10677:46;10740:18;;77815:129:0;10424:340:1;77815:129:0;77354:10:::1;77313:12;77468:16:::0;;;:4:::1;:16;::::0;;;;;77407;::::1;::::0;77354:10;77468:16:::1;;::::0;:58:::1;;-1:-1:-1::0;77489:10:0::1;77503:9;77489:23;:36:::0;::::1;;;-1:-1:-1::0;77516:9:0;;77489:36:::1;77446:131;;;;-1:-1:-1::0;;;77446:131:0::1;;;;;;;:::i;:::-;79257:34:::2;79267:2;79271:10;79283:7;79257:9;:34::i;:::-;77717:3:::1;77722:14;77738:12;;77700:51;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;77700:51:0;;::::1;::::0;;;;;;77690:62;;77700:51:::1;77690:62:::0;;::::1;::::0;77675:12:::1;:77:::0;-1:-1:-1;;;;;79130:169:0:o;76847:405::-;78026:5;;-1:-1:-1;;;;;78026:5:0;78012:10;:19;78004:28;;;;;;76897:5:::1;:18:::0;;-1:-1:-1;;;;;;76897:18:0::1;76905:10;76897:18:::0;;::::1;::::0;;:5:::1;76926:16:::0;;;:4:::1;:16;::::0;;;;;;;;:23;;-1:-1:-1;;76926:23:0;;::::1;::::0;;::::1;::::0;;76962:10:::1;:18:::0;;;;::::1;::::0;;;77033:41;;::::1;::::0;::::1;::::0;;77052:3:::1;77033:41:::0;;77057:3:::1;77033:41:::0;;::::1;::::0;;;;77062:3:::1;77033:41:::0;;;;77067:2:::1;77033:41:::0;;;;77071:2:::1;77033:41:::0;;;;::::1;::::0;:15:::1;::::0;:41:::1;;:::i;:::-;-1:-1:-1::0;77085:32:0::1;::::0;;::::1;::::0;::::1;::::0;;77103:1:::1;77085:32:::0;;77106:1:::1;77085:32;::::0;::::1;::::0;-1:-1:-1;77085:32:0;;;;;;;;;;;;;;;;;;;::::1;::::0;:14:::1;::::0;:32:::1;;:::i;:::-;-1:-1:-1::0;77128:116:0::1;::::0;;::::1;::::0;::::1;::::0;;77158:7:::1;77128:116:::0;;77180:7:::1;77128:116;::::0;::::1;::::0;77202:8:::1;77128:116:::0;;;;;;;77225:8:::1;77128:116:::0;;;;::::1;::::0;:12:::1;::::0;:116:::1;;:::i;:::-;;76847:405::o:0;75160:169::-;78026:5;;-1:-1:-1;;;;;78026:5:0;78012:10;:19;78004:28;;;;;;75268:6:::1;:25:::0;;-1:-1:-1;;;;;;75268:25:0::1;;-1:-1:-1::0;;;;;75268:25:0;;::::1;;;::::0;;75304:3:::1;:17:::0;;-1:-1:-1;;;;;;75304:17:0::1;::::0;;;::::1;;::::0;;75160:169::o;81912:201::-;81984:14;;:::i;:::-;82015:19;;;;:10;:19;;;;;;82038:12;82015:35;;82011:59;;-1:-1:-1;;82059:11:0;;;:8;:11;;;;;82052:18;;;;;;;82059:11;82052:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;82052:18:0;;;;;;;;-1:-1:-1;;;82052:18:0;;;;;;;;-1:-1:-1;;;82052:18:0;;;;;;;;;-1:-1:-1;;;82052:18:0;;;;;;;;;;;;;81912:201::o;82011:59::-;-1:-1:-1;82088:17:0;;;;:8;:17;;;;;;;;;82081:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;82081:24:0;;;;;;;;-1:-1:-1;;;82081:24:0;;;;;;;;-1:-1:-1;;;82081:24:0;;;;;;;;;-1:-1:-1;;;82081:24:0;;;;;;;;;;81912:201::o;3109:209::-;3206:10;3189:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;3189:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;3189:49:0;;;;;;;;;;3264:46;;540:41:1;;;3189:38:0;;3206:10;3264:46;;513:18:1;3264:46:0;;;;;;;3109:209;;:::o;2188:192::-;2277:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;2277:16:0;2263:10;:30;2255:52;;;;-1:-1:-1;;;2255:52:0;;11742:2:1;2255:52:0;;;11724:21:1;11781:1;11761:18;;;11754:29;-1:-1:-1;;;11799:18:1;;;11792:39;11848:18;;2255:52:0;11540:332:1;2255:52:0;2328:34;2338:10;2350:2;2354:7;2328:9;:34::i;:::-;2188:192;;:::o;3820:583::-;3926:31;3939:4;3945:2;3949:7;3926:12;:31::i;:::-;-1:-1:-1;;;;;3983:14:0;;;:19;3979:417;;4096:21;4121:2;-1:-1:-1;;;;;4121:13:0;4158:10;4187;4199:4;4205:7;4214:4;4135:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4135:84:0;;;;;;;;;;;4121:99;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4093:127;;;4253:15;4282:8;4271:30;;;;;;;;;;;;:::i;:::-;4253:48;-1:-1:-1;;;;;;;;;;4338:22:0;;;4330:54;;;;-1:-1:-1;;;4330:54:0;;13119:2:1;4330:54:0;;;13101:21:1;13158:2;13138:18;;;13131:30;-1:-1:-1;;;13177:18:1;;;13170:49;13236:18;;4330:54:0;12917:343:1;4330:54:0;4004:392;;3979:417;3820:583;;;;:::o;74403:30::-;;;;;;;;;;;;82121:385;82203:6;;82166:7;;82233:4;82224:13;;82220:27;;;82246:1;82239:8;;;82121:385;:::o;82220:27::-;82271:4;82262:6;:13;82258:34;;;82284:8;82277:15;;;82121:385;:::o;82258:34::-;82316:4;82307:6;:13;82303:34;;;82329:8;82322:15;;;82121:385;:::o;82303:34::-;82361:4;82352:6;:13;82348:34;;;82374:8;82367:15;;;82121:385;:::o;82348:34::-;82406:4;82397:6;:13;82393:34;;;82419:8;82412:15;;;82121:385;:::o;82393:34::-;82451:4;82442:6;:13;82438:34;;;82464:8;82457:15;;;82121:385;:::o;82438:34::-;82490:8;82483:15;;;82121:385;:::o;75671:269::-;75803:19;;;;:10;:19;;;;;;75727:13;;75826:12;75803:35;;75795:95;;;;-1:-1:-1;;;75795:95:0;;13467:2:1;75795:95:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:34;13525:18;;;13518:62;-1:-1:-1;;;13596:18:1;;;13589:45;13651:19;;75795:95:0;13265:411:1;75795:95:0;75908:6;;:24;;-1:-1:-1;;;75908:24:0;;;;;738:25:1;;;75908:6:0;;;;-1:-1:-1;;;;;75908:6:0;;:15;;711:18:1;;75908:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75908:24:0;;;;;;;;;;;;:::i;80648:410::-;80762:13;80757:294;80781:18;;;80757:294;;;80874:10;80851:7;:19;80859:3;;80863:5;80859:10;;;;;;;:::i;:::-;;;;;;;;;;80851:19;;-1:-1:-1;80851:19:0;;;;;;;;-1:-1:-1;80851:19:0;;-1:-1:-1;;;;;80851:19:0;:33;;:79;;-1:-1:-1;80920:10:0;80888;:22;80899:3;;80903:5;80899:10;;;;;;;:::i;:::-;;;;;;;;;;80888:22;;-1:-1:-1;80888:22:0;;;;;;;;-1:-1:-1;80888:22:0;:28;-1:-1:-1;;;;;80888:28:0;:42;80851:79;80825:157;;;;-1:-1:-1;;;80825:157:0;;14536:2:1;80825:157:0;;;14518:21:1;14575:2;14555:18;;;14548:30;-1:-1:-1;;;14594:18:1;;;14587:46;14650:18;;80825:157:0;14334:340:1;80825:157:0;80997:42;81007:3;;81011:5;81007:10;;;;;;;:::i;:::-;;;;;;;81019;81031:7;80997:9;:42::i;:::-;80801:7;;;;:::i;:::-;;;;80757:294;;82514:671;82568:7;82617:15;82592:14;;;;:10;:14;;;;;:21;-1:-1:-1;;;82592:21:0;;;;:40;;;;;;;;:::i;:::-;;82588:296;;82649:16;82686:14;;;:10;:14;;;;;:24;-1:-1:-1;;;82686:24:0;;-1:-1:-1;;;;;82686:24:0;82668:15;:42;:134;;82801:1;82668:134;;;82756:14;;;;:10;:14;;;;;:24;82738:42;;-1:-1:-1;;;82756:24:0;;-1:-1:-1;;;;;82756:24:0;82738:15;:42;:::i;:::-;82851:14;;;;:10;:14;;;;;:20;82649:153;;-1:-1:-1;82824:48:0;;82649:153;;82847:2;;-1:-1:-1;;;;;82851:20:0;82824:12;:48::i;:::-;82817:55;82514:671;-1:-1:-1;;;82514:671:0:o;82588:296::-;82923:15;82898:14;;;;:10;:14;;;;;:21;-1:-1:-1;;;82898:21:0;;;;:40;;;;;;;;:::i;:::-;;82894:265;;82955:16;82992:14;;;:10;:14;;;;;:24;-1:-1:-1;;;82992:24:0;;-1:-1:-1;;;;;82992:24:0;82974:15;:42;:134;;83107:1;82974:134;;;83062:14;;;;:10;:14;;;;;:24;83044:42;;-1:-1:-1;;;83062:24:0;;-1:-1:-1;;;;;83062:24:0;83044:15;:42;:::i;:::-;82955:153;-1:-1:-1;83130:17:0;83141:6;82955:153;83130:17;:::i;82894:265::-;-1:-1:-1;83176:1:0;;82514:671;-1:-1:-1;82514:671:0:o;78770:352::-;77354:10;77313:12;77468:16;;;:4;:16;;;;;;77407;;;77354:10;77468:16;;;:58;;-1:-1:-1;77489:10:0;77503:9;77489:23;:36;;;;-1:-1:-1;77516:9:0;;77489:36;77446:131;;;;-1:-1:-1;;;77446:131:0;;;;;;;:::i;:::-;78844:9:::1;::::0;78856:1:::1;78844:9;::::0;;::::1;:13;78836:36;;;::::0;-1:-1:-1;;;78836:36:0;;15271:2:1;78836:36:0::1;::::0;::::1;15253:21:1::0;15310:2;15290:18;;;15283:30;-1:-1:-1;;;15329:18:1;;;15322:40;15379:18;;78836:36:0::1;15069:334:1::0;78836:36:0::1;78891:12;::::0;;;:8:::1;:12;::::0;;;;:18;78913:2:::1;-1:-1:-1::0;;;78891:18:0;;::::1;;;:24;;78883:46;;;::::0;-1:-1:-1;;;78883:46:0;;15610:2:1;78883:46:0::1;::::0;::::1;15592:21:1::0;15649:1;15629:18;;;15622:29;-1:-1:-1;;;15667:18:1;;;15660:39;15716:18;;78883:46:0::1;15408:332:1::0;78883:46:0::1;78940:10;78947:2;78940:6;:10::i;:::-;78961:3;::::0;:31:::1;::::0;-1:-1:-1;;;78961:31:0;;78970:10:::1;78961:31;::::0;::::1;15947:51:1::0;78982:9:0::1;16014:18:1::0;;;16007:34;-1:-1:-1;;;;;78961:3:0;;::::1;::::0;:8:::1;::::0;15920:18:1;;78961:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;79005:9:0::1;:11:::0;;::::1;;::::0;-1:-1:-1;79005:9:0;-1:-1:-1;79005:9:0::1;:11;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;79044:9:::1;::::0;;-1:-1:-1;79027:14:0;;;:10:::1;:14;::::0;;;;;;;;:26;;79044:9;;::::1;-1:-1:-1::0;;79027:26:0;;::::1;::::0;;;::::1;::::0;;;79104:9;;79071:43;;79088:10:::1;16430:51:1::0;;16497:18;;;16490:34;;;79104:9:0;;::::1;16540:18:1::0;;;16533:45;79071:43:0::1;::::0;-1:-1:-1;16418:2:1;16403:18;79071:43:0::1;;;;;;;77717:3:::0;77722:14;77738:12;;77700:51;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77700:51:0;;;;;;;;;77690:62;;77700:51;77690:62;;;;77675:12;:77;-1:-1:-1;;;78770:352:0:o;78393:369::-;77354:10;77313:12;77468:16;;;:4;:16;;;;;;77407;;;77354:10;77468:16;;;:58;;-1:-1:-1;77489:10:0;77503:9;77489:23;:36;;;;-1:-1:-1;77516:9:0;;77489:36;77446:131;;;;-1:-1:-1;;;77446:131:0;;;;;;;:::i;:::-;78456:10:::1;78463:2;78456:6;:10::i;:::-;78479:16;78498:12:::0;;;:8:::1;:12;::::0;;;;:23;-1:-1:-1;;;78498:23:0;::::1;;;78553:1;78540:14:::0;::::1;78532:44;;;::::0;-1:-1:-1;;;78532:44:0;;16791:2:1;78532:44:0::1;::::0;::::1;16773:21:1::0;16830:2;16810:18;;;16803:30;-1:-1:-1;;;16849:18:1;;;16842:47;16906:18;;78532:44:0::1;16589:341:1::0;78532:44:0::1;78587:3;::::0;-1:-1:-1;;;;;78587:3:0::1;:8;78596:10;78608:12;78621;78587:3:::0;78621:10;:12:::1;:::i;:::-;78608:26;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;78587:48:::1;::::0;-1:-1:-1;;;;;;78587:48:0::1;::::0;;;;;;-1:-1:-1;;;;;15965:32:1;;;78587:48:0::1;::::0;::::1;15947:51:1::0;16014:18;;;16007:34;15920:18;;78587:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;78672:10;78685:1;78672:14;;;;:::i;:::-;78646:12;::::0;;;:8:::1;:12;::::0;;;;:40;;::::1;::::0;;;::::1;-1:-1:-1::0;;;78646:40:0::1;-1:-1:-1::0;;;;78646:40:0;;::::1;::::0;;;::::1;::::0;;78704:50:::1;78723:10;78655:2:::0;78739:14:::1;:10:::0;-1:-1:-1;78739:14:0::1;:::i;:::-;78704:50;::::0;;-1:-1:-1;;;;;16448:32:1;;;16430:51;;16512:2;16497:18;;16490:34;;;;16572:4;16560:17;16540:18;;;16533:45;16418:2;16403:18;78704:50:0::1;;;;;;;78445:317;77717:3:::0;77722:14;77738:12;;77700:51;;;;;;;;;;:::i;75444:99::-;78026:5;;-1:-1:-1;;;;;78026:5:0;78012:10;:19;78004:28;;;;;;75519:5:::1;:16:::0;;-1:-1:-1;;;;;;75519:16:0::1;-1:-1:-1::0;;;;;75519:16:0;;;::::1;::::0;;;::::1;::::0;;75444:99::o;78087:298::-;77354:10;77313:12;77468:16;;;:4;:16;;;;;;77407;;;77354:10;77468:16;;;:58;;-1:-1:-1;77489:10:0;77503:9;77489:23;:36;;;;-1:-1:-1;77516:9:0;;77489:36;77446:131;;;;-1:-1:-1;;;77446:131:0;;;;;;;:::i;:::-;78148:10:::1;::::0;::::1;;78140:45;;;::::0;-1:-1:-1;;;78140:45:0;;18084:2:1;78140:45:0::1;::::0;::::1;18066:21:1::0;18123:2;18103:18;;;18096:30;-1:-1:-1;;;18142:18:1;;;18135:52;18204:18;;78140:45:0::1;17882:346:1::0;78140:45:0::1;74361:4;78204:11;;:25;;78196:55;;;::::0;-1:-1:-1;;;78196:55:0;;18435:2:1;78196:55:0::1;::::0;::::1;18417:21:1::0;18474:2;18454:18;;;18447:30;-1:-1:-1;;;18493:18:1;;;18486:47;18550:18;;78196:55:0::1;18233:341:1::0;78196:55:0::1;78262:12;78277:14;:12;:14::i;:::-;78262:29:::0;-1:-1:-1;78306:8:0;;78302:40:::1;;78316:3;::::0;:26:::1;::::0;-1:-1:-1;;;78316:26:0;;78325:10:::1;78316:26;::::0;::::1;15947:51:1::0;16014:18;;;16007:34;;;-1:-1:-1;;;;;78316:3:0;;::::1;::::0;:8:::1;::::0;15920:18:1;;78316:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;78302:40;78353:24;78366:10;78353:12;:24::i;:::-;78129:256;77717:3:::0;77722:14;77738:12;;77700:51;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77700:51:0;;;;;;;;;77690:62;;77700:51;77690:62;;;;77675:12;:77;-1:-1:-1;;78087:298:0:o;4600:329::-;4690:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;4690:24:0;;;:16;;:24;4682:46;;;;-1:-1:-1;;;4682:46:0;;18781:2:1;4682:46:0;;;18763:21:1;18820:1;18800:18;;;18793:29;-1:-1:-1;;;18838:18:1;;;18831:39;18887:18;;4682:46:0;18579:332:1;4682:46:0;-1:-1:-1;;;;;4741:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;4770:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;4813:20:0;;;;:11;:20;;;;;;;;4806:27;;-1:-1:-1;;;;;;4806:27:0;;;;;;4854:7;:16;;;;;;:21;;-1:-1:-1;;;;;4854:21:0;;;;;;;;;;;;4891:27;;4825:7;;4854:21;;4891:27;;;;;;4600:329;;;:::o;81238:648::-;77354:10;77313:12;77468:16;;;:4;:16;;;;;;77407;;;77354:10;77468:16;;;:58;;-1:-1:-1;77489:10:0;77503:9;77489:23;:36;;;;-1:-1:-1;77516:9:0;;77489:36;77446:131;;;;-1:-1:-1;;;77446:131:0;;;;;;;:::i;:::-;81297:20:::1;81320:14:::0;;;:10:::1;:14;::::0;;;;;;;81297:37;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;81297:37:0;::::1;::::0;;-1:-1:-1;;;81297:37:0;::::1;-1:-1:-1::0;;;;;81297:37:0::1;::::0;;::::1;::::0;;;;;81320:14;;81297:37;;;-1:-1:-1;;;81297:37:0;::::1;;;;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;::::0;::::1;;;81370:6;:16;;;-1:-1:-1::0;;;;;81351:35:0::1;:15;:35;81347:48;;81388:7;;;81347:48;81407:16;81452:6;:16;;;-1:-1:-1::0;;;;;81434:34:0::1;:15;:34;;;;:::i;:::-;81407:62:::0;-1:-1:-1;81503:15:0::1;81486:6;:13;;;:32;;;;;;;;:::i;:::-;::::0;81482:334:::1;;81535:17;81555:40;81568:8;81578:2;81582:6;:12;;;81555;:40::i;:::-;81610:3;::::0;81619:12;;81610:33:::1;::::0;-1:-1:-1;;;81610:33:0;;-1:-1:-1;;;;;15965:32:1;;;81610:33:0::1;::::0;::::1;15947:51:1::0;16014:18;;;16007:34;;;81535:60:0;;-1:-1:-1;81610:3:0::1;::::0;:8:::1;::::0;15920:18:1;;81610:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;81677:9;81658:15;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;81482:334:0::1;::::0;-1:-1:-1;;81482:334:0::1;;81725:15;81708:6;:13;;;:32;;;;;;;;:::i;:::-;::::0;81704:112:::1;;81786:17;81797:6;81786:8:::0;:17:::1;:::i;:::-;81757:12;::::0;;;:8:::1;:12;::::0;;;;:47;;:18:::1;::::0;:47:::1;::::0;;;-1:-1:-1;;;81757:47:0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;81704:112;-1:-1:-1::0;;81828:14:0::1;::::0;;;:10:::1;:14;::::0;;;;:50;;-1:-1:-1;;;;81828:50:0::1;-1:-1:-1::0;;;81862:15:0::1;-1:-1:-1::0;;;;;81828:50:0::1;;;::::0;;77588:1:::1;77717:3:::0;77722:14;77738:12;;77700:51;;;;;;;;;;:::i;79307:1333::-;79431:20;79454:14;;;:10;:14;;;;;;;;79431:37;;;;;;;;;-1:-1:-1;;;;;79431:37:0;;;;-1:-1:-1;;;79431:37:0;;-1:-1:-1;;;;;79431:37:0;;;;;;;;;79454:14;;79431:37;;;-1:-1:-1;;;79431:37:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;79431:37:0;-1:-1:-1;79504:7:0;79487:24;;;;;;;;:::i;:::-;:6;:13;;;:24;;;;;;;;:::i;:::-;;79479:55;;;;-1:-1:-1;;;79479:55:0;;19562:2:1;79479:55:0;;;19544:21:1;19601:2;19581:18;;;19574:30;-1:-1:-1;;;19620:18:1;;;19613:48;19678:18;;79479:55:0;19360:342:1;79479:55:0;79814:16;79872:6;:16;;;-1:-1:-1;;;;;79854:34:0;:15;:34;:105;;79943:6;:16;;;-1:-1:-1;;;;;79854:105:0;;;;79908:15;79854:105;79814:156;-1:-1:-1;80004:16:0;79987:6;:13;;;:33;;;;;;;;:::i;:::-;;79983:260;;80022:42;80032:12;80054:4;80061:2;80022:9;:42::i;:::-;79983:260;;;80117:6;:16;;;-1:-1:-1;;;;;80099:34:0;:15;:34;80095:50;;;80135:10;80142:2;80135:6;:10::i;:::-;80184:6;:16;;;-1:-1:-1;;;;;80172:28:0;:9;-1:-1:-1;;;;;80172:28:0;;:59;;80215:6;:16;;;80172:59;;;80203:9;80172:59;80160:71;;79983:260;80255:14;;80272:7;:27;;;;;;;;:::i;:::-;;:55;;80315:12;80272:55;;;80310:1;80272:55;80255:72;-1:-1:-1;80353:16:0;80342:7;:27;;;;;;;;:::i;:::-;;80338:75;;80371:42;80389:4;80396:12;80410:2;80371:9;:42::i;:::-;80443:112;;;;;;;;80472:6;-1:-1:-1;;;;;80443:112:0;;;;;80504:9;-1:-1:-1;;;;;80443:112:0;;;;;80536:7;80443:112;;;;;;;;:::i;:::-;;;80426:14;;;;:10;:14;;;;;;;;;:129;;;;;;;;-1:-1:-1;;;;;80426:129:0;-1:-1:-1;;;80426:129:0;-1:-1:-1;;;;;;80426:129:0;;;-1:-1:-1;;;;;80426:129:0;;;;;;;;;;;;;;;:14;;;;-1:-1:-1;;;;;80426:129:0;-1:-1:-1;;;80426:129:0;;;;;;;;;:::i;:::-;;;;;;;;;80571:61;80582:12;80596:2;80600:15;80623:7;80617:14;;;;;;;;:::i;:::-;80571:61;;;-1:-1:-1;;;;;19952:32:1;;;19934:51;;20016:2;20001:18;;19994:34;;;;20044:18;;;20037:34;20119:4;20107:17;20102:2;20087:18;;20080:45;19921:3;19906:19;80571:61:0;;;;;;;79420:1220;;;79307:1333;;;:::o;83654:325::-;83745:7;83792:13;83773:15;;:32;83770:45;;-1:-1:-1;83814:1:0;83807:8;;83770:45;83826:22;83851:12;;;:8;:12;;;;;;;;83826:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;83826:37:0;;;;;;;;-1:-1:-1;;;83826:37:0;;;;;;;;-1:-1:-1;;;83826:37:0;;;;;;;;;;;-1:-1:-1;;;83826:37:0;;;;;;;;;;;;;;:22;83938:6;;83895:18;:8;83906:7;83895:18;:::i;:::-;:39;;;;:::i;:::-;83894:50;;;;:::i;:::-;83874:70;83654:325;-1:-1:-1;;;;;;83654:325:0:o;83420:226::-;83474:9;83493:11;;83507:1;83493:15;;;;:::i;:::-;83520:14;;;;;;;:10;:14;;;;;83537:12;83520:29;;83474:35;;-1:-1:-1;83575:10:0;;:6;:10::i;:::-;83560:25;;83596:18;83605:2;83596:18;;83609:4;83596:8;:18::i;:::-;;83625:13;83631:2;83635;83625:13;;:5;:13::i;86316:250::-;86369:7;86445:9;86479:16;86494:1;86479:12;:16;:::i;:::-;86414:142;;20542:2:1;20538:15;;;;-1:-1:-1;;20534:53:1;86414:142:0;;;20522:66:1;86469:27:0;20604:12:1;;;20597:28;86511:15:0;20641:12:1;;;20634:28;20678:12;;;20671:28;;;20715:13;;86414:142:0;;;-1:-1:-1;;86414:142:0;;;;;;;;;86404:153;;86414:142;86404:153;;;;;86316:250;-1:-1:-1;;86316:250:0:o;83987:546::-;84054:16;;:::i;:::-;84087:18;84100:4;84087:12;:18::i;:::-;84116:17;;;;:8;:17;;;;;;;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;84116:21:0;;;;;;;;;;;;;;;-1:-1:-1;;84116:21:0;;;;;;;;;-1:-1:-1;;84116:21:0;;;;;;;;;;;;;;;;;-1:-1:-1;;84116:21:0;;;;;;;;;-1:-1:-1;;84116:21:0;;-1:-1:-1;;;84116:21:0;;;;;;;;-1:-1:-1;;84116:21:0;-1:-1:-1;;;84116:21:0;;;;;;;-1:-1:-1;;;;84116:21:0;;-1:-1:-1;;;84116:21:0;;;;;;;;;-1:-1:-1;;84116:21:0;-1:-1:-1;;;84116:21:0;;;;;;;;;;;;-1:-1:-1;83987:546:0;;;;:::o;4937:590::-;5038:1;5010:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5010:16:0;:30;5002:57;;;;-1:-1:-1;;;5002:57:0;;20941:2:1;5002:57:0;;;20923:21:1;20980:2;20960:18;;;20953:30;-1:-1:-1;;;20999:18:1;;;20992:44;21053:18;;5002:57:0;20739:338:1;5002:57:0;5098:6;:8;;5072:11;;;5098:8;;;:::i;:::-;;;;;5086:9;;:20;;;;:::i;:::-;5072:34;-1:-1:-1;5134:4:0;5157:19;;;;5149:50;;;;-1:-1:-1;;;5149:50:0;;21284:2:1;5149:50:0;;;21266:21:1;21323:2;21303:18;;;21296:30;-1:-1:-1;;;21342:18:1;;;21335:48;21400:18;;5149:50:0;21082:342:1;5149:50:0;5210:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;;;;;;5383:13:0;;;;;;:9;:13;;;;;;;;:15;;;;;;5430:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;5430:21:0;;;;;5485:33;5438:7;;5383:13;;5485:33;;5383:13;;5485:33;4990:537;;4937:590;;:::o;85214:740::-;85273:16;;:::i;:::-;85315:37;85334:4;85341:6;85334:13;85350:1;85315:11;:37::i;:::-;85306:46;;;;85372:2;85363:11;;;;;85394:37;85420:6;85413:13;;85429:1;85394:11;:37::i;:::-;85385:46;;:6;;;:46;85451:2;85442:11;;;;;85473:37;85499:6;85492:13;;85508:1;85473:11;:37::i;:::-;85464:46;;:6;;;:46;85530:2;85521:11;;;;;85554:37;85580:6;85573:13;;85589:1;85554:11;:37::i;:::-;85543:48;;:8;;;:48;85611:2;85602:11;;;;;85635:37;85661:6;85654:13;;85670:1;85635:11;:37::i;:::-;85624:48;;:8;;;:48;85692:2;85683:11;;;;;85716:37;85742:6;85735:13;;85751:1;85716:11;:37::i;:::-;85705:48;;:8;;;:48;85773:2;85764:11;;;;;85798:37;85824:6;85817:13;;85833:1;85798:11;:37::i;:::-;85786:49;;:9;;;:49;85855:2;85846:11;;;;;85883:37;85909:6;85902:13;;85918:1;85883:11;:37::i;:::-;:41;;85923:1;85883:41;:::i;:::-;85868:56;;:12;;;:56;85945:1;85935:7;;;:11;85868:1;85214:740;-1:-1:-1;85214:740:0:o;84541:665::-;84615:5;84637:9;:14;;84650:1;84637:14;84633:43;;84660:16;84674:2;84666:4;84660:16;:::i;:::-;84653:23;;;;84633:43;84691:9;:14;;84704:1;84691:14;84687:43;;84714:16;84728:2;84720:4;84714:16;:::i;84687:43::-;84745:9;:14;;84758:1;84745:14;84741:43;;84768:16;84782:2;84774:4;84768:16;:::i;84741:43::-;84799:9;:14;;84812:1;84799:14;84795:43;;84822:16;84836:2;84828:4;84822:16;:::i;84795:43::-;84853:9;:14;;84866:1;84853:14;84849:43;;84876:16;84890:2;84882:4;84876:16;:::i;84849:43::-;84907:9;:14;;84920:1;84907:14;84903:43;;84930:16;84944:2;84936:4;84930:16;:::i;84903:43::-;84961:9;:14;;84974:1;84961:14;84957:42;;84984:15;84998:1;84990:4;84984:15;:::i;84957:42::-;85073:15;:22;85039:11;;85053:43;;85059:4;85053:43;:::i;:::-;85039:57;;85123:15;85139:5;85123:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;85119:1;85111:9;;;;;;:34;85107:52;;;85154:5;-1:-1:-1;85147:12:0;;85107:52;85177:14;85192:5;85177:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;85170:28;;;84541:665;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:1;998:16;;991:27;774:250::o;1029:271::-;1071:3;1109:5;1103:12;1136:6;1131:3;1124:19;1152:76;1221:6;1214:4;1209:3;1205:14;1198:4;1191:5;1187:16;1152:76;:::i;:::-;1282:2;1261:15;-1:-1:-1;;1257:29:1;1248:39;;;;1289:4;1244:50;;1029:271;-1:-1:-1;;1029:271:1:o;1305:220::-;1454:2;1443:9;1436:21;1417:4;1474:45;1515:2;1504:9;1500:18;1492:6;1474:45;:::i;1530:180::-;1589:6;1642:2;1630:9;1621:7;1617:23;1613:32;1610:52;;;1658:1;1655;1648:12;1610:52;-1:-1:-1;1681:23:1;;1530:180;-1:-1:-1;1530:180:1:o;1923:173::-;1991:20;;-1:-1:-1;;;;;2040:31:1;;2030:42;;2020:70;;2086:1;2083;2076:12;2020:70;1923:173;;;:::o;2101:254::-;2169:6;2177;2230:2;2218:9;2209:7;2205:23;2201:32;2198:52;;;2246:1;2243;2236:12;2198:52;2269:29;2288:9;2269:29;:::i;:::-;2259:39;2345:2;2330:18;;;;2317:32;;-1:-1:-1;;;2101:254:1:o;2360:160::-;2425:20;;2481:13;;2474:21;2464:32;;2454:60;;2510:1;2507;2500:12;2525:254;2590:6;2598;2651:2;2639:9;2630:7;2626:23;2622:32;2619:52;;;2667:1;2664;2657:12;2619:52;2690:29;2709:9;2690:29;:::i;:::-;2680:39;;2738:35;2769:2;2758:9;2754:18;2738:35;:::i;:::-;2728:45;;2525:254;;;;;:::o;2784:127::-;2845:10;2840:3;2836:20;2833:1;2826:31;2876:4;2873:1;2866:15;2900:4;2897:1;2890:15;2916:537;-1:-1:-1;;;;;3144:32:1;;3126:51;;-1:-1:-1;;;;;3213:37:1;;3208:2;3193:18;;3186:65;3114:2;3099:18;;3281:1;3270:13;;3260:144;;3326:10;3321:3;3317:20;3314:1;3307:31;3361:4;3358:1;3351:15;3389:4;3386:1;3379:15;3260:144;3440:6;3435:2;3424:9;3420:18;3413:34;2916:537;;;;;;:::o;3458:180::-;3514:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:52;;;3583:1;3580;3573:12;3535:52;3606:26;3622:9;3606:26;:::i;3643:328::-;3720:6;3728;3736;3789:2;3777:9;3768:7;3764:23;3760:32;3757:52;;;3805:1;3802;3795:12;3757:52;3828:29;3847:9;3828:29;:::i;:::-;3818:39;;3876:38;3910:2;3899:9;3895:18;3876:38;:::i;:::-;3866:48;;3961:2;3950:9;3946:18;3933:32;3923:42;;3643:328;;;;;:::o;4245:367::-;4308:8;4318:6;4372:3;4365:4;4357:6;4353:17;4349:27;4339:55;;4390:1;4387;4380:12;4339:55;-1:-1:-1;4413:20:1;;4456:18;4445:30;;4442:50;;;4488:1;4485;4478:12;4442:50;4525:4;4517:6;4513:17;4501:29;;4585:3;4578:4;4568:6;4565:1;4561:14;4553:6;4549:27;4545:38;4542:47;4539:67;;;4602:1;4599;4592:12;4539:67;4245:367;;;;;:::o;4617:437::-;4703:6;4711;4764:2;4752:9;4743:7;4739:23;4735:32;4732:52;;;4780:1;4777;4770:12;4732:52;4820:9;4807:23;4853:18;4845:6;4842:30;4839:50;;;4885:1;4882;4875:12;4839:50;4924:70;4986:7;4977:6;4966:9;4962:22;4924:70;:::i;:::-;5013:8;;4898:96;;-1:-1:-1;4617:437:1;-1:-1:-1;;;;4617:437:1:o;5059:186::-;5118:6;5171:2;5159:9;5150:7;5146:23;5142:32;5139:52;;;5187:1;5184;5177:12;5139:52;5210:29;5229:9;5210:29;:::i;5250:148::-;5323:20;;5372:1;5362:12;;5352:40;;5388:1;5385;5378:12;5403:271;5483:6;5491;5544:2;5532:9;5523:7;5519:23;5515:32;5512:52;;;5560:1;5557;5550:12;5512:52;5596:9;5583:23;5573:33;;5625:43;5664:2;5653:9;5649:18;5625:43;:::i;5679:260::-;5747:6;5755;5808:2;5796:9;5787:7;5783:23;5779:32;5776:52;;;5824:1;5821;5814:12;5776:52;5847:29;5866:9;5847:29;:::i;:::-;5837:39;;5895:38;5929:2;5918:9;5914:18;5895:38;:::i;6039:1164::-;6181:4;6223:3;6212:9;6208:19;6200:27;;6273:4;6264:6;6258:13;6254:24;6243:9;6236:43;6347:4;6339;6331:6;6327:17;6321:24;6317:35;6310:4;6299:9;6295:20;6288:65;6400:4;6392:6;6388:17;6382:24;6415:52;6461:4;6450:9;6446:20;6432:12;4043:4;4032:16;4020:29;;3976:75;6415:52;;6516:4;6508:6;6504:17;6498:24;6531:54;6579:4;6568:9;6564:20;6548:14;4043:4;4032:16;4020:29;;3976:75;6531:54;;6634:4;6626:6;6622:17;6616:24;6649:54;6697:4;6686:9;6682:20;6666:14;4043:4;4032:16;4020:29;;3976:75;6649:54;;6752:4;6744:6;6740:17;6734:24;6767:54;6815:4;6804:9;6800:20;6784:14;4043:4;4032:16;4020:29;;3976:75;6767:54;;6870:4;6862:6;6858:17;6852:24;6885:54;6933:4;6922:9;6918:20;6902:14;4043:4;4032:16;4020:29;;3976:75;6885:54;;6988:4;6980:6;6976:17;6970:24;7003:54;7051:4;7040:9;7036:20;7020:14;4043:4;4032:16;4020:29;;3976:75;7003:54;-1:-1:-1;7076:6:1;7119:15;;;7113:22;6020:6;6009:18;7178;;;;5997:31;6039:1164;:::o;7208:127::-;7269:10;7264:3;7260:20;7257:1;7250:31;7300:4;7297:1;7290:15;7324:4;7321:1;7314:15;7340:275;7411:2;7405:9;7476:2;7457:13;;-1:-1:-1;;7453:27:1;7441:40;;7511:18;7496:34;;7532:22;;;7493:62;7490:88;;;7558:18;;:::i;:::-;7594:2;7587:22;7340:275;;-1:-1:-1;7340:275:1:o;7620:186::-;7668:4;7701:18;7693:6;7690:30;7687:56;;;7723:18;;:::i;:::-;-1:-1:-1;7789:2:1;7768:15;-1:-1:-1;;7764:29:1;7795:4;7760:40;;7620:186::o;7811:888::-;7906:6;7914;7922;7930;7983:3;7971:9;7962:7;7958:23;7954:33;7951:53;;;8000:1;7997;7990:12;7951:53;8023:29;8042:9;8023:29;:::i;:::-;8013:39;;8071:38;8105:2;8094:9;8090:18;8071:38;:::i;:::-;8061:48;;8156:2;8145:9;8141:18;8128:32;8118:42;;8211:2;8200:9;8196:18;8183:32;8238:18;8230:6;8227:30;8224:50;;;8270:1;8267;8260:12;8224:50;8293:22;;8346:4;8338:13;;8334:27;-1:-1:-1;8324:55:1;;8375:1;8372;8365:12;8324:55;8411:2;8398:16;8436:48;8452:31;8480:2;8452:31;:::i;:::-;8436:48;:::i;:::-;8507:2;8500:5;8493:17;8547:7;8542:2;8537;8533;8529:11;8525:20;8522:33;8519:53;;;8568:1;8565;8558:12;8519:53;8623:2;8618;8614;8610:11;8605:2;8598:5;8594:14;8581:45;8667:1;8662:2;8657;8650:5;8646:14;8642:23;8635:34;8688:5;8678:15;;;;;7811:888;;;;;;;:::o;8925:528::-;9032:6;9040;9048;9101:2;9089:9;9080:7;9076:23;9072:32;9069:52;;;9117:1;9114;9107:12;9069:52;9157:9;9144:23;9190:18;9182:6;9179:30;9176:50;;;9222:1;9219;9212:12;9176:50;9261:70;9323:7;9314:6;9303:9;9299:22;9261:70;:::i;:::-;9350:8;;-1:-1:-1;9235:96:1;-1:-1:-1;9404:43:1;;-1:-1:-1;9443:2:1;9428:18;;9404:43;:::i;:::-;9394:53;;8925:528;;;;;:::o;10020:127::-;10081:10;10076:3;10072:20;10069:1;10062:31;10112:4;10109:1;10102:15;10136:4;10133:1;10126:15;10152:127;10213:10;10208:3;10204:20;10201:1;10194:31;10244:4;10241:1;10234:15;10268:4;10265:1;10258:15;10284:135;10323:3;10344:17;;;10341:43;;10364:18;;:::i;:::-;-1:-1:-1;10411:1:1;10400:13;;10284:135::o;10769:347::-;10971:2;10953:21;;;11010:2;10990:18;;;10983:30;11049:25;11044:2;11029:18;;11022:53;11107:2;11092:18;;10769:347::o;11121:414::-;-1:-1:-1;;11392:2:1;11388:15;;;11384:24;;11372:37;;11443:15;;;;11439:24;;;11434:2;11425:12;;11418:46;11489:2;11480:12;;11473:28;11526:2;11517:12;;11121:414::o;11877:489::-;-1:-1:-1;;;;;12146:15:1;;;12128:34;;12198:15;;12193:2;12178:18;;12171:43;12245:2;12230:18;;12223:34;;;12293:3;12288:2;12273:18;;12266:31;;;12071:4;;12314:46;;12340:19;;12332:6;12314:46;:::i;12371:287::-;12500:3;12538:6;12532:13;12554:66;12613:6;12608:3;12601:4;12593:6;12589:17;12554:66;:::i;:::-;12636:16;;;;;12371:287;-1:-1:-1;;12371:287:1:o;12663:249::-;12732:6;12785:2;12773:9;12764:7;12760:23;12756:32;12753:52;;;12801:1;12798;12791:12;12753:52;12833:9;12827:16;12852:30;12876:5;12852:30;:::i;13681:648::-;13761:6;13814:2;13802:9;13793:7;13789:23;13785:32;13782:52;;;13830:1;13827;13820:12;13782:52;13863:9;13857:16;13896:18;13888:6;13885:30;13882:50;;;13928:1;13925;13918:12;13882:50;13951:22;;14004:4;13996:13;;13992:27;-1:-1:-1;13982:55:1;;14033:1;14030;14023:12;13982:55;14062:2;14056:9;14087:48;14103:31;14131:2;14103:31;:::i;14087:48::-;14158:2;14151:5;14144:17;14198:7;14193:2;14188;14184;14180:11;14176:20;14173:33;14170:53;;;14219:1;14216;14209:12;14170:53;14232:67;14296:2;14291;14284:5;14280:14;14275:2;14271;14267:11;14232:67;:::i;:::-;14318:5;13681:648;-1:-1:-1;;;;;13681:648:1:o;14679:128::-;14746:9;;;14767:11;;;14764:37;;;14781:18;;:::i;14812:127::-;14873:10;14868:3;14864:20;14861:1;14854:31;14904:4;14901:1;14894:15;14928:4;14925:1;14918:15;14944:120;14984:1;15010;15000:35;;15015:18;;:::i;:::-;-1:-1:-1;15049:9:1;;14944:120::o;16052:175::-;16089:3;16133:4;16126:5;16122:16;16162:4;16153:7;16150:17;16147:43;;16170:18;;:::i;:::-;16219:1;16206:15;;16052:175;-1:-1:-1;;16052:175:1:o;16935:151::-;17025:4;17018:12;;;17004;;;17000:31;;17043:14;;17040:40;;;17060:18;;:::i;17370:148::-;17458:4;17437:12;;;17451;;;17433:31;;17476:13;;17473:39;;;17492:18;;:::i;18916:136::-;18955:3;18983:5;18973:39;;18992:18;;:::i;:::-;-1:-1:-1;;;19028:18:1;;18916:136::o;19057:125::-;19122:9;;;19143:10;;;19140:36;;;19156:18;;:::i;19187:168::-;19254:6;19280:10;;;19292;;;19276:27;;19315:11;;;19312:37;;;19329:18;;:::i;:::-;19312:37;19187:168;;;;:::o;20136:::-;20209:9;;;20240;;20257:15;;;20251:22;;20237:37;20227:71;;20278:18;;:::i;21429:157::-;21459:1;21493:4;21490:1;21486:12;21517:3;21507:37;;21524:18;;:::i;:::-;21576:3;21569:4;21566:1;21562:12;21558:22;21553:27;;;21429:157;;;;:::o

Swarm Source

ipfs://7be02979b966c3b87dc35399b6952e10d84e46159058626faa66eb12d30f7888
Loading...
Loading
Loading...
Loading
[ 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.