Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 19813027 | 79 days ago | IN | 0 ETH | 0.01435099 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GenericUpgradableTokenFeeConfigable
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-06 */ // File: @openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: DEFIT.sol /** *Submitted for verification at polygonscan.com on 2023-03-02 */ 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(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0, uint256 p1) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,uint256)", p0, p1) ); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,address)", p0, p1) ); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", 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, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", 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, uint256 p1) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint256)", 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( uint256 p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2) ); } function log( uint256 p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2) ); } function log( uint256 p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2) ); } function log( uint256 p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2) ); } function log( uint256 p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2) ); } function log( uint256 p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2) ); } function log( uint256 p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2) ); } function log( uint256 p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2) ); } function log( uint256 p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2) ); } function log( string memory p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,uint256)", 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, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2) ); } function log( bool p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2) ); } function log( bool p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2) ); } function log( bool p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2) ); } function log( bool p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,uint256)", 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, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2) ); } function log( address p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2) ); } function log( address p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2) ); } function log( address p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2) ); } function log( address p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,uint256)", 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, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,uint256)", 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( uint256 p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,uint256,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,uint256,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,uint256,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,string,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,bool,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,address,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,uint256,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,uint256,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,uint256,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,uint256,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,string,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,bool,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,address,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,string,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,uint256,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,uint256,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,uint256,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,string,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,bool,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,address,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,bool,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,uint256,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,uint256,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,uint256,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,string,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,bool,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,address,uint256)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint256,address,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,uint256,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,uint256,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,uint256,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,string,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,bool,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,address,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint256,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint256,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint256,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint256,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint256,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint256,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint256,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint256,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint256,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint256,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,uint256,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,uint256,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,uint256,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,string,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,bool,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,bool,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,address,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint256,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint256,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint256,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint256,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint256,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint256,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint256,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint256,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint256,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint256,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,uint256,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,uint256,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,uint256,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,string,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,bool,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,address,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint256,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint256,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint256,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint256,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint256,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint256,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint256,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,uint256)", 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, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint256,uint256)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint256,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint256,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint256,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,uint256)", 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, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,uint256)", 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: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/StorageSlot.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue( target, data, 0, "Address: low-level call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967Upgrade { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require( Address.isContract(newImplementation), "ERC1967: new implementation is not a contract" ); StorageSlot .getAddressSlot(_IMPLEMENTATION_SLOT) .value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns ( bytes32 slot ) { require( slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID" ); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require( newAdmin != address(0), "ERC1967: new admin is the zero address" ); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require( Address.isContract(newBeacon), "ERC1967: new beacon is not a contract" ); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { Address.functionDelegateCall( IBeacon(newBeacon).implementation(), data ); } } } // File: @openzeppelin/contracts/proxy/Proxy.sol // OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol) pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall( gas(), implementation, 0, calldatasize(), 0, 0 ) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overridden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} } // File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol) pragma solidity ^0.8.0; /** * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an * implementation address that can be changed. This address is stored in storage in the location specified by * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the * implementation behind the proxy. */ contract ERC1967Proxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`. * * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded * function call, and allows initializing the storage of the proxy like a Solidity constructor. */ constructor(address _logic, bytes memory _data) payable { _upgradeToAndCall(_logic, _data, false); } /** * @dev Returns the current implementation address. */ function _implementation() internal view virtual override returns (address impl) { return ERC1967Upgrade._getImplementation(); } } // File: @openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol // OpenZeppelin Contracts (last updated v4.7.0) (proxy/transparent/TransparentUpgradeableProxy.sol) pragma solidity ^0.8.0; /** * @dev This contract implements a proxy that is upgradeable by an admin. * * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector * clashing], which can potentially be used in an attack, this contract uses the * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two * things that go hand in hand: * * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if * that call matches one of the admin functions exposed by the proxy itself. * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the * implementation. If the admin tries to call a function on the implementation it will fail with an error that says * "admin cannot fallback to proxy target". * * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due * to sudden errors when trying to call a function from the proxy implementation. * * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. */ contract TransparentUpgradeableProxy is ERC1967Proxy { /** * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. */ constructor( address _logic, address admin_, bytes memory _data ) payable ERC1967Proxy(_logic, _data) { _changeAdmin(admin_); } /** * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. */ modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } } /** * @dev Returns the current admin. * * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function admin() external ifAdmin returns (address admin_) { admin_ = _getAdmin(); } /** * @dev Returns the current implementation. * * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` */ function implementation() external ifAdmin returns (address implementation_) { implementation_ = _implementation(); } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. * * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}. */ function changeAdmin(address newAdmin) external virtual ifAdmin { _changeAdmin(newAdmin); } /** * @dev Upgrade the implementation of the proxy. * * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}. */ function upgradeTo(address newImplementation) external ifAdmin { _upgradeToAndCall(newImplementation, bytes(""), false); } /** * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the * proxied contract. * * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}. */ function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin { _upgradeToAndCall(newImplementation, data, true); } /** * @dev Returns the current admin. */ function _admin() internal view virtual returns (address) { return _getAdmin(); } /** * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}. */ function _beforeFallback() internal virtual override { require( msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target" ); super._beforeFallback(); } } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue( target, data, 0, "Address: low-level call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require( !_initializing && _initialized < version, "Initializable: contract is already initialized" ); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing {} function __Context_init_unchained() internal onlyInitializing {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal onlyInitializing {} function __ERC20Burnable_init_unchained() internal onlyInitializing {} /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: ProxyErc201sol.sol pragma solidity >=0.6.0 <=0.8.7; interface IGenericUpgradableToken { function init( string memory _name, string memory _symbol, uint256 _totalSupply, address owner, address admin ) external; } interface IGenericUpgradableTokenMintable { function updateTotalSupply(address to, uint256 newTotalSupply) external; } contract GenericUpgradableToken is ERC20BurnableUpgradeable, OwnableUpgradeable, IGenericUpgradableToken { using SafeMath for uint256; function init( string memory _name, string memory _symbol, uint256 _totalSupply, address owner, address admin ) external override initializer { __Context_init_unchained(); __ERC20_init_unchained(_name, _symbol); __ERC20Burnable_init_unchained(); __Ownable_init_unchained(); _mint(owner, _totalSupply); transferOwnership(admin); } } contract GenericUpgradableTokenFeeConfigable is GenericUpgradableToken { using SafeMathUpgradeable for uint256; struct FeeInfo { uint256 receivingFee; uint256 sendingFee; uint256 transferType; // 1 for receive, 2 for send, 3 for both } struct ContractStorage { bool paused; mapping(address => FeeInfo) feeInfo; address taxDistribAddress; } bytes32 internal constant STORAGE_SLOT = keccak256("my.unique.namespace.genericupgradabletokenfeeconfigable"); function contractStorage() private pure returns (ContractStorage storage cs) { bytes32 slot = STORAGE_SLOT; assembly { cs.slot := slot } } // Public setter to initialize tax distribution address and paused state function setupContract(address initialTaxDistribAddress) public onlyOwner { ContractStorage storage cs = contractStorage(); require(cs.taxDistribAddress == address(0), "Already initialized"); // Ensure it's only set once cs.paused = false; // Default value for paused cs.taxDistribAddress = initialTaxDistribAddress; } //set tax distributer function setTaxDistributer(address initialTaxDistribAddress) public onlyOwner { ContractStorage storage cs = contractStorage(); cs.paused = false; // Default value for paused cs.taxDistribAddress = initialTaxDistribAddress; } modifier whenNotPaused() { if (!contractStorage().paused || tx.origin == owner()) { _; } else { revert("Contract is paused"); } } function pause() public onlyOwner { contractStorage().paused = true; } function unpause() public onlyOwner { contractStorage().paused = false; } function configureFee( address targetAddr, uint256 transferType, uint256 receivingFee, uint256 sendingFee ) public onlyOwner { require( transferType >= 1 && transferType <= 3, "Invalid transfer type" ); // Default values for fees uint256 adjustedSendingFee = sendingFee; uint256 adjustedReceivingFee = receivingFee; if (transferType == 1) { // Type 2: Sending fee is 0 adjustedSendingFee = 0; } else if (transferType == 2) { // Type 1: Receiving fee is 0 adjustedReceivingFee = 0; } // Update the storage with adjusted fees ContractStorage storage cs = contractStorage(); cs.feeInfo[targetAddr] = FeeInfo({ receivingFee: adjustedReceivingFee, sendingFee: adjustedSendingFee, transferType: transferType }); } function getFeeInfo(address addr) public view returns ( uint256 receivingFee, uint256 sendingFee, uint256 transferType ) { FeeInfo memory info = contractStorage().feeInfo[addr]; return (info.receivingFee, info.sendingFee, info.transferType); } function getTaxDistribAddress() public view returns (address) { return contractStorage().taxDistribAddress; } function isPaused() public view returns (bool) { return contractStorage().paused; } function _transfer( address from, address to, uint256 amount ) internal override whenNotPaused { FeeInfo memory senderFeeInfo = contractStorage().feeInfo[from]; FeeInfo memory receiverFeeInfo = contractStorage().feeInfo[to]; uint256 senderFee = 0; uint256 receiverFee = 0; if ( senderFeeInfo.transferType == 2 || senderFeeInfo.transferType == 3 ) { senderFee = amount.mul(senderFeeInfo.sendingFee).div(10000); amount = amount.sub(senderFee); } if ( receiverFeeInfo.transferType == 1 || receiverFeeInfo.transferType == 3 ) { receiverFee = amount.mul(receiverFeeInfo.receivingFee).div(10000); amount = amount.sub(receiverFee); } super._transfer(from, to, amount); if (senderFee > 0) { super._transfer( from, contractStorage().taxDistribAddress, senderFee ); } if (receiverFee > 0) { super._transfer( to, contractStorage().taxDistribAddress, receiverFee ); } } } contract FerrumProxyTokenDeployer { event TokenDeployed(address token, bytes data); event ProxyContsuctorArgs(bytes args); function deployToken( address logic, string memory name, string memory symbol, uint256 totalSupply, address admin ) external returns (address) { bytes memory data = abi.encodeWithSelector( IGenericUpgradableToken.init.selector, name, symbol, totalSupply, msg.sender, admin ); console.logBytes(data); address token = address( new TransparentUpgradeableProxy{ salt: keccak256(abi.encode(name, symbol, msg.sender)) }(logic, admin, data) ); emit TokenDeployed(token, data); bytes memory args = abi.encode(logic, admin, data); emit ProxyContsuctorArgs(args); return token; } function updateTotalSupplyMethodData(address to, uint256 newTotalSupply) external pure returns (bytes memory data) { data = abi.encodeWithSelector( IGenericUpgradableTokenMintable.updateTotalSupply.selector, to, newTotalSupply ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddr","type":"address"},{"internalType":"uint256","name":"transferType","type":"uint256"},{"internalType":"uint256","name":"receivingFee","type":"uint256"},{"internalType":"uint256","name":"sendingFee","type":"uint256"}],"name":"configureFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getFeeInfo","outputs":[{"internalType":"uint256","name":"receivingFee","type":"uint256"},{"internalType":"uint256","name":"sendingFee","type":"uint256"},{"internalType":"uint256","name":"transferType","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxDistribAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialTaxDistribAddress","type":"address"}],"name":"setTaxDistributer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialTaxDistribAddress","type":"address"}],"name":"setupContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612deb806100206000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637439459b116100de578063a9059cbb11610097578063dc20da7b11610071578063dc20da7b14610428578063dd62ed3e14610444578063ef09764914610474578063f2fde38b1461049257610173565b8063a9059cbb146103be578063b187bd26146103ee578063b1dc279e1461040c57610173565b80637439459b146102fa57806379cc67901461032c5780638456cb59146103485780638da5cb5b1461035257806395d89b4114610370578063a457c2d71461038e57610173565b8063313ce56711610130578063313ce5671461024c578063395093511461026a5780633f4ba83a1461029a57806342966c68146102a457806370a08231146102c0578063715018a6146102f057610173565b806306fdde0314610178578063095ea7b31461019657806318160ddd146101c657806323b872dd146101e45780632febb52d146102145780633078a16414610230575b600080fd5b6101806104ae565b60405161018d9190612309565b60405180910390f35b6101b060048036038101906101ab9190611e5a565b610540565b6040516101bd91906122d3565b60405180910390f35b6101ce610563565b6040516101db919061254b565b60405180910390f35b6101fe60048036038101906101f99190611e07565b61056d565b60405161020b91906122d3565b60405180910390f35b61022e60048036038101906102299190611e9a565b61059c565b005b61024a60048036038101906102459190611d9a565b6106b2565b005b61025461072a565b604051610261919061259d565b60405180910390f35b610284600480360381019061027f9190611e5a565b610733565b60405161029191906122d3565b60405180910390f35b6102a261076a565b005b6102be60048036038101906102b99190611fb4565b610798565b005b6102da60048036038101906102d59190611d9a565b6107ac565b6040516102e7919061254b565b60405180910390f35b6102f86107f5565b005b610314600480360381019061030f9190611d9a565b610809565b60405161032393929190612566565b60405180910390f35b61034660048036038101906103419190611e5a565b61089f565b005b6103506108bf565b005b61035a6108ed565b60405161036791906122b8565b60405180910390f35b610378610917565b6040516103859190612309565b60405180910390f35b6103a860048036038101906103a39190611e5a565b6109a9565b6040516103b591906122d3565b60405180910390f35b6103d860048036038101906103d39190611e5a565b610a20565b6040516103e591906122d3565b60405180910390f35b6103f6610a43565b60405161040391906122d3565b60405180910390f35b61042660048036038101906104219190611d9a565b610a63565b005b610442600480360381019061043d9190611f01565b610b6e565b005b61045e60048036038101906104599190611dc7565b610cde565b60405161046b919061254b565b60405180910390f35b61047c610d65565b60405161048991906122b8565b60405180910390f35b6104ac60048036038101906104a79190611d9a565b610d98565b005b6060603680546104bd906127e8565b80601f01602080910402602001604051908101604052809291908181526020018280546104e9906127e8565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b5050505050905090565b60008061054b610e1c565b9050610558818585610e24565b600191505092915050565b6000603554905090565b600080610578610e1c565b9050610585858285610fef565b61059085858561107b565b60019150509392505050565b6105a4611356565b600183101580156105b6575060038311155b6105f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ec906124eb565b60405180910390fd5b6000819050600083905060018514156106115760009150610620565b600285141561061f57600090505b5b600061062a6113d4565b90506040518060600160405280838152602001848152602001878152508160010160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505050505050505050565b6106ba611356565b60006106c46113d4565b905060008160000160006101000a81548160ff021916908315150217905550818160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006012905090565b60008061073e610e1c565b905061075f8185856107508589610cde565b61075a919061262a565b610e24565b600191505092915050565b610772611356565b600061077c6113d4565b60000160006101000a81548160ff021916908315150217905550565b6107a96107a3610e1c565b82611401565b50565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107fd611356565b61080760006115d1565b565b6000806000806108176113d4565b60010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806000015181602001518260400151935093509350509193909250565b6108b1826108ab610e1c565b83610fef565b6108bb8282611401565b5050565b6108c7611356565b60016108d16113d4565b60000160006101000a81548160ff021916908315150217905550565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610926906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610952906127e8565b801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505050905090565b6000806109b4610e1c565b905060006109c28286610cde565b905083811015610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe9061250b565b60405180910390fd5b610a148286868403610e24565b60019250505092915050565b600080610a2b610e1c565b9050610a3881858561107b565b600191505092915050565b6000610a4d6113d4565b60000160009054906101000a900460ff16905090565b610a6b611356565b6000610a756113d4565b9050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b019061248b565b60405180910390fd5b60008160000160006101000a81548160ff021916908315150217905550818160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060019054906101000a900460ff16159050808015610b9f5750600160008054906101000a900460ff1660ff16105b80610bcc5750610bae30611697565b158015610bcb5750600160008054906101000a900460ff1660ff16145b5b610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c02906123eb565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610c48576001600060016101000a81548160ff0219169083151502179055505b610c506116ba565b610c5a868661170b565b610c6261178c565b610c6a6117dd565b610c74838561183e565b610c7d82610d98565b8015610cd65760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610ccd91906122ee565b60405180910390a15b505050505050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610d6f6113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610da0611356565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e079061236b565b60405180910390fd5b610e19816115d1565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b9061246b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb9061238b565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fe2919061254b565b60405180910390a3505050565b6000610ffb8484610cde565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110755781811015611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906123ab565b60405180910390fd5b6110748484848403610e24565b5b50505050565b6110836113d4565b60000160009054906101000a900460ff1615806110d257506110a36108ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b156113165760006110e16113d4565b60010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905060006111566113d4565b60010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000806002846040015114806111db575060038460400151145b156112235761120b6127106111fd86602001518861199690919063ffffffff16565b6119ac90919063ffffffff16565b915061122082866119c290919063ffffffff16565b94505b60018360400151148061123a575060038360400151145b156112825761126a61271061125c85600001518861199690919063ffffffff16565b6119ac90919063ffffffff16565b905061127f81866119c290919063ffffffff16565b94505b61128d8787876119d8565b60008211156112cd576112cc876112a26113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846119d8565b5b600081111561130d5761130c866112e26113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836119d8565b5b50505050611351565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906124cb565b60405180910390fd5b505050565b61135e610e1c565b73ffffffffffffffffffffffffffffffffffffffff1661137c6108ed565b73ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061240b565b60405180910390fd5b565b6000807f99947fed411ad716c0c476e84050ed08ce0a2ba31c5273eb0062b36bece4f3c490508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114689061242b565b60405180910390fd5b61147d82600083611c53565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb9061234b565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115b8919061254b565b60405180910390a36115cc83600084611c58565b505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611700906124ab565b60405180910390fd5b565b600060019054906101000a900460ff1661175a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611751906124ab565b60405180910390fd5b8160369080519060200190611770929190611c5d565b508060379080519060200190611787929190611c5d565b505050565b600060019054906101000a900460ff166117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d2906124ab565b60405180910390fd5b565b600060019054906101000a900460ff1661182c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611823906124ab565b60405180910390fd5b61183c611837610e1c565b6115d1565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a59061252b565b60405180910390fd5b6118ba60008383611c53565b80603560008282546118cc919061262a565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161197e919061254b565b60405180910390a361199260008383611c58565b5050565b600081836119a491906126b1565b905092915050565b600081836119ba9190612680565b905092915050565b600081836119d0919061270b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061244b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061232b565b60405180910390fd5b611ac3838383611c53565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906123cb565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c3a919061254b565b60405180910390a3611c4d848484611c58565b50505050565b505050565b505050565b828054611c69906127e8565b90600052602060002090601f016020900481019282611c8b5760008555611cd2565b82601f10611ca457805160ff1916838001178555611cd2565b82800160010185558215611cd2579182015b82811115611cd1578251825591602001919060010190611cb6565b5b509050611cdf9190611ce3565b5090565b5b80821115611cfc576000816000905550600101611ce4565b5090565b6000611d13611d0e846125dd565b6125b8565b905082815260208101848484011115611d2f57611d2e61290c565b5b611d3a8482856127a6565b509392505050565b600081359050611d5181612d87565b92915050565b600082601f830112611d6c57611d6b612907565b5b8135611d7c848260208601611d00565b91505092915050565b600081359050611d9481612d9e565b92915050565b600060208284031215611db057611daf612916565b5b6000611dbe84828501611d42565b91505092915050565b60008060408385031215611dde57611ddd612916565b5b6000611dec85828601611d42565b9250506020611dfd85828601611d42565b9150509250929050565b600080600060608486031215611e2057611e1f612916565b5b6000611e2e86828701611d42565b9350506020611e3f86828701611d42565b9250506040611e5086828701611d85565b9150509250925092565b60008060408385031215611e7157611e70612916565b5b6000611e7f85828601611d42565b9250506020611e9085828601611d85565b9150509250929050565b60008060008060808587031215611eb457611eb3612916565b5b6000611ec287828801611d42565b9450506020611ed387828801611d85565b9350506040611ee487828801611d85565b9250506060611ef587828801611d85565b91505092959194509250565b600080600080600060a08688031215611f1d57611f1c612916565b5b600086013567ffffffffffffffff811115611f3b57611f3a612911565b5b611f4788828901611d57565b955050602086013567ffffffffffffffff811115611f6857611f67612911565b5b611f7488828901611d57565b9450506040611f8588828901611d85565b9350506060611f9688828901611d42565b9250506080611fa788828901611d42565b9150509295509295909350565b600060208284031215611fca57611fc9612916565b5b6000611fd884828501611d85565b91505092915050565b611fea8161273f565b82525050565b611ff981612751565b82525050565b61200881612794565b82525050565b60006120198261260e565b6120238185612619565b93506120338185602086016127b5565b61203c8161291b565b840191505092915050565b6000612054602383612619565b915061205f8261292c565b604082019050919050565b6000612077602283612619565b91506120828261297b565b604082019050919050565b600061209a602683612619565b91506120a5826129ca565b604082019050919050565b60006120bd602283612619565b91506120c882612a19565b604082019050919050565b60006120e0601d83612619565b91506120eb82612a68565b602082019050919050565b6000612103602683612619565b915061210e82612a91565b604082019050919050565b6000612126602e83612619565b915061213182612ae0565b604082019050919050565b6000612149602083612619565b915061215482612b2f565b602082019050919050565b600061216c602183612619565b915061217782612b58565b604082019050919050565b600061218f602583612619565b915061219a82612ba7565b604082019050919050565b60006121b2602483612619565b91506121bd82612bf6565b604082019050919050565b60006121d5601383612619565b91506121e082612c45565b602082019050919050565b60006121f8602b83612619565b915061220382612c6e565b604082019050919050565b600061221b601283612619565b915061222682612cbd565b602082019050919050565b600061223e601583612619565b915061224982612ce6565b602082019050919050565b6000612261602583612619565b915061226c82612d0f565b604082019050919050565b6000612284601f83612619565b915061228f82612d5e565b602082019050919050565b6122a38161277d565b82525050565b6122b281612787565b82525050565b60006020820190506122cd6000830184611fe1565b92915050565b60006020820190506122e86000830184611ff0565b92915050565b60006020820190506123036000830184611fff565b92915050565b60006020820190508181036000830152612323818461200e565b905092915050565b6000602082019050818103600083015261234481612047565b9050919050565b600060208201905081810360008301526123648161206a565b9050919050565b600060208201905081810360008301526123848161208d565b9050919050565b600060208201905081810360008301526123a4816120b0565b9050919050565b600060208201905081810360008301526123c4816120d3565b9050919050565b600060208201905081810360008301526123e4816120f6565b9050919050565b6000602082019050818103600083015261240481612119565b9050919050565b600060208201905081810360008301526124248161213c565b9050919050565b600060208201905081810360008301526124448161215f565b9050919050565b6000602082019050818103600083015261246481612182565b9050919050565b60006020820190508181036000830152612484816121a5565b9050919050565b600060208201905081810360008301526124a4816121c8565b9050919050565b600060208201905081810360008301526124c4816121eb565b9050919050565b600060208201905081810360008301526124e48161220e565b9050919050565b6000602082019050818103600083015261250481612231565b9050919050565b6000602082019050818103600083015261252481612254565b9050919050565b6000602082019050818103600083015261254481612277565b9050919050565b6000602082019050612560600083018461229a565b92915050565b600060608201905061257b600083018661229a565b612588602083018561229a565b612595604083018461229a565b949350505050565b60006020820190506125b260008301846122a9565b92915050565b60006125c26125d3565b90506125ce828261281a565b919050565b6000604051905090565b600067ffffffffffffffff8211156125f8576125f76128d8565b5b6126018261291b565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b60006126358261277d565b91506126408361277d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126755761267461284b565b5b828201905092915050565b600061268b8261277d565b91506126968361277d565b9250826126a6576126a561287a565b5b828204905092915050565b60006126bc8261277d565b91506126c78361277d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612700576126ff61284b565b5b828202905092915050565b60006127168261277d565b91506127218361277d565b9250828210156127345761273361284b565b5b828203905092915050565b600061274a8261275d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061279f82612787565b9050919050565b82818337600083830152505050565b60005b838110156127d35780820151818401526020810190506127b8565b838111156127e2576000848401525b50505050565b6000600282049050600182168061280057607f821691505b60208210811415612814576128136128a9565b5b50919050565b6128238261291b565b810181811067ffffffffffffffff82111715612842576128416128d8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f496e76616c6964207472616e7366657220747970650000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612d908161273f565b8114612d9b57600080fd5b50565b612da78161277d565b8114612db257600080fd5b5056fea264697066735822122002571160a42aa55569939a8569619e61dc306ca9311ac463d1efcc4e1935499964736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637439459b116100de578063a9059cbb11610097578063dc20da7b11610071578063dc20da7b14610428578063dd62ed3e14610444578063ef09764914610474578063f2fde38b1461049257610173565b8063a9059cbb146103be578063b187bd26146103ee578063b1dc279e1461040c57610173565b80637439459b146102fa57806379cc67901461032c5780638456cb59146103485780638da5cb5b1461035257806395d89b4114610370578063a457c2d71461038e57610173565b8063313ce56711610130578063313ce5671461024c578063395093511461026a5780633f4ba83a1461029a57806342966c68146102a457806370a08231146102c0578063715018a6146102f057610173565b806306fdde0314610178578063095ea7b31461019657806318160ddd146101c657806323b872dd146101e45780632febb52d146102145780633078a16414610230575b600080fd5b6101806104ae565b60405161018d9190612309565b60405180910390f35b6101b060048036038101906101ab9190611e5a565b610540565b6040516101bd91906122d3565b60405180910390f35b6101ce610563565b6040516101db919061254b565b60405180910390f35b6101fe60048036038101906101f99190611e07565b61056d565b60405161020b91906122d3565b60405180910390f35b61022e60048036038101906102299190611e9a565b61059c565b005b61024a60048036038101906102459190611d9a565b6106b2565b005b61025461072a565b604051610261919061259d565b60405180910390f35b610284600480360381019061027f9190611e5a565b610733565b60405161029191906122d3565b60405180910390f35b6102a261076a565b005b6102be60048036038101906102b99190611fb4565b610798565b005b6102da60048036038101906102d59190611d9a565b6107ac565b6040516102e7919061254b565b60405180910390f35b6102f86107f5565b005b610314600480360381019061030f9190611d9a565b610809565b60405161032393929190612566565b60405180910390f35b61034660048036038101906103419190611e5a565b61089f565b005b6103506108bf565b005b61035a6108ed565b60405161036791906122b8565b60405180910390f35b610378610917565b6040516103859190612309565b60405180910390f35b6103a860048036038101906103a39190611e5a565b6109a9565b6040516103b591906122d3565b60405180910390f35b6103d860048036038101906103d39190611e5a565b610a20565b6040516103e591906122d3565b60405180910390f35b6103f6610a43565b60405161040391906122d3565b60405180910390f35b61042660048036038101906104219190611d9a565b610a63565b005b610442600480360381019061043d9190611f01565b610b6e565b005b61045e60048036038101906104599190611dc7565b610cde565b60405161046b919061254b565b60405180910390f35b61047c610d65565b60405161048991906122b8565b60405180910390f35b6104ac60048036038101906104a79190611d9a565b610d98565b005b6060603680546104bd906127e8565b80601f01602080910402602001604051908101604052809291908181526020018280546104e9906127e8565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b5050505050905090565b60008061054b610e1c565b9050610558818585610e24565b600191505092915050565b6000603554905090565b600080610578610e1c565b9050610585858285610fef565b61059085858561107b565b60019150509392505050565b6105a4611356565b600183101580156105b6575060038311155b6105f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ec906124eb565b60405180910390fd5b6000819050600083905060018514156106115760009150610620565b600285141561061f57600090505b5b600061062a6113d4565b90506040518060600160405280838152602001848152602001878152508160010160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505050505050505050565b6106ba611356565b60006106c46113d4565b905060008160000160006101000a81548160ff021916908315150217905550818160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006012905090565b60008061073e610e1c565b905061075f8185856107508589610cde565b61075a919061262a565b610e24565b600191505092915050565b610772611356565b600061077c6113d4565b60000160006101000a81548160ff021916908315150217905550565b6107a96107a3610e1c565b82611401565b50565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107fd611356565b61080760006115d1565b565b6000806000806108176113d4565b60010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050806000015181602001518260400151935093509350509193909250565b6108b1826108ab610e1c565b83610fef565b6108bb8282611401565b5050565b6108c7611356565b60016108d16113d4565b60000160006101000a81548160ff021916908315150217905550565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610926906127e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610952906127e8565b801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505050905090565b6000806109b4610e1c565b905060006109c28286610cde565b905083811015610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe9061250b565b60405180910390fd5b610a148286868403610e24565b60019250505092915050565b600080610a2b610e1c565b9050610a3881858561107b565b600191505092915050565b6000610a4d6113d4565b60000160009054906101000a900460ff16905090565b610a6b611356565b6000610a756113d4565b9050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b019061248b565b60405180910390fd5b60008160000160006101000a81548160ff021916908315150217905550818160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060019054906101000a900460ff16159050808015610b9f5750600160008054906101000a900460ff1660ff16105b80610bcc5750610bae30611697565b158015610bcb5750600160008054906101000a900460ff1660ff16145b5b610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c02906123eb565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610c48576001600060016101000a81548160ff0219169083151502179055505b610c506116ba565b610c5a868661170b565b610c6261178c565b610c6a6117dd565b610c74838561183e565b610c7d82610d98565b8015610cd65760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610ccd91906122ee565b60405180910390a15b505050505050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610d6f6113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610da0611356565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e079061236b565b60405180910390fd5b610e19816115d1565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b9061246b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb9061238b565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fe2919061254b565b60405180910390a3505050565b6000610ffb8484610cde565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110755781811015611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906123ab565b60405180910390fd5b6110748484848403610e24565b5b50505050565b6110836113d4565b60000160009054906101000a900460ff1615806110d257506110a36108ed565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16145b156113165760006110e16113d4565b60010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905060006111566113d4565b60010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000806002846040015114806111db575060038460400151145b156112235761120b6127106111fd86602001518861199690919063ffffffff16565b6119ac90919063ffffffff16565b915061122082866119c290919063ffffffff16565b94505b60018360400151148061123a575060038360400151145b156112825761126a61271061125c85600001518861199690919063ffffffff16565b6119ac90919063ffffffff16565b905061127f81866119c290919063ffffffff16565b94505b61128d8787876119d8565b60008211156112cd576112cc876112a26113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846119d8565b5b600081111561130d5761130c866112e26113d4565b60020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836119d8565b5b50505050611351565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906124cb565b60405180910390fd5b505050565b61135e610e1c565b73ffffffffffffffffffffffffffffffffffffffff1661137c6108ed565b73ffffffffffffffffffffffffffffffffffffffff16146113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061240b565b60405180910390fd5b565b6000807f99947fed411ad716c0c476e84050ed08ce0a2ba31c5273eb0062b36bece4f3c490508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114689061242b565b60405180910390fd5b61147d82600083611c53565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb9061234b565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115b8919061254b565b60405180910390a36115cc83600084611c58565b505050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611700906124ab565b60405180910390fd5b565b600060019054906101000a900460ff1661175a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611751906124ab565b60405180910390fd5b8160369080519060200190611770929190611c5d565b508060379080519060200190611787929190611c5d565b505050565b600060019054906101000a900460ff166117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d2906124ab565b60405180910390fd5b565b600060019054906101000a900460ff1661182c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611823906124ab565b60405180910390fd5b61183c611837610e1c565b6115d1565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a59061252b565b60405180910390fd5b6118ba60008383611c53565b80603560008282546118cc919061262a565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161197e919061254b565b60405180910390a361199260008383611c58565b5050565b600081836119a491906126b1565b905092915050565b600081836119ba9190612680565b905092915050565b600081836119d0919061270b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061244b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061232b565b60405180910390fd5b611ac3838383611c53565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906123cb565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c3a919061254b565b60405180910390a3611c4d848484611c58565b50505050565b505050565b505050565b828054611c69906127e8565b90600052602060002090601f016020900481019282611c8b5760008555611cd2565b82601f10611ca457805160ff1916838001178555611cd2565b82800160010185558215611cd2579182015b82811115611cd1578251825591602001919060010190611cb6565b5b509050611cdf9190611ce3565b5090565b5b80821115611cfc576000816000905550600101611ce4565b5090565b6000611d13611d0e846125dd565b6125b8565b905082815260208101848484011115611d2f57611d2e61290c565b5b611d3a8482856127a6565b509392505050565b600081359050611d5181612d87565b92915050565b600082601f830112611d6c57611d6b612907565b5b8135611d7c848260208601611d00565b91505092915050565b600081359050611d9481612d9e565b92915050565b600060208284031215611db057611daf612916565b5b6000611dbe84828501611d42565b91505092915050565b60008060408385031215611dde57611ddd612916565b5b6000611dec85828601611d42565b9250506020611dfd85828601611d42565b9150509250929050565b600080600060608486031215611e2057611e1f612916565b5b6000611e2e86828701611d42565b9350506020611e3f86828701611d42565b9250506040611e5086828701611d85565b9150509250925092565b60008060408385031215611e7157611e70612916565b5b6000611e7f85828601611d42565b9250506020611e9085828601611d85565b9150509250929050565b60008060008060808587031215611eb457611eb3612916565b5b6000611ec287828801611d42565b9450506020611ed387828801611d85565b9350506040611ee487828801611d85565b9250506060611ef587828801611d85565b91505092959194509250565b600080600080600060a08688031215611f1d57611f1c612916565b5b600086013567ffffffffffffffff811115611f3b57611f3a612911565b5b611f4788828901611d57565b955050602086013567ffffffffffffffff811115611f6857611f67612911565b5b611f7488828901611d57565b9450506040611f8588828901611d85565b9350506060611f9688828901611d42565b9250506080611fa788828901611d42565b9150509295509295909350565b600060208284031215611fca57611fc9612916565b5b6000611fd884828501611d85565b91505092915050565b611fea8161273f565b82525050565b611ff981612751565b82525050565b61200881612794565b82525050565b60006120198261260e565b6120238185612619565b93506120338185602086016127b5565b61203c8161291b565b840191505092915050565b6000612054602383612619565b915061205f8261292c565b604082019050919050565b6000612077602283612619565b91506120828261297b565b604082019050919050565b600061209a602683612619565b91506120a5826129ca565b604082019050919050565b60006120bd602283612619565b91506120c882612a19565b604082019050919050565b60006120e0601d83612619565b91506120eb82612a68565b602082019050919050565b6000612103602683612619565b915061210e82612a91565b604082019050919050565b6000612126602e83612619565b915061213182612ae0565b604082019050919050565b6000612149602083612619565b915061215482612b2f565b602082019050919050565b600061216c602183612619565b915061217782612b58565b604082019050919050565b600061218f602583612619565b915061219a82612ba7565b604082019050919050565b60006121b2602483612619565b91506121bd82612bf6565b604082019050919050565b60006121d5601383612619565b91506121e082612c45565b602082019050919050565b60006121f8602b83612619565b915061220382612c6e565b604082019050919050565b600061221b601283612619565b915061222682612cbd565b602082019050919050565b600061223e601583612619565b915061224982612ce6565b602082019050919050565b6000612261602583612619565b915061226c82612d0f565b604082019050919050565b6000612284601f83612619565b915061228f82612d5e565b602082019050919050565b6122a38161277d565b82525050565b6122b281612787565b82525050565b60006020820190506122cd6000830184611fe1565b92915050565b60006020820190506122e86000830184611ff0565b92915050565b60006020820190506123036000830184611fff565b92915050565b60006020820190508181036000830152612323818461200e565b905092915050565b6000602082019050818103600083015261234481612047565b9050919050565b600060208201905081810360008301526123648161206a565b9050919050565b600060208201905081810360008301526123848161208d565b9050919050565b600060208201905081810360008301526123a4816120b0565b9050919050565b600060208201905081810360008301526123c4816120d3565b9050919050565b600060208201905081810360008301526123e4816120f6565b9050919050565b6000602082019050818103600083015261240481612119565b9050919050565b600060208201905081810360008301526124248161213c565b9050919050565b600060208201905081810360008301526124448161215f565b9050919050565b6000602082019050818103600083015261246481612182565b9050919050565b60006020820190508181036000830152612484816121a5565b9050919050565b600060208201905081810360008301526124a4816121c8565b9050919050565b600060208201905081810360008301526124c4816121eb565b9050919050565b600060208201905081810360008301526124e48161220e565b9050919050565b6000602082019050818103600083015261250481612231565b9050919050565b6000602082019050818103600083015261252481612254565b9050919050565b6000602082019050818103600083015261254481612277565b9050919050565b6000602082019050612560600083018461229a565b92915050565b600060608201905061257b600083018661229a565b612588602083018561229a565b612595604083018461229a565b949350505050565b60006020820190506125b260008301846122a9565b92915050565b60006125c26125d3565b90506125ce828261281a565b919050565b6000604051905090565b600067ffffffffffffffff8211156125f8576125f76128d8565b5b6126018261291b565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b60006126358261277d565b91506126408361277d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126755761267461284b565b5b828201905092915050565b600061268b8261277d565b91506126968361277d565b9250826126a6576126a561287a565b5b828204905092915050565b60006126bc8261277d565b91506126c78361277d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612700576126ff61284b565b5b828202905092915050565b60006127168261277d565b91506127218361277d565b9250828210156127345761273361284b565b5b828203905092915050565b600061274a8261275d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061279f82612787565b9050919050565b82818337600083830152505050565b60005b838110156127d35780820151818401526020810190506127b8565b838111156127e2576000848401525b50505050565b6000600282049050600182168061280057607f821691505b60208210811415612814576128136128a9565b5b50919050565b6128238261291b565b810181811067ffffffffffffffff82111715612842576128416128d8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f496e76616c6964207472616e7366657220747970650000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612d908161273f565b8114612d9b57600080fd5b50565b612da78161277d565b8114612db257600080fd5b5056fea264697066735822122002571160a42aa55569939a8569619e61dc306ca9311ac463d1efcc4e1935499964736f6c63430008060033
Deployed Bytecode Sourcemap
204408:4789:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;189842:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;192334:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;190962:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;193156:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;206330:984;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;205660:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;190804:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;193860:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;206235:87;;;:::i;:::-;;202507:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;191133:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;182454:103;;;:::i;:::-;;207322:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;202917:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;206143:84;;;:::i;:::-;;181806:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;190061:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;194633:505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;191516:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;207807:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;205266:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;203963:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;191813:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;207676:123;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;182712:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;189842:100;189896:13;189929:5;189922:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;189842:100;:::o;192334:242::-;192453:4;192475:13;192491:12;:10;:12::i;:::-;192475:28;;192514:32;192523:5;192530:7;192539:6;192514:8;:32::i;:::-;192564:4;192557:11;;;192334:242;;;;:::o;190962:108::-;191023:7;191050:12;;191043:19;;190962:108;:::o;193156:295::-;193287:4;193304:15;193322:12;:10;:12::i;:::-;193304:30;;193345:38;193361:4;193367:7;193376:6;193345:15;:38::i;:::-;193394:27;193404:4;193410:2;193414:6;193394:9;:27::i;:::-;193439:4;193432:11;;;193156:295;;;;;:::o;206330:984::-;181692:13;:11;:13::i;:::-;206545:1:::1;206529:12;:17;;:38;;;;;206566:1;206550:12;:17;;206529:38;206507:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;206665:26;206694:10;206665:39;;206715:28;206746:12;206715:43;;206791:1;206775:12;:17;206771:236;;;206871:1;206850:22;;206771:236;;;206910:1;206894:12;:17;206890:117;;;206994:1;206971:24;;206890:117;206771:236;207069:26;207098:17;:15;:17::i;:::-;207069:46;;207151:155;;;;;;;;207188:20;207151:155;;;;207235:18;207151:155;;;;207282:12;207151:155;;::::0;207126:2:::1;:10;;:22;207137:10;207126:22;;;;;;;;;;;;;;;:180;;;;;;;;;;;;;;;;;;;;;;;;;;;206496:818;;;206330:984:::0;;;;:::o;205660:280::-;181692:13;:11;:13::i;:::-;205772:26:::1;205801:17;:15;:17::i;:::-;205772:46;;205841:5;205829:2;:9;;;:17;;;;;;;;;;;;;;;;;;205908:24;205885:2;:20;;;:47;;;;;;;;;;;;;;;;;;205761:179;205660:280:::0;:::o;190804:93::-;190862:5;190887:2;190880:9;;190804:93;:::o;193860:270::-;193975:4;193997:13;194013:12;:10;:12::i;:::-;193997:28;;194036:64;194045:5;194052:7;194089:10;194061:25;194071:5;194078:7;194061:9;:25::i;:::-;:38;;;;:::i;:::-;194036:8;:64::i;:::-;194118:4;194111:11;;;193860:270;;;;:::o;206235:87::-;181692:13;:11;:13::i;:::-;206309:5:::1;206282:17;:15;:17::i;:::-;:24;;;:32;;;;;;;;;;;;;;;;;;206235:87::o:0;202507:91::-;202563:27;202569:12;:10;:12::i;:::-;202583:6;202563:5;:27::i;:::-;202507:91;:::o;191133:177::-;191252:7;191284:9;:18;191294:7;191284:18;;;;;;;;;;;;;;;;191277:25;;191133:177;;;:::o;182454:103::-;181692:13;:11;:13::i;:::-;182519:30:::1;182546:1;182519:18;:30::i;:::-;182454:103::o:0;207322:346::-;207418:20;207453:18;207486:20;207534:19;207556:17;:15;:17::i;:::-;:25;;:31;207582:4;207556:31;;;;;;;;;;;;;;;207534:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;207606:4;:17;;;207625:4;:15;;;207642:4;:17;;;207598:62;;;;;;;207322:346;;;;;:::o;202917:164::-;202994:46;203010:7;203019:12;:10;:12::i;:::-;203033:6;202994:15;:46::i;:::-;203051:22;203057:7;203066:6;203051:5;:22::i;:::-;202917:164;;:::o;206143:84::-;181692:13;:11;:13::i;:::-;206215:4:::1;206188:17;:15;:17::i;:::-;:24;;;:31;;;;;;;;;;;;;;;;;;206143:84::o:0;181806:87::-;181852:7;181879:6;;;;;;;;;;;181872:13;;181806:87;:::o;190061:104::-;190117:13;190150:7;190143:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;190061:104;:::o;194633:505::-;194753:4;194775:13;194791:12;:10;:12::i;:::-;194775:28;;194814:24;194841:25;194851:5;194858:7;194841:9;:25::i;:::-;194814:52;;194919:15;194899:16;:35;;194877:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;195035:60;195044:5;195051:7;195079:15;195060:16;:34;195035:8;:60::i;:::-;195126:4;195119:11;;;;194633:505;;;;:::o;191516:234::-;191631:4;191653:13;191669:12;:10;:12::i;:::-;191653:28;;191692;191702:5;191709:2;191713:6;191692:9;:28::i;:::-;191738:4;191731:11;;;191516:234;;;;:::o;207807:97::-;207848:4;207872:17;:15;:17::i;:::-;:24;;;;;;;;;;;;207865:31;;207807:97;:::o;205266:359::-;181692:13;:11;:13::i;:::-;205351:26:::1;205380:17;:15;:17::i;:::-;205351:46;;205448:1;205416:34;;:2;:20;;;;;;;;;;;;:34;;;205408:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;205526:5;205514:2;:9;;;:17;;;;;;;;;;;;;;;;;;205593:24;205570:2;:20;;;:47;;;;;;;;;;;;;;;;;;205340:285;205266:359:::0;:::o;203963:438::-;175443:19;175466:13;;;;;;;;;;;175465:14;175443:36;;175513:14;:34;;;;;175546:1;175531:12;;;;;;;;;;:16;;;175513:34;175512:146;;;;175571:44;175609:4;175571:29;:44::i;:::-;175570:45;:87;;;;;175656:1;175640:12;;;;;;;;;;:17;;;175570:87;175512:146;175490:242;;;;;;;;;;;;:::i;:::-;;;;;;;;;175758:1;175743:12;;:16;;;;;;;;;;;;;;;;;;175774:14;175770:67;;;175821:4;175805:13;;:20;;;;;;;;;;;;;;;;;;175770:67;204166:26:::1;:24;:26::i;:::-;204203:38;204226:5;204233:7;204203:22;:38::i;:::-;204252:32;:30;:32::i;:::-;204295:26;:24;:26::i;:::-;204332;204338:5;204345:12;204332:5;:26::i;:::-;204369:24;204387:5;204369:17;:24::i;:::-;175863:14:::0;175859:102;;;175910:5;175894:13;;:21;;;;;;;;;;;;;;;;;;175935:14;175947:1;175935:14;;;;;;:::i;:::-;;;;;;;;175859:102;175432:536;203963:438;;;;;:::o;191813:201::-;191947:7;191979:11;:18;191991:5;191979:18;;;;;;;;;;;;;;;:27;191998:7;191979:27;;;;;;;;;;;;;;;;191972:34;;191813:201;;;;:::o;207676:123::-;207729:7;207756:17;:15;:17::i;:::-;:35;;;;;;;;;;;;207749:42;;207676:123;:::o;182712:238::-;181692:13;:11;:13::i;:::-;182835:1:::1;182815:22;;:8;:22;;;;182793:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;182914:28;182933:8;182914:18;:28::i;:::-;182712:238:::0;:::o;179825:98::-;179878:7;179905:10;179898:17;;179825:98;:::o;198766:380::-;198919:1;198902:19;;:5;:19;;;;198894:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;199000:1;198981:21;;:7;:21;;;;198973:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;199084:6;199054:11;:18;199066:5;199054:18;;;;;;;;;;;;;;;:27;199073:7;199054:27;;;;;;;;;;;;;;;:36;;;;199122:7;199106:32;;199115:5;199106:32;;;199131:6;199106:32;;;;;;:::i;:::-;;;;;;;;198766:380;;;:::o;199437:502::-;199572:24;199599:25;199609:5;199616:7;199599:9;:25::i;:::-;199572:52;;199659:17;199639:16;:37;199635:297;;199739:6;199719:16;:26;;199693:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;199854:51;199863:5;199870:7;199898:6;199879:16;:25;199854:8;:51::i;:::-;199635:297;199561:378;199437:502;;;:::o;207912:1282::-;205989:17;:15;:17::i;:::-;:24;;;;;;;;;;;;205988:25;:49;;;;206030:7;:5;:7::i;:::-;206017:20;;:9;:20;;;205988:49;205984:144;;;208050:28:::1;208081:17;:15;:17::i;:::-;:25;;:31;208107:4;208081:31;;;;;;;;;;;;;;;208050:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;208123:30;208156:17;:15;:17::i;:::-;:25;;:29;208182:2;208156:29;;;;;;;;;;;;;;;208123:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;208196:17;208228:19:::0;208312:1:::1;208282:13;:26;;;:31;:66;;;;208347:1;208317:13;:26;;;:31;208282:66;208264:227;;;208387:47;208428:5;208387:36;208398:13;:24;;;208387:6;:10;;:36;;;;:::i;:::-;:40;;:47;;;;:::i;:::-;208375:59;;208458:21;208469:9;208458:6;:10;;:21;;;;:::i;:::-;208449:30;;208264:227;208553:1;208521:15;:28;;;:33;:83;;;;208603:1;208571:15;:28;;;:33;208521:83;208503:252;;;208645:51;208690:5;208645:40;208656:15;:28;;;208645:6;:10;;:40;;;;:::i;:::-;:44;;:51;;;;:::i;:::-;208631:65;;208720:23;208731:11;208720:6;:10;;:23;;;;:::i;:::-;208711:32;;208503:252;208767:33;208783:4;208789:2;208793:6;208767:15;:33::i;:::-;208829:1;208817:9;:13;208813:181;;;208847:135;208881:4;208904:17;:15;:17::i;:::-;:35;;;;;;;;;;;;208958:9;208847:15;:135::i;:::-;208813:181;209022:1;209008:11;:15;209004:183;;;209040:135;209074:2;209095:17;:15;:17::i;:::-;:35;;;;;;;;;;;;209149:11;209040:15;:135::i;:::-;209004:183;208039:1155;;;;205984:144:::0;;;206088:28;;;;;;;;;;:::i;:::-;;;;;;;;205984:144;207912:1282;;;:::o;181971:132::-;182046:12;:10;:12::i;:::-;182035:23;;:7;:5;:7::i;:::-;:23;;;182027:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;181971:132::o;204965:215::-;205041:26;205085:12;204888:68;205085:27;;205158:4;205147:15;;205132:41;204965:215;:::o;197653:675::-;197756:1;197737:21;;:7;:21;;;;197729:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;197809:49;197830:7;197847:1;197851:6;197809:20;:49::i;:::-;197871:22;197896:9;:18;197906:7;197896:18;;;;;;;;;;;;;;;;197871:43;;197951:6;197933:14;:24;;197925:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;198070:6;198053:14;:23;198032:9;:18;198042:7;198032:18;;;;;;;;;;;;;;;:44;;;;198187:6;198171:12;;:22;;;;;;;;;;;198248:1;198222:37;;198231:7;198222:37;;;198252:6;198222:37;;;;;;:::i;:::-;;;;;;;;198272:48;198292:7;198309:1;198313:6;198272:19;:48::i;:::-;197718:610;197653:675;;:::o;183110:191::-;183184:16;183203:6;;;;;;;;;;;183184:25;;183229:8;183220:6;;:17;;;;;;;;;;;;;;;;;;183284:8;183253:40;;183274:8;183253:40;;;;;;;;;;;;183173:128;183110:191;:::o;164137:326::-;164197:4;164454:1;164432:7;:19;;;:23;164425:30;;164137:326;;;:::o;179753:64::-;177661:13;;;;;;;;;;;177653:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;179753:64::o;189587:185::-;177661:13;;;;;;;;;;;177653:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;189731:5:::1;189723;:13;;;;;;;;;;;;:::i;:::-;;189757:7;189747;:17;;;;;;;;;;;;:::i;:::-;;189587:185:::0;;:::o;202321:70::-;177661:13;;;;;;;;;;;177653:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;202321:70::o;181454:113::-;177661:13;;;;;;;;;;;177653:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;181527:32:::1;181546:12;:10;:12::i;:::-;181527:18;:32::i;:::-;181454:113::o:0;196772:548::-;196875:1;196856:21;;:7;:21;;;;196848:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;196926:49;196955:1;196959:7;196968:6;196926:20;:49::i;:::-;197004:6;196988:12;;:22;;;;;;;:::i;:::-;;;;;;;;197181:6;197159:9;:18;197169:7;197159:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;197235:7;197214:37;;197231:1;197214:37;;;197244:6;197214:37;;;;;;:::i;:::-;;;;;;;;197264:48;197292:1;197296:7;197305:6;197264:19;:48::i;:::-;196772:548;;:::o;3806:98::-;3864:7;3895:1;3891;:5;;;;:::i;:::-;3884:12;;3806:98;;;;:::o;4205:::-;4263:7;4294:1;4290;:5;;;;:::i;:::-;4283:12;;4205:98;;;;:::o;3449:::-;3507:7;3538:1;3534;:5;;;;:::i;:::-;3527:12;;3449:98;;;;:::o;195608:877::-;195755:1;195739:18;;:4;:18;;;;195731:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;195832:1;195818:16;;:2;:16;;;;195810:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;195887:38;195908:4;195914:2;195918:6;195887:20;:38::i;:::-;195938:19;195960:9;:15;195970:4;195960:15;;;;;;;;;;;;;;;;195938:37;;196023:6;196008:11;:21;;195986:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;196163:6;196149:11;:20;196131:9;:15;196141:4;196131:15;;;;;;;;;;;;;;;:38;;;;196366:6;196349:9;:13;196359:2;196349:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;196416:2;196401:26;;196410:4;196401:26;;;196420:6;196401:26;;;;;;:::i;:::-;;;;;;;;196440:37;196460:4;196466:2;196470:6;196440:19;:37::i;:::-;195720:765;195608:877;;;:::o;200539:125::-;;;;:::o;201268:124::-;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:412:1:-;85:5;110:66;126:49;168:6;126:49;:::i;:::-;110:66;:::i;:::-;101:75;;199:6;192:5;185:21;237:4;230:5;226:16;275:3;266:6;261:3;257:16;254:25;251:2;;;282:79;;:::i;:::-;251:2;372:41;406:6;401:3;396;372:41;:::i;:::-;91:328;;;;;;:::o;425:139::-;471:5;509:6;496:20;487:29;;525:33;552:5;525:33;:::i;:::-;477:87;;;;:::o;584:340::-;640:5;689:3;682:4;674:6;670:17;666:27;656:2;;697:79;;:::i;:::-;656:2;814:6;801:20;839:79;914:3;906:6;899:4;891:6;887:17;839:79;:::i;:::-;830:88;;646:278;;;;;:::o;930:139::-;976:5;1014:6;1001:20;992:29;;1030:33;1057:5;1030:33;:::i;:::-;982:87;;;;:::o;1075:329::-;1134:6;1183:2;1171:9;1162:7;1158:23;1154:32;1151:2;;;1189:79;;:::i;:::-;1151:2;1309:1;1334:53;1379:7;1370:6;1359:9;1355:22;1334:53;:::i;:::-;1324:63;;1280:117;1141:263;;;;:::o;1410:474::-;1478:6;1486;1535:2;1523:9;1514:7;1510:23;1506:32;1503:2;;;1541:79;;:::i;:::-;1503:2;1661:1;1686:53;1731:7;1722:6;1711:9;1707:22;1686:53;:::i;:::-;1676:63;;1632:117;1788:2;1814:53;1859:7;1850:6;1839:9;1835:22;1814:53;:::i;:::-;1804:63;;1759:118;1493:391;;;;;:::o;1890:619::-;1967:6;1975;1983;2032:2;2020:9;2011:7;2007:23;2003:32;2000:2;;;2038:79;;:::i;:::-;2000:2;2158:1;2183:53;2228:7;2219:6;2208:9;2204:22;2183:53;:::i;:::-;2173:63;;2129:117;2285:2;2311:53;2356:7;2347:6;2336:9;2332:22;2311:53;:::i;:::-;2301:63;;2256:118;2413:2;2439:53;2484:7;2475:6;2464:9;2460:22;2439:53;:::i;:::-;2429:63;;2384:118;1990:519;;;;;:::o;2515:474::-;2583:6;2591;2640:2;2628:9;2619:7;2615:23;2611:32;2608:2;;;2646:79;;:::i;:::-;2608:2;2766:1;2791:53;2836:7;2827:6;2816:9;2812:22;2791:53;:::i;:::-;2781:63;;2737:117;2893:2;2919:53;2964:7;2955:6;2944:9;2940:22;2919:53;:::i;:::-;2909:63;;2864:118;2598:391;;;;;:::o;2995:765::-;3081:6;3089;3097;3105;3154:3;3142:9;3133:7;3129:23;3125:33;3122:2;;;3161:79;;:::i;:::-;3122:2;3281:1;3306:53;3351:7;3342:6;3331:9;3327:22;3306:53;:::i;:::-;3296:63;;3252:117;3408:2;3434:53;3479:7;3470:6;3459:9;3455:22;3434:53;:::i;:::-;3424:63;;3379:118;3536:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3507:118;3664:2;3690:53;3735:7;3726:6;3715:9;3711:22;3690:53;:::i;:::-;3680:63;;3635:118;3112:648;;;;;;;:::o;3766:1271::-;3881:6;3889;3897;3905;3913;3962:3;3950:9;3941:7;3937:23;3933:33;3930:2;;;3969:79;;:::i;:::-;3930:2;4117:1;4106:9;4102:17;4089:31;4147:18;4139:6;4136:30;4133:2;;;4169:79;;:::i;:::-;4133:2;4274:63;4329:7;4320:6;4309:9;4305:22;4274:63;:::i;:::-;4264:73;;4060:287;4414:2;4403:9;4399:18;4386:32;4445:18;4437:6;4434:30;4431:2;;;4467:79;;:::i;:::-;4431:2;4572:63;4627:7;4618:6;4607:9;4603:22;4572:63;:::i;:::-;4562:73;;4357:288;4684:2;4710:53;4755:7;4746:6;4735:9;4731:22;4710:53;:::i;:::-;4700:63;;4655:118;4812:2;4838:53;4883:7;4874:6;4863:9;4859:22;4838:53;:::i;:::-;4828:63;;4783:118;4940:3;4967:53;5012:7;5003:6;4992:9;4988:22;4967:53;:::i;:::-;4957:63;;4911:119;3920:1117;;;;;;;;:::o;5043:329::-;5102:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:2;;;5157:79;;:::i;:::-;5119:2;5277:1;5302:53;5347:7;5338:6;5327:9;5323:22;5302:53;:::i;:::-;5292:63;;5248:117;5109:263;;;;:::o;5378:118::-;5465:24;5483:5;5465:24;:::i;:::-;5460:3;5453:37;5443:53;;:::o;5502:109::-;5583:21;5598:5;5583:21;:::i;:::-;5578:3;5571:34;5561:50;;:::o;5617:143::-;5710:43;5747:5;5710:43;:::i;:::-;5705:3;5698:56;5688:72;;:::o;5766:364::-;5854:3;5882:39;5915:5;5882:39;:::i;:::-;5937:71;6001:6;5996:3;5937:71;:::i;:::-;5930:78;;6017:52;6062:6;6057:3;6050:4;6043:5;6039:16;6017:52;:::i;:::-;6094:29;6116:6;6094:29;:::i;:::-;6089:3;6085:39;6078:46;;5858:272;;;;;:::o;6136:366::-;6278:3;6299:67;6363:2;6358:3;6299:67;:::i;:::-;6292:74;;6375:93;6464:3;6375:93;:::i;:::-;6493:2;6488:3;6484:12;6477:19;;6282:220;;;:::o;6508:366::-;6650:3;6671:67;6735:2;6730:3;6671:67;:::i;:::-;6664:74;;6747:93;6836:3;6747:93;:::i;:::-;6865:2;6860:3;6856:12;6849:19;;6654:220;;;:::o;6880:366::-;7022:3;7043:67;7107:2;7102:3;7043:67;:::i;:::-;7036:74;;7119:93;7208:3;7119:93;:::i;:::-;7237:2;7232:3;7228:12;7221:19;;7026:220;;;:::o;7252:366::-;7394:3;7415:67;7479:2;7474:3;7415:67;:::i;:::-;7408:74;;7491:93;7580:3;7491:93;:::i;:::-;7609:2;7604:3;7600:12;7593:19;;7398:220;;;:::o;7624:366::-;7766:3;7787:67;7851:2;7846:3;7787:67;:::i;:::-;7780:74;;7863:93;7952:3;7863:93;:::i;:::-;7981:2;7976:3;7972:12;7965:19;;7770:220;;;:::o;7996:366::-;8138:3;8159:67;8223:2;8218:3;8159:67;:::i;:::-;8152:74;;8235:93;8324:3;8235:93;:::i;:::-;8353:2;8348:3;8344:12;8337:19;;8142:220;;;:::o;8368:366::-;8510:3;8531:67;8595:2;8590:3;8531:67;:::i;:::-;8524:74;;8607:93;8696:3;8607:93;:::i;:::-;8725:2;8720:3;8716:12;8709:19;;8514:220;;;:::o;8740:366::-;8882:3;8903:67;8967:2;8962:3;8903:67;:::i;:::-;8896:74;;8979:93;9068:3;8979:93;:::i;:::-;9097:2;9092:3;9088:12;9081:19;;8886:220;;;:::o;9112:366::-;9254:3;9275:67;9339:2;9334:3;9275:67;:::i;:::-;9268:74;;9351:93;9440:3;9351:93;:::i;:::-;9469:2;9464:3;9460:12;9453:19;;9258:220;;;:::o;9484:366::-;9626:3;9647:67;9711:2;9706:3;9647:67;:::i;:::-;9640:74;;9723:93;9812:3;9723:93;:::i;:::-;9841:2;9836:3;9832:12;9825:19;;9630:220;;;:::o;9856:366::-;9998:3;10019:67;10083:2;10078:3;10019:67;:::i;:::-;10012:74;;10095:93;10184:3;10095:93;:::i;:::-;10213:2;10208:3;10204:12;10197:19;;10002:220;;;:::o;10228:366::-;10370:3;10391:67;10455:2;10450:3;10391:67;:::i;:::-;10384:74;;10467:93;10556:3;10467:93;:::i;:::-;10585:2;10580:3;10576:12;10569:19;;10374:220;;;:::o;10600:366::-;10742:3;10763:67;10827:2;10822:3;10763:67;:::i;:::-;10756:74;;10839:93;10928:3;10839:93;:::i;:::-;10957:2;10952:3;10948:12;10941:19;;10746:220;;;:::o;10972:366::-;11114:3;11135:67;11199:2;11194:3;11135:67;:::i;:::-;11128:74;;11211:93;11300:3;11211:93;:::i;:::-;11329:2;11324:3;11320:12;11313:19;;11118:220;;;:::o;11344:366::-;11486:3;11507:67;11571:2;11566:3;11507:67;:::i;:::-;11500:74;;11583:93;11672:3;11583:93;:::i;:::-;11701:2;11696:3;11692:12;11685:19;;11490:220;;;:::o;11716:366::-;11858:3;11879:67;11943:2;11938:3;11879:67;:::i;:::-;11872:74;;11955:93;12044:3;11955:93;:::i;:::-;12073:2;12068:3;12064:12;12057:19;;11862:220;;;:::o;12088:366::-;12230:3;12251:67;12315:2;12310:3;12251:67;:::i;:::-;12244:74;;12327:93;12416:3;12327:93;:::i;:::-;12445:2;12440:3;12436:12;12429:19;;12234:220;;;:::o;12460:118::-;12547:24;12565:5;12547:24;:::i;:::-;12542:3;12535:37;12525:53;;:::o;12584:112::-;12667:22;12683:5;12667:22;:::i;:::-;12662:3;12655:35;12645:51;;:::o;12702:222::-;12795:4;12833:2;12822:9;12818:18;12810:26;;12846:71;12914:1;12903:9;12899:17;12890:6;12846:71;:::i;:::-;12800:124;;;;:::o;12930:210::-;13017:4;13055:2;13044:9;13040:18;13032:26;;13068:65;13130:1;13119:9;13115:17;13106:6;13068:65;:::i;:::-;13022:118;;;;:::o;13146:234::-;13245:4;13283:2;13272:9;13268:18;13260:26;;13296:77;13370:1;13359:9;13355:17;13346:6;13296:77;:::i;:::-;13250:130;;;;:::o;13386:313::-;13499:4;13537:2;13526:9;13522:18;13514:26;;13586:9;13580:4;13576:20;13572:1;13561:9;13557:17;13550:47;13614:78;13687:4;13678:6;13614:78;:::i;:::-;13606:86;;13504:195;;;;:::o;13705:419::-;13871:4;13909:2;13898:9;13894:18;13886:26;;13958:9;13952:4;13948:20;13944:1;13933:9;13929:17;13922:47;13986:131;14112:4;13986:131;:::i;:::-;13978:139;;13876:248;;;:::o;14130:419::-;14296:4;14334:2;14323:9;14319:18;14311:26;;14383:9;14377:4;14373:20;14369:1;14358:9;14354:17;14347:47;14411:131;14537:4;14411:131;:::i;:::-;14403:139;;14301:248;;;:::o;14555:419::-;14721:4;14759:2;14748:9;14744:18;14736:26;;14808:9;14802:4;14798:20;14794:1;14783:9;14779:17;14772:47;14836:131;14962:4;14836:131;:::i;:::-;14828:139;;14726:248;;;:::o;14980:419::-;15146:4;15184:2;15173:9;15169:18;15161:26;;15233:9;15227:4;15223:20;15219:1;15208:9;15204:17;15197:47;15261:131;15387:4;15261:131;:::i;:::-;15253:139;;15151:248;;;:::o;15405:419::-;15571:4;15609:2;15598:9;15594:18;15586:26;;15658:9;15652:4;15648:20;15644:1;15633:9;15629:17;15622:47;15686:131;15812:4;15686:131;:::i;:::-;15678:139;;15576:248;;;:::o;15830:419::-;15996:4;16034:2;16023:9;16019:18;16011:26;;16083:9;16077:4;16073:20;16069:1;16058:9;16054:17;16047:47;16111:131;16237:4;16111:131;:::i;:::-;16103:139;;16001:248;;;:::o;16255:419::-;16421:4;16459:2;16448:9;16444:18;16436:26;;16508:9;16502:4;16498:20;16494:1;16483:9;16479:17;16472:47;16536:131;16662:4;16536:131;:::i;:::-;16528:139;;16426:248;;;:::o;16680:419::-;16846:4;16884:2;16873:9;16869:18;16861:26;;16933:9;16927:4;16923:20;16919:1;16908:9;16904:17;16897:47;16961:131;17087:4;16961:131;:::i;:::-;16953:139;;16851:248;;;:::o;17105:419::-;17271:4;17309:2;17298:9;17294:18;17286:26;;17358:9;17352:4;17348:20;17344:1;17333:9;17329:17;17322:47;17386:131;17512:4;17386:131;:::i;:::-;17378:139;;17276:248;;;:::o;17530:419::-;17696:4;17734:2;17723:9;17719:18;17711:26;;17783:9;17777:4;17773:20;17769:1;17758:9;17754:17;17747:47;17811:131;17937:4;17811:131;:::i;:::-;17803:139;;17701:248;;;:::o;17955:419::-;18121:4;18159:2;18148:9;18144:18;18136:26;;18208:9;18202:4;18198:20;18194:1;18183:9;18179:17;18172:47;18236:131;18362:4;18236:131;:::i;:::-;18228:139;;18126:248;;;:::o;18380:419::-;18546:4;18584:2;18573:9;18569:18;18561:26;;18633:9;18627:4;18623:20;18619:1;18608:9;18604:17;18597:47;18661:131;18787:4;18661:131;:::i;:::-;18653:139;;18551:248;;;:::o;18805:419::-;18971:4;19009:2;18998:9;18994:18;18986:26;;19058:9;19052:4;19048:20;19044:1;19033:9;19029:17;19022:47;19086:131;19212:4;19086:131;:::i;:::-;19078:139;;18976:248;;;:::o;19230:419::-;19396:4;19434:2;19423:9;19419:18;19411:26;;19483:9;19477:4;19473:20;19469:1;19458:9;19454:17;19447:47;19511:131;19637:4;19511:131;:::i;:::-;19503:139;;19401:248;;;:::o;19655:419::-;19821:4;19859:2;19848:9;19844:18;19836:26;;19908:9;19902:4;19898:20;19894:1;19883:9;19879:17;19872:47;19936:131;20062:4;19936:131;:::i;:::-;19928:139;;19826:248;;;:::o;20080:419::-;20246:4;20284:2;20273:9;20269:18;20261:26;;20333:9;20327:4;20323:20;20319:1;20308:9;20304:17;20297:47;20361:131;20487:4;20361:131;:::i;:::-;20353:139;;20251:248;;;:::o;20505:419::-;20671:4;20709:2;20698:9;20694:18;20686:26;;20758:9;20752:4;20748:20;20744:1;20733:9;20729:17;20722:47;20786:131;20912:4;20786:131;:::i;:::-;20778:139;;20676:248;;;:::o;20930:222::-;21023:4;21061:2;21050:9;21046:18;21038:26;;21074:71;21142:1;21131:9;21127:17;21118:6;21074:71;:::i;:::-;21028:124;;;;:::o;21158:442::-;21307:4;21345:2;21334:9;21330:18;21322:26;;21358:71;21426:1;21415:9;21411:17;21402:6;21358:71;:::i;:::-;21439:72;21507:2;21496:9;21492:18;21483:6;21439:72;:::i;:::-;21521;21589:2;21578:9;21574:18;21565:6;21521:72;:::i;:::-;21312:288;;;;;;:::o;21606:214::-;21695:4;21733:2;21722:9;21718:18;21710:26;;21746:67;21810:1;21799:9;21795:17;21786:6;21746:67;:::i;:::-;21700:120;;;;:::o;21826:129::-;21860:6;21887:20;;:::i;:::-;21877:30;;21916:33;21944:4;21936:6;21916:33;:::i;:::-;21867:88;;;:::o;21961:75::-;21994:6;22027:2;22021:9;22011:19;;22001:35;:::o;22042:308::-;22104:4;22194:18;22186:6;22183:30;22180:2;;;22216:18;;:::i;:::-;22180:2;22254:29;22276:6;22254:29;:::i;:::-;22246:37;;22338:4;22332;22328:15;22320:23;;22109:241;;;:::o;22356:99::-;22408:6;22442:5;22436:12;22426:22;;22415:40;;;:::o;22461:169::-;22545:11;22579:6;22574:3;22567:19;22619:4;22614:3;22610:14;22595:29;;22557:73;;;;:::o;22636:305::-;22676:3;22695:20;22713:1;22695:20;:::i;:::-;22690:25;;22729:20;22747:1;22729:20;:::i;:::-;22724:25;;22883:1;22815:66;22811:74;22808:1;22805:81;22802:2;;;22889:18;;:::i;:::-;22802:2;22933:1;22930;22926:9;22919:16;;22680:261;;;;:::o;22947:185::-;22987:1;23004:20;23022:1;23004:20;:::i;:::-;22999:25;;23038:20;23056:1;23038:20;:::i;:::-;23033:25;;23077:1;23067:2;;23082:18;;:::i;:::-;23067:2;23124:1;23121;23117:9;23112:14;;22989:143;;;;:::o;23138:348::-;23178:7;23201:20;23219:1;23201:20;:::i;:::-;23196:25;;23235:20;23253:1;23235:20;:::i;:::-;23230:25;;23423:1;23355:66;23351:74;23348:1;23345:81;23340:1;23333:9;23326:17;23322:105;23319:2;;;23430:18;;:::i;:::-;23319:2;23478:1;23475;23471:9;23460:20;;23186:300;;;;:::o;23492:191::-;23532:4;23552:20;23570:1;23552:20;:::i;:::-;23547:25;;23586:20;23604:1;23586:20;:::i;:::-;23581:25;;23625:1;23622;23619:8;23616:2;;;23630:18;;:::i;:::-;23616:2;23675:1;23672;23668:9;23660:17;;23537:146;;;;:::o;23689:96::-;23726:7;23755:24;23773:5;23755:24;:::i;:::-;23744:35;;23734:51;;;:::o;23791:90::-;23825:7;23868:5;23861:13;23854:21;23843:32;;23833:48;;;:::o;23887:126::-;23924:7;23964:42;23957:5;23953:54;23942:65;;23932:81;;;:::o;24019:77::-;24056:7;24085:5;24074:16;;24064:32;;;:::o;24102:86::-;24137:7;24177:4;24170:5;24166:16;24155:27;;24145:43;;;:::o;24194:117::-;24250:9;24283:22;24299:5;24283:22;:::i;:::-;24270:35;;24260:51;;;:::o;24317:154::-;24401:6;24396:3;24391;24378:30;24463:1;24454:6;24449:3;24445:16;24438:27;24368:103;;;:::o;24477:307::-;24545:1;24555:113;24569:6;24566:1;24563:13;24555:113;;;24654:1;24649:3;24645:11;24639:18;24635:1;24630:3;24626:11;24619:39;24591:2;24588:1;24584:10;24579:15;;24555:113;;;24686:6;24683:1;24680:13;24677:2;;;24766:1;24757:6;24752:3;24748:16;24741:27;24677:2;24526:258;;;;:::o;24790:320::-;24834:6;24871:1;24865:4;24861:12;24851:22;;24918:1;24912:4;24908:12;24939:18;24929:2;;24995:4;24987:6;24983:17;24973:27;;24929:2;25057;25049:6;25046:14;25026:18;25023:38;25020:2;;;25076:18;;:::i;:::-;25020:2;24841:269;;;;:::o;25116:281::-;25199:27;25221:4;25199:27;:::i;:::-;25191:6;25187:40;25329:6;25317:10;25314:22;25293:18;25281:10;25278:34;25275:62;25272:2;;;25340:18;;:::i;:::-;25272:2;25380:10;25376:2;25369:22;25159:238;;;:::o;25403:180::-;25451:77;25448:1;25441:88;25548:4;25545:1;25538:15;25572:4;25569:1;25562:15;25589:180;25637:77;25634:1;25627:88;25734:4;25731:1;25724:15;25758:4;25755:1;25748:15;25775:180;25823:77;25820:1;25813:88;25920:4;25917:1;25910:15;25944:4;25941:1;25934:15;25961:180;26009:77;26006:1;25999:88;26106:4;26103:1;26096:15;26130:4;26127:1;26120:15;26147:117;26256:1;26253;26246:12;26270:117;26379:1;26376;26369:12;26393:117;26502:1;26499;26492:12;26516:117;26625:1;26622;26615:12;26639:102;26680:6;26731:2;26727:7;26722:2;26715:5;26711:14;26707:28;26697:38;;26687:54;;;:::o;26747:222::-;26887:34;26883:1;26875:6;26871:14;26864:58;26956:5;26951:2;26943:6;26939:15;26932:30;26853:116;:::o;26975:221::-;27115:34;27111:1;27103:6;27099:14;27092:58;27184:4;27179:2;27171:6;27167:15;27160:29;27081:115;:::o;27202:225::-;27342:34;27338:1;27330:6;27326:14;27319:58;27411:8;27406:2;27398:6;27394:15;27387:33;27308:119;:::o;27433:221::-;27573:34;27569:1;27561:6;27557:14;27550:58;27642:4;27637:2;27629:6;27625:15;27618:29;27539:115;:::o;27660:179::-;27800:31;27796:1;27788:6;27784:14;27777:55;27766:73;:::o;27845:225::-;27985:34;27981:1;27973:6;27969:14;27962:58;28054:8;28049:2;28041:6;28037:15;28030:33;27951:119;:::o;28076:233::-;28216:34;28212:1;28204:6;28200:14;28193:58;28285:16;28280:2;28272:6;28268:15;28261:41;28182:127;:::o;28315:182::-;28455:34;28451:1;28443:6;28439:14;28432:58;28421:76;:::o;28503:220::-;28643:34;28639:1;28631:6;28627:14;28620:58;28712:3;28707:2;28699:6;28695:15;28688:28;28609:114;:::o;28729:224::-;28869:34;28865:1;28857:6;28853:14;28846:58;28938:7;28933:2;28925:6;28921:15;28914:32;28835:118;:::o;28959:223::-;29099:34;29095:1;29087:6;29083:14;29076:58;29168:6;29163:2;29155:6;29151:15;29144:31;29065:117;:::o;29188:169::-;29328:21;29324:1;29316:6;29312:14;29305:45;29294:63;:::o;29363:230::-;29503:34;29499:1;29491:6;29487:14;29480:58;29572:13;29567:2;29559:6;29555:15;29548:38;29469:124;:::o;29599:168::-;29739:20;29735:1;29727:6;29723:14;29716:44;29705:62;:::o;29773:171::-;29913:23;29909:1;29901:6;29897:14;29890:47;29879:65;:::o;29950:224::-;30090:34;30086:1;30078:6;30074:14;30067:58;30159:7;30154:2;30146:6;30142:15;30135:32;30056:118;:::o;30180:181::-;30320:33;30316:1;30308:6;30304:14;30297:57;30286:75;:::o;30367:122::-;30440:24;30458:5;30440:24;:::i;:::-;30433:5;30430:35;30420:2;;30479:1;30476;30469:12;30420:2;30410:79;:::o;30495:122::-;30568:24;30586:5;30568:24;:::i;:::-;30561:5;30558:35;30548:2;;30607:1;30604;30597:12;30548:2;30538:79;:::o
Swarm Source
ipfs://02571160a42aa55569939a8569619e61dc306ca9311ac463d1efcc4e19354999
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.