Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Token | 11708935 | 4 days ago | IN | 0 S | 0.01554514 | ||||
Add Token | 11708779 | 4 days ago | IN | 0 S | 0.0164698 | ||||
Remove Token | 11708598 | 4 days ago | IN | 0 S | 0.00388514 | ||||
Add Multiple Tok... | 11708375 | 4 days ago | IN | 0 S | 0.01701018 | ||||
Add Dex | 11708202 | 4 days ago | IN | 0 S | 0.00822156 | ||||
Add Wrapped | 11707844 | 4 days ago | IN | 0 S | 0.00512292 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PegasusAggregator
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./DexManager.sol"; import "./PegasusStaking.sol"; import "./interfaces/IDEXStructs.sol"; import "hardhat/console.sol"; interface IRouter { function WETH() external pure returns (address); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); } // New V3 Router Interface interface IV3Router { struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); function WETH9() external view returns (address); } // New V3 Quoter Interface interface IV3Quoter { function quoteExactInput( bytes memory path, uint256 amountIn ) external returns (uint256 amountOut); function quoteExactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountOut); } interface IWeth { function deposit() external payable; function withdraw(uint256) external; } contract PegasusAggregator is DexManager { //for wrapped natives struct WrappedNatives { string name; address _address; address stableCoin; } //for price and pools struct PoolInfo { address poolAddress; bool isV3; uint256 liquidity; uint24 fee; } //for split quote and swap struct SplitRoute { address dexRouter; uint256 percentage; // Out of 10000 (100.00%) address[] path; // For V2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } struct SplitQuote { SplitRoute[] routes; uint256 totalAmountOut; string[] dexNames; } //for direct swaps and quotes struct Quote { string dexName; address dexRouter; uint256 amountIn; uint256 amountOut; address[] path; //for v2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } // Fee distribution address public teamFeeCollector; bool public distributeFeesToStakers; uint256 private swapFeePercent = 20; // Reference to the staking contract PegasusStaking public stakingContract; //mappings mapping(uint256 => WrappedNatives) public wrappedByChain; // Fee denominator for percentage calculations (100% = 10000) uint256 private constant FEE_DENOMINATOR = 10000; //For very low amounts uint256 public constant MIN_FEE_TO_CONVERT = 0.001 ether; event SwapExecuted(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut, address router, address recipient); constructor() DexManager(msg.sender) { teamFeeCollector = msg.sender; distributeFeesToStakers = false; } // Function to update fee percentage function updateFeePercent(uint256 newFeePercent) external onlyOwner { require(newFeePercent <= 100, "Fee cannot exceed 1%"); // Safety check swapFeePercent = newFeePercent; } //Helper functions function getWrappedNative(uint256 chain) internal view returns (address) { if(wrappedByChain[chain]._address != address(0)) { return wrappedByChain[chain]._address; } return address(0); } function calculateFee(uint256 amount) public view returns (uint256 feeAmount, uint256 finalAmount) { feeAmount = amount * swapFeePercent / FEE_DENOMINATOR; finalAmount = amount - feeAmount; return (feeAmount, finalAmount); } function executeV3Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint24 feeTier, uint256 deadline ) internal returns (uint256) { IV3Router.ExactInputSingleParams memory params = IV3Router.ExactInputSingleParams({ tokenIn: tokenIn, tokenOut: tokenOut, fee: feeTier, recipient: address(this), deadline: deadline, amountIn: amountIn, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 }); try IV3Router(router).exactInputSingle(params) returns (uint256 _amountOut) { return _amountOut; } catch { revert("V3 swap failed"); } } function executeV2Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint256 deadline, address[] memory path ) internal returns (uint256) { require(path.length >= 2, "Invalid path length"); require(path[0] == tokenIn, "First token in path must be tokenIn"); require(path[path.length - 1] == tokenOut, "Last token in path must be tokenOut"); try IRouter(router).swapExactTokensForTokens( amountIn, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { return amounts[amounts.length - 1]; } catch { revert("V2 swap failed"); } } function _processRoute( address actualTokenIn, address actualTokenOut, uint256 routeAmountIn, SplitRoute calldata route, uint256 deadline, bool isNativeOut ) private returns (uint256) { // Approve router IERC20(actualTokenIn).approve(route.dexRouter, routeAmountIn); uint256 routeAmountOut; if (route.isV3) { routeAmountOut = executeV3Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, route.dexRouter, route.feeTier, deadline ); } else { // For V2, handle native output separately if needed if (isNativeOut) { address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; // Use wrapped native for V2 path path = autoPath; } try IRouter(route.dexRouter).swapExactTokensForETH( routeAmountIn, 0, // Minimum output validated at the end path, address(this), deadline ) returns (uint[] memory amounts) { routeAmountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } routeAmountOut = executeV2Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, // Minimum output validated at the end route.dexRouter, deadline, path ); } } return routeAmountOut; } function getQuotes( address tokenIn, address tokenOut, uint256 amount, bool isExactIn, uint256 chain ) internal view returns (Quote[] memory) { Quote[] memory quotes = new Quote[](supportedDexes[chain].length * 3); uint256 validQuotes = 0; for (uint i = 0; i < supportedDexes[chain].length; i++) { if (!supportedDexes[chain][i].active) continue; //account for v3 if(supportedDexes[chain][i].isV3) { IV3Quoter quoter = IV3Quoter(supportedDexes[chain][i].quoter); for (uint j = 0; j < supportedDexes[chain][i].feeTiers.length; j++) { // Encode the function call data bytes memory callData = abi.encodeWithSelector( quoter.quoteExactInputSingle.selector, tokenIn, tokenOut, supportedDexes[chain][i].feeTiers[j], amount, 0 ); // Use low-level staticcall to simulate the function (bool success, bytes memory result) = address(quoter).staticcall(callData); if (success) { uint256 amountOut = abi.decode(result, (uint256)); quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amountOut, path: new address[](0), v3Path: abi.encodePacked(tokenIn, supportedDexes[chain][i].feeTiers[j], tokenOut), isV3: true, feeTier: supportedDexes[chain][i].feeTiers[j] }); validQuotes++; } } } else { // Existing V2 quote logic address WBNB = getWrappedNative(chain); // Try direct path address[] memory path = new address[](2); path[0] = tokenIn; path[1] = tokenOut; // Try WETH path address[] memory wethPath = new address[](3); wethPath[0] = tokenIn; wethPath[1] = WBNB; wethPath[2] = tokenOut; // Try path with stable coin address[] memory stablePath = new address[](3); stablePath[0] = tokenIn; stablePath[1] = wrappedByChain[chain].stableCoin; stablePath[2] = tokenOut; IRouter router = IRouter(supportedDexes[chain][i].routerAddress); try router.getAmountsOut(amount, path) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[1], path: path, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If direct path fails, try through WETH try router.getAmountsOut(amount, wethPath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[2], path: wethPath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If WETH path fails, try reverse WETH path try router.getAmountsOut(amount, stablePath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[2], path: stablePath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch {} } } } } // Resize array to remove empty quotes assembly { mstore(quotes, validQuotes) } return quotes; } //for split quote function getBestSplitQuote( address tokenIn, address tokenOut, uint256 amount, uint256 chain ) public view returns (SplitQuote memory) { // Get all possible quotes first Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, true, chain); require(quotes.length > 0, "No valid quotes found"); // Sort quotes by amountOut in descending order for(uint i = 0; i < quotes.length - 1; i++) { for(uint j = i + 1; j < quotes.length; j++) { if(quotes[j].amountOut > quotes[i].amountOut) { Quote memory temp = quotes[i]; quotes[i] = quotes[j]; quotes[j] = temp; } } } // Start with the best single route uint256 bestTotalOutput = 0; SplitQuote memory bestSplit; // Try different split combinations for(uint i = 0; i < quotes.length; i++) { for(uint j = i + 1; j < quotes.length; j++) { // Try different split ratios (25-75, 50-50, 75-25) uint256[] memory splits = new uint256[](3); splits[0] = 2500; // 25% splits[1] = 5000; // 50% splits[2] = 7500; // 75% for(uint s = 0; s < splits.length; s++) { uint256 amount1 = (amount * splits[s]) / 10000; uint256 amount2 = amount - amount1; // Calculate theoretical output uint256 output1 = (quotes[i].amountOut * splits[s]) / 10000; uint256 output2 = (quotes[j].amountOut * (10000 - splits[s])) / 10000; uint256 totalOutput = output1 + output2; if(totalOutput > bestTotalOutput) { bestTotalOutput = totalOutput; // Update best split bestSplit.routes = new SplitRoute[](2); bestSplit.dexNames = new string[](2); bestSplit.routes[0] = SplitRoute({ dexRouter: quotes[i].dexRouter, percentage: splits[s], path: quotes[i].path, v3Path: quotes[i].v3Path, isV3: quotes[i].isV3, feeTier: quotes[i].feeTier }); bestSplit.routes[1] = SplitRoute({ dexRouter: quotes[j].dexRouter, percentage: 10000 - splits[s], path: quotes[j].path, v3Path: quotes[j].v3Path, isV3: quotes[j].isV3, feeTier: quotes[j].feeTier }); bestSplit.dexNames[0] = quotes[i].dexName; bestSplit.dexNames[1] = quotes[j].dexName; bestSplit.totalAmountOut = totalOutput; } } } } return bestSplit; } //For direct swaps and quotes function getBestQuote( address tokenIn, address tokenOut, uint256 amount, bool isExactIn, uint256 chain ) external view returns (Quote memory) { Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, isExactIn, chain); require(quotes.length > 0, "No valid quotes found"); uint256 bestIndex = 0; uint256 bestAmount = isExactIn ? 0 : type(uint256).max; for (uint i = 0; i < quotes.length; i++) { if (isExactIn) { if (quotes[i].amountOut > bestAmount) { bestAmount = quotes[i].amountOut; bestIndex = i; } } else { if (quotes[i].amountIn < bestAmount) { bestAmount = quotes[i].amountIn; bestIndex = i; } } } return quotes[bestIndex]; } // for direct swaps function executeSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, address recipient, uint256 deadline, uint24 feeTier, uint256 minFee, address[] memory path, uint256 chain ) external payable returns (uint256) { require(recipient != address(0), "Invalid recipient"); if(tokenIn == address(0) || tokenOut == address(0)) { require(!(path[0] == address(0) && path[1] == address(0)), "Invalid path"); } address wrappedNative = getWrappedNative(chain); require(wrappedNative != address(0), "Wrapped native not set"); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "amount must be greater than zero"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); // Approve router to spend tokens IERC20(actualTokenIn).approve(router, amountIn); } uint256 amountOut; //account for v3 if(isV3Router[router]) { amountOut = executeV3Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, feeTier, deadline ); } else { // For V2, ensure proper path if (path[0] == address(0) || path[1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } if (isNativeIn) { // Already converted to wrapped native, so use regular token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } else if (isNativeOut) { try IRouter(router).swapExactTokensForETH( swapAmount, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { amountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } } // Calculate fee (uint256 feeAmount, uint256 finalAmount) = calculateFee(amountOut); // handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, router, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // Convert wrapped native to native and send if (isV3Router[router]) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); } // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, router, recipient ); return amountOut; } //for split swaps function executeSplitSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, SplitRoute[] calldata routes, address recipient, uint256 deadline, uint256 minFee, uint256 chain ) external payable returns (uint256) { require(routes.length > 0, "No routes provided"); require(recipient != address(0), "Invalid recipient"); address wrappedNative = getWrappedNative(chain); require(wrappedNative != address(0), "Wrapped native not set"); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "Zero amount"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); } // Process all routes and track total output uint256 totalAmountOut; console.log(11, totalAmountOut); for(uint i = 0; i < routes.length; i++) { uint256 routeAmountIn = (swapAmount * routes[i].percentage) / 10000; totalAmountOut += _processRoute( actualTokenIn, actualTokenOut, routeAmountIn, routes[i], deadline, isNativeOut ); } require(totalAmountOut >= minAmountOut, "Insufficient output amount"); // Calculate and handle fees (uint256 feeAmount, uint256 finalAmount) = calculateFee(totalAmountOut); handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, routes[0].dexRouter, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, address(0), // No specific router for split swaps recipient ); return totalAmountOut; } //Fee distribution handling function handleFeeDistribution(uint feeAmount, address WBNB, address tokenOut, address router, uint deadline, uint256 minFeeRequired, bool isNativeOut) internal { // Handle fees based on minimum conversion amount if (distributeFeesToStakers && address(stakingContract) != address(0)) { if (tokenOut != WBNB) { if (feeAmount >= minFeeRequired) { // Convert fees to Native token address[] memory feePath = new address[](2); feePath[0] = tokenOut; feePath[1] = WBNB; //get current contract balance uint256 balanceBefore = address(this).balance; IERC20(tokenOut).approve(router, feeAmount); IRouter(router).swapExactTokensForETH( feeAmount, 0, feePath, address(this), deadline); uint256 receivedBNB = address(this).balance - balanceBefore; // Update rewards only if conversion happened if (receivedBNB > 0) { stakingContract.distributeRewards{value: receivedBNB}(); } } else { // If fee is too small, send to team instead IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } else { // Handle WBNB fees if (feeAmount >= MIN_FEE_TO_CONVERT) { IWeth(WBNB).withdraw(feeAmount); stakingContract.distributeRewards{value: feeAmount}(); } else { // If fee is too small, send to team IERC20(WBNB).transfer(teamFeeCollector, feeAmount); } } } else { if(isNativeOut) { (bool success, ) = payable(teamFeeCollector).call{value: feeAmount}(""); require(success, "Native transfer failed"); } else { // If staking is disabled, send fees to team (automate by converting to bnb before sending to team) IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } } // Admin update functions and helper functions function setFeeDistributionMode(bool _distributeToStakers) external onlyOwner { distributeFeesToStakers = _distributeToStakers; } // Set the staking contract function setStakingContract(address _stakingContract) external onlyOwner { require(_stakingContract != address(0), "Invalid staking contract"); stakingContract = PegasusStaking(payable(_stakingContract)); } function setTeamFeeCollector(address _collector) external onlyOwner { require(_collector != address(0), "Invalid address"); teamFeeCollector = _collector; } function getADex(address _dexRouter, uint256 chain) internal view returns (IDEXStructs.DEX memory) { require(_dexRouter != address(0), "Invalid router address"); for (uint256 i = 0; i < supportedDexes[chain].length; i++) { if (supportedDexes[chain][i].routerAddress == _dexRouter) { return supportedDexes[chain][i]; } } revert("DEX not found"); } //For wrapped function addWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain] = WrappedNatives(name, _address, stable); } function updateWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain].name = name; wrappedByChain[chain]._address = _address; wrappedByChain[chain].stableCoin = stable; } // Emergency functions function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } function updateOwner(address newOwner) external onlyOwner { transferOwnership(newOwner); } // Allow contract to receive BNB receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "./interfaces/IDEXStructs.sol"; import "./TokenManager.sol"; contract DexManager is TokenManager { mapping(uint256 => IDEXStructs.DEX[]) public supportedDexes; // chainId => DEX[] mapping(address => bool) public isV3Router; // check if a dex is v3 event DexAdded(string indexed name, address indexed router, uint256 indexed chainId); event DexUpdated(uint256 indexed index, string indexed name, uint256 indexed chainId); event DexRemoved(string indexed name, uint256 indexed chainId); constructor(address _someAddress) TokenManager(_someAddress) {} function addDex( string calldata name, address router, address factory, bool isV3, address quoter, uint24[] calldata feeTiers, uint256 chain ) external onlyOwner { require(router != address(0), "Invalid router address"); if (isV3) { require(quoter != address(0), "Invalid quoter address"); require(feeTiers.length > 0, "Must provide fee tiers"); } supportedDexes[chain].push(IDEXStructs.DEX({ name: name, routerAddress: router, factory: factory, active: true, isV3: isV3, quoter: quoter, feeTiers: feeTiers })); isV3Router[router] = isV3; emit DexAdded(name, router, chain); } function removeDex(string calldata name, uint256 chain) external onlyOwner { bytes32 nameHash = keccak256(bytes(name)); IDEXStructs.DEX[] storage dexes = supportedDexes[chain]; for (uint i = 0; i < dexes.length; i++) { if (keccak256(bytes(dexes[i].name)) == nameHash) { address routerToRemove = dexes[i].routerAddress; dexes[i] = dexes[dexes.length - 1]; dexes.pop(); isV3Router[routerToRemove] = false; emit DexRemoved(name, chain); return; } } revert("DEX not found"); } function getDexes(uint256 chain) external view returns (IDEXStructs.DEX[] memory) { return supportedDexes[chain]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; interface IDEXStructs { struct DEX { string name; address routerAddress; address factory; bool active; bool isV3; address quoter; uint24[] feeTiers; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "hardhat/console.sol"; contract PegasusStaking is Ownable { // Staking token (likely Pegasus token) IERC20 public stakingToken; // Total staked amount uint256 public totalStaked; // Accumulated reward per share uint256 public accRewardPerShare; // Precision for reward calculations uint256 private constant REWARD_PRECISION = 1e12; // Staker information struct Staker { uint256 stakedAmount; uint256 rewardDebt; uint256 unclaimedRewards; } // Mapping of staker address to their information mapping(address => Staker) public stakers; // PegasusAggregator contract address (rewards source) address public aggregator; // Events event Staked(address indexed user, uint256 amount); event Unstaked(address indexed user, uint256 amount); event RewardClaimed(address indexed user, uint256 amount); event RewardDistributed(uint256 indexed amount); // Modifier to restrict functions to the aggregator contract modifier onlyAggregator() { require(msg.sender == aggregator, "Only aggregator can call"); _; } constructor(address _stakingToken) Ownable(msg.sender) { require(_stakingToken != address(0), "Invalid staking token"); stakingToken = IERC20(_stakingToken); accRewardPerShare = 0; } // Set the aggregator contract address function setAggregator(address _aggregator) external onlyOwner { require(_aggregator != address(0), "Invalid aggregator address"); aggregator = _aggregator; } // Update reward for a specific user function updateReward(address user) internal { if (totalStaked > 0) { Staker storage staker = stakers[user]; uint256 pending = (staker.stakedAmount * accRewardPerShare / REWARD_PRECISION) - staker.rewardDebt; staker.unclaimedRewards += pending; staker.rewardDebt = (staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION; } } // Stake tokens function stake(uint256 amount) external { require(amount > 0, "Cannot stake 0"); // Update rewards before changing stake updateReward(msg.sender); // Transfer tokens from sender to contract stakingToken.transferFrom(msg.sender, address(this), amount); // Update staker information stakers[msg.sender].stakedAmount += amount; totalStaked += amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; emit Staked(msg.sender, amount); } // Unstake tokens function unstake(uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(stakers[msg.sender].stakedAmount >= amount, "Insufficient stake"); // Update rewards before changing stake updateReward(msg.sender); // Update staker information stakers[msg.sender].stakedAmount -= amount; totalStaked -= amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; // Transfer tokens back to user stakingToken.transfer(msg.sender, amount); emit Unstaked(msg.sender, amount); } // Claim rewards function claimReward() external { updateReward(msg.sender); uint256 reward = stakers[msg.sender].unclaimedRewards; if (reward > 0) { stakers[msg.sender].unclaimedRewards = 0; // Transfer native rewards (bool success, ) = msg.sender.call{value: reward}(""); require(success, "Native transfer failed"); emit RewardClaimed(msg.sender, reward); } } // Distribute rewards (called by aggregator) function distributeRewards() external payable onlyAggregator { require(totalStaked > 0, "No stakers"); if (msg.value > 0) { // Update accumulated reward per share accRewardPerShare += (msg.value * REWARD_PRECISION) / totalStaked; emit RewardDistributed(msg.value); } } // Get pending rewards for a staker function getPendingRewards(address _staker) external view returns (uint256) { Staker storage staker = stakers[_staker]; if (totalStaked == 0) { return staker.unclaimedRewards; } uint256 pending = ((staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION) - staker.rewardDebt; return staker.unclaimedRewards + pending; } // Get staker information function getStakerInfo(address _staker) external view returns ( uint256 stakedAmount, uint256 rewardDebt, uint256 unclaimedRewards ) { Staker storage staker = stakers[_staker]; return (staker.stakedAmount, staker.rewardDebt, staker.unclaimedRewards); } // Emergency function to rescue tokens function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } // Emergency function to rescue ETH/BNB function rescueETH(address payable to, uint256 amount) external onlyOwner { require(address(this).balance >= amount, "Insufficient balance"); (bool success, ) = to.call{value: amount}(""); require(success, "ETH transfer failed"); } // Allow contract to receive native currency receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/access/Ownable.sol"; contract TokenManager is Ownable { struct Token { string symbol; string name; address tokenAddress; uint8 decimals; uint256 chainId; string logouri; bool active; } mapping(uint256 => Token[]) public tokensByChain; // chainId => Token[] mapping(address => bool) public isSupportedToken; // shows that a token is supported event TokenAdded(string indexed symbol, address indexed tokenAddress, uint256 indexed chainId); event TokenRemoved(address indexed tokenAddress, uint256 indexed chainId); event TokenUpdated(string indexed symbol, address indexed tokenAddress, uint256 indexed chainId); event MultipleTokensAdded(uint256 indexed count, uint256 indexed chainId); constructor(address _someAddress) Ownable(_someAddress) {} function addToken( string calldata symbol, string calldata name, address tokenAddress, uint8 decimals, uint256 chainId, string calldata logoUri ) external onlyOwner { _addSingleToken( Token({ symbol: symbol, name: name, tokenAddress: tokenAddress, decimals: decimals, chainId: chainId, logouri: logoUri, active: true }) ); } function _addSingleToken(Token memory newToken) private { require(!isSupportedToken[newToken.tokenAddress], "Token already exists"); tokensByChain[newToken.chainId].push(newToken); isSupportedToken[newToken.tokenAddress] = true; emit TokenAdded(newToken.symbol, newToken.tokenAddress, newToken.chainId); } function addMultipleTokens( Token[] calldata tokens ) external onlyOwner { require(tokens.length > 0, "No tokens provided"); uint256 addedCount = 0; uint256 chainId = tokens[0].chainId; for (uint256 i = 0; i < tokens.length; i++) { if (isSupportedToken[tokens[i].tokenAddress] || tokens[i].tokenAddress == address(0)) { continue; } tokensByChain[tokens[i].chainId].push(tokens[i]); isSupportedToken[tokens[i].tokenAddress] = true; addedCount++; emit TokenAdded(tokens[i].symbol, tokens[i].tokenAddress, tokens[i].chainId); } if (addedCount > 0) { emit MultipleTokensAdded(addedCount, chainId); } } function removeToken(address tokenAddress, uint256 chainId) external onlyOwner { require(isSupportedToken[tokenAddress], "Token not found"); Token[] storage tokens = tokensByChain[chainId]; for (uint i = 0; i < tokens.length; i++) { if (tokens[i].tokenAddress == tokenAddress) { tokens[i] = tokens[tokens.length - 1]; tokens.pop(); isSupportedToken[tokenAddress] = false; emit TokenRemoved(tokenAddress, chainId); break; } } } function getAllTokens(uint256 chainId) external view returns (Token[] memory) { return tokensByChain[chainId]; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _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 pure { _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 pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"DexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"MultipleTokensAdded","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":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"SwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MIN_FEE_TO_CONVERT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"tokens","type":"tuple[]"}],"name":"addMultipleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logoUri","type":"string"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"addWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"finalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeFeesToStakers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"executeSplitSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"feeTier","type":"uint24"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getAllTokens","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isExactIn","type":"bool"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getBestQuote","outputs":[{"components":[{"internalType":"string","name":"dexName","type":"string"},{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.Quote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getBestSplitQuote","outputs":[{"components":[{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"string[]","name":"dexNames","type":"string[]"}],"internalType":"struct PegasusAggregator.SplitQuote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getDexes","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"}],"internalType":"struct IDEXStructs.DEX[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupportedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isV3Router","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_distributeToStakers","type":"bool"}],"name":"setFeeDistributionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collector","type":"address"}],"name":"setTeamFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract PegasusStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedDexes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensByChain","outputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeePercent","type":"uint256"}],"name":"updateFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"updateWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedByChain","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stableCoin","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608080604052346093573315607d5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36014600655600580546001600160a81b0319163360ff60a01b1916179055615c2a90816100998239f35b631e4fbdf760e01b600052600060045260246000fd5b600080fdfe60806040526004361015610010575b005b60003560e01c806303a56b321461021057806313baf1e61461020b5780632182e46714610206578063240028e8146102015780632688807c146101fc5780634c984d38146101f757806359e63b23146101f25780635bc4e0ec146101ed5780635f524ea3146101e85780636c96b2bf146101e3578063715018a6146101de57806381ee0715146101d957806384b06bc0146101d4578063880cdc31146101cf5780638cf106e1146101ca5780638da5cb5b146101c557806399a5d747146101c05780639dd373b9146101bb5780639ed12c31146101b6578063a7d87c0e146101b1578063b0fa3694146101ac578063b24266cb146101a7578063b26baa5f146101a2578063b5d52d1a1461019d578063ba14713214610198578063cc21392e14610193578063cea9d26f1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063f71918771461017a5763fa972c660361000e57611f5c565b611e54565b611db7565b611d52565b611d29565b611c8a565b611b8b565b611a99565b611a70565b6118ca565b611783565b611673565b61159b565b611564565b6114da565b6114ac565b611483565b611441565b6113e6565b61135f565b61129b565b611254565b6111c4565b611096565b610f28565b610de0565b610c52565b610859565b61069e565b6105cf565b610493565b610411565b6000526001602052604060002090565b6000526008602052604060002090565b6000526003602052604060002090565b90600182811c92168015610275575b602083101461025f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610254565b600052602060002090565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b038211176102bb57604052565b61028a565b606081019081106001600160401b038211176102bb57604052565b60c081019081106001600160401b038211176102bb57604052565b601f909101601f19168101906001600160401b038211908210176102bb57604052565b906040519182600082549261032d84610245565b808452936001811690811561039b5750600114610354575b50610352925003836102f6565b565b90506000929192526020600020906000915b81831061037f5750509060206103529282010138610345565b6020919350806001915483858901015201910190918492610366565b90506020925061035294915060ff191682840152151560051b82010138610345565b6001600160a01b031690565b60005b8381106103dc5750506000910152565b81810151838201526020016103cc565b90602091610405815180928185528580860191016103c9565b601f01601f1916010190565b3461047d57602036600319011261047d57600435600052600860205261046e604060002061043e81610319565b60018201546002909201546040516060808252909485946001600160a01b039081169493169290918501906103ec565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361047d57565b3461047d57604036600319011261047d576004356104b081610482565b602435906104bc6142bb565b6001600160a01b0381166000818152600260205260409020546104e19060ff16611fec565b6104ea83610215565b9160005b83548082101561000e57836105038387611ede565b50600201546001600160a01b039061051a906103bd565b161461052957506001016104ee565b610570939461055c610566949361055661054e61054861056196612040565b85611ede565b509184611ede565b90612225565b61234a565b61066a565b805460ff19169055565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e600080a3005b9181601f8401121561047d578235916001600160401b03831161047d576020838186019501011161047d57565b60ff81160361047d57565b3461047d5760c036600319011261047d576004356001600160401b03811161047d576105ff903690600401610597565b6024356001600160401b03811161047d5761061e903690600401610597565b60449391933561062d81610482565b6064359061063a826105c4565b60a4359560843593906001600160401b03881161047d5761066261000e983690600401610597565b9790966123a1565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461047d57602036600319011261047d576004356106bb81610482565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b906020808351928381520192019060005b8181106106fe5750505090565b82516001600160a01b03168452602093840193909201916001016106f1565b9080602083519182815201916020808360051b8301019401926000915b83831061074957505050505090565b9091929394602080610767600193601f1986820301875289516103ec565b9701930193019193929061073a565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b8282106107da57505050509260408460206107d795960151828401520151906060601f198285030191015261071d565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610838610826604087015160c0604088015260c08701906106e0565b606087015186820360608801526103ec565b946080810151151560808601520151169101529701920192019092916107a7565b3461047d57608036600319011261047d5760043561087681610482565b6108a36024359161088683610482565b604435809361089460643590565b9261089d6124a3565b5061458e565b6108af815115156124c3565b60005b6108bc8251612040565b811015610952576108cc81612507565b8251811015610949578060606108e46001938661254f565b51015160606108f3858761254f565b51015110610902575b016108cc565b61090c838561254f565b51610917828661254f565b51610922858761254f565b5261092d848661254f565b50610938828661254f565b52610943818561254f565b506108fc565b506001016108b2565b5060009061095e6124a3565b906000905b8051821015610c405761097582612507565b8151811015610c3557610986612563565b926109c461099385612522565b526113886109a08561252f565b52611d4c6109ad8561253f565b5260005b8451811015610c2a576109e26109dc6109d46109cd848961254f565b518b6122d7565b612710900490565b89612064565b50610a40610a0c6109d460606109f8868961254f565b510151610a05858a61254f565b51906122d7565b610a3a6109d46060610a1e888a61254f565b510151610a34610a2e878c61254f565b51612054565b906122d7565b90612515565b878111610a51575b506001016109b1565b965086610a5c612585565b8752610a66612600565b60408801908152610a77848761254f565b5160200151610a85906103bd565b610a8f848961254f565b51610a9a868961254f565b5160800151610aa9878a61254f565b5160a00151610ab8888b61254f565b5160c00151151591610aca898c61254f565b5160e0015162ffffff1693610add610fba565b95610ae89087612494565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610b1482612522565b52610b1e90612522565b50610b29858761254f565b51602001610b369061263b565b610b40848961254f565b51610b4a90612054565b610b54878961254f565b5160800151610b63888a61254f565b5160a00151610b72898b61254f565b5160c00151151591610b848a8c61254f565b5160e0015162ffffff1693610b97610fba565b95610ba29087612494565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610bce8261252f565b52610bd89061252f565b50610be3848761254f565b5151815190610bf182612522565b52610bfb90612522565b50610c06858761254f565b5151905190610c148261252f565b52610c1e9061252f565b50602087015238610a48565b509250600101610975565b509060010190610963565b60405180610c4e8582610776565b0390f35b3461047d57602036600319011261047d57600435610c6f81610482565b610c776142bb565b6001600160a01b03168015610c9c57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b818110610cf15750505090565b825162ffffff16845260209384019390920191600101610ce4565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610d3f57505050505090565b9091929394602080610dd1600193603f1986820301875289519060c0610d6e835160e0845260e08401906103ec565b92878060a01b03868201511686840152878060a01b036040820151166040840152606081015115156060840152610dae6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152610cd3565b97019301930191939290610d30565b3461047d57602036600319011261047d57600435600052600360205260406000208054610e0c816112d7565b91610e1a60405193846102f6565b818352602083019060005260206000206000915b838310610e435760405180610c4e8782610d0c565b60056020600192604051610e56816102a0565b610e5f86610319565b8152848060a01b03858701541683820152610eb6610ead6002880154610e90610e87826103bd565b60408601612494565b610ea460a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b610ecf610ec660038801546103bd565b60a08301612494565b610edb60048701612648565b60c0820152815201920192019190610e2e565b8015150361047d57565b9181601f8401121561047d578235916001600160401b03831161047d576020808501948460051b01011161047d57565b3461047d5760e036600319011261047d576004356001600160401b03811161047d57610f58903690600401610597565b90602435610f6581610482565b60443592610f7284610482565b606435610f7e81610eee565b60843590610f8b82610482565b60a435956001600160401b03871161047d57610fae61000e973690600401610ef8565b95909460c43597612881565b6040519061035260c0836102f6565b6040519061035260e0836102f6565b60405190610352610100836102f6565b6001600160401b0381116102bb57601f01601f191660200190565b92919261100f82610fe8565b9161101d60405193846102f6565b82948184528183011161047d578281602093846000960137010152565b608060031982011261047d57600435906001600160401b03821161047d578060238301121561047d5781602461107593600401359101611003565b9060243561108281610482565b9060443561108f81610482565b9060643590565b3461047d576110a43661103a565b926110b09291926142bb565b6110c46001600160a01b0383161515612e46565b6000848152600860205260409020815190916001600160401b0382116102bb576110f8826110f28554610245565b8561209e565b602090601f831160011461114e57936111389361112a8461000e999561113e95600299600092611143575b50506120e3565b90555b600161113884610225565b016121cf565b610225565b015190503880611123565b601f198316919061115e8561027f565b9260005b8181106111ac57508461113e9460029894611138989461000e9c9860019510611193575b505050811b01905561112d565b015160001960f88460031b161c19169055388080611186565b92936020600181928786015181550195019301611162565b61012036600319011261047d576004356111dd81610482565b602435906111ea82610482565b6064359160843591906044356001600160401b03841161047d57610c4e94611219611239953690600401610ef8565b9060a4359261122784610482565b60c4359460e4359661010435986131d0565b6040519081529081906020820190565b600091031261047d57565b3461047d57600036600319011261047d5761126d6142bb565b600080546001600160a01b0319811682556001600160a01b0316600080516020615bb58339815191528280a3005b3461047d57600036600319011261047d57602060405166038d7ea4c680008152f35b62ffffff81160361047d57565b60e43590610352826112bd565b6001600160401b0381116102bb5760051b60200190565b9291906112fa816112d7565b9361130860405195866102f6565b602085838152019160051b810192831161047d57905b82821061132a57505050565b60208091833561133981610482565b81520191019061131e565b9080601f8301121561047d578160206107d7933591016112ee565b61016036600319011261047d5760043561137881610482565b60243561138481610482565b604435916064359160843561139881610482565b60a4356113a481610482565b60c435906113b06112ca565b61012435969093906001600160401b03881161047d57610c4e986113db611239993690600401611344565b96610144359861376d565b3461047d57602036600319011261047d5760043561140381610482565b61140b6142bb565b6114136142bb565b6001600160a01b0381161561142b5761000e90615739565b631e4fbdf760e01b600052600060045260246000fd5b3461047d57602036600319011261047d5760043561145e81610482565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b3461047d57600036600319011261047d576000546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d576114c8600435613cc9565b60408051928352602083019190915290f35b3461047d57602036600319011261047d576004356114f781610482565b6114ff6142bb565b6001600160a01b0316801561152457600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461047d57602036600319011261047d5761159660043561158481610eee565b61158c6142bb565b15156005546121ee565b600555005b3461047d57604036600319011261047d576004356001600160401b03811161047d576115ce61000e913690600401610597565b602435916115da6142bb565b613e80565b6107d7906020815261010060e061165b61164561160887518560208801526101208701906103ec565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a08801526106e0565b60a0870151858203601f190160c08701526103ec565b60c086015115158483015294015162ffffff16910152565b3461047d5760a036600319011261047d5760043561169081610482565b6116c5602435916116a083610482565b604435926064359384916116b383610eee565b608435936116bf613f85565b50614b55565b906116d2825115156124c3565b600090801561177b57815b90825b8451811015611761578115611729578260606116fc838861254f565b5101511161170f575b6001905b016116e0565b92509050606061171f838561254f565b5101519082611705565b826040611736838861254f565b51015110611747575b600190611709565b925090506040611757838561254f565b510151908261173f565b610c4e61176e858761254f565b51604051918291826115df565b6000196116dd565b3461047d576117913661103a565b929161179b6142bb565b6001600160a01b0316926117b0841515612e46565b604051926117bd846102c0565b835260208301938452604083019160018060a01b0316825260005260086020526040600020915192835160018060401b0381116102bb57611808816118028654610245565b8661209e565b6020601f82116001146118535761184361184c9361183a846002979561183d9561000e9b6000926111435750506120e3565b87555b516103bd565b600186016121cf565b91016121cf565b601f198216956118628661027f565b9660005b8181106118b257509360018461000e9961183d956118439560029a9861184c9a10611899575b505050811b01875561183d565b015160001960f88460031b161c1916905538808061188c565b83830151895560019098019760209384019301611866565b3461047d57602036600319011261047d576004356001600160401b03811161047d576118fa903690600401610ef8565b6119026142bb565b61190d811515613fd6565b600090608061191c8285614017565b01359282915b80831061195a575050508061193357005b7f12ee4d3ca844fd5718529d46d685ee6b4112a6e0193c4a15b1564877c182d522600080a3005b9091926119806119796105616040611973888789614032565b01613121565b5460ff1690565b8015611a50575b611a47576119e46001916119bc6119ab60806119a489888a614032565b0135610215565b6119b6888789614032565b90614148565b6119df6119d261056160406119738a898b614032565b805460ff19166001179055565b6142ac565b936119f96119f3828587614032565b80614054565b611a22611a0c604061197386898b614032565b916080611a1a86898b614032565b013593612e31565b90848060a01b031690600080516020615b95833981519152600080a45b019190611922565b92600190611a3f565b506001600160a01b03611a696040611973878688614032565b1615611987565b3461047d57600036600319011261047d576005546040516001600160a01b039091168152602090f35b3461047d57600036600319011261047d57602060ff60055460a01c166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310611af257505050505090565b9091929394602080600192603f19858203018652611b7c89519160c080611b72611b38611b28875160e0875260e08701906103ec565b888801518682038a8801526103ec565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a08701526103ec565b9401511515910152565b97019301930191939290611ae3565b3461047d57602036600319011261047d57600435600052600160205260406000208054611bb7816112d7565b91611bc560405193846102f6565b818352602083019060005260206000206000915b838310611bee5760405180610c4e8782611abf565b60066020600192604051611c01816102a0565b611c0a86610319565b8152611c17858701610319565b83820152611c47611c3d6002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b60038601546080820152611c5d60048701610319565b60a0820152611c7c611c73600588015460ff1690565b151560c0830152565b815201920192019190611bd9565b3461047d57606036600319011261047d57611ce36020600435611cac81610482565b60243590611cb982610482565b60443591611cc56142bb565b600060405180968195829463a9059cbb60e01b84526004840161312b565b03926001600160a01b03165af18015611d2457611cfc57005b61000e9060203d602011611d1d575b611d1581836102f6565b810190613058565b503d611d0b565b61308f565b3461047d57600036600319011261047d576007546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d57600435611d6e6142bb565b60648111611d7b57600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b3461047d57602036600319011261047d5760043561140b81610482565b634e487b7160e01b600052603260045260246000fd5b8054821015611e06576000526005602060002091020190600090565b611dd4565b9491969592611e2560a0959260c0885260c08801906103ec565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461047d57604036600319011261047d57600435602435906000526003602052604060002090815481101561047d57611e8c91611dea565b50611e9681610319565b60018201546002830154600390930154604051938493610c4e936001600160a01b039384169360a884901c60ff9081169460a081901c90911693908216929091169087611e0b565b8054821015611e06576000526006602060002091020190600090565b9591611f5494611f2c60ff92611f1e60c099959c9b9c60e08c5260e08c01906103ec565b908a820360208c01526103ec565b6001600160a01b039095166040890152166060870152608086015284820360a08601526103ec565b931515910152565b3461047d57604036600319011261047d57600435602435906000526001602052604060002090815481101561047d57611f9491611ede565b50611f9e81610319565b90610c4e611fae60018301610319565b91600281015490600381015460ff6005611fca60048501610319565b930154169260405196879660ff8360a01c169260018060a01b03169188611efa565b15611ff357565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161204f57565b61202a565b6127100390612710821161204f57565b9190820391821161204f57565b634e487b7160e01b600052600060045260246000fd5b818110612092575050565b60008155600101612087565b9190601f81116120ad57505050565b610352926000526020600020906020601f840160051c830193106120d9575b601f0160051c0190612087565b90915081906120cc565b8160011b916000199060031b1c19161790565b9190918281146121ca5761210a8354610245565b6001600160401b0381116102bb5761212c816121268454610245565b8461209e565b600093601f821160011461215f5761215092939482916000926121545750506120e3565b9055565b015490503880611123565b61216d601f1983169161027f565b946121778461027f565b91815b8181106121b257509583600195969710612199575b505050811b019055565b015460001960f88460031b161c1916905538808061218f565b9192600180602092868b01548155019401920161217a565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612150911682546121ee565b9060ff801983541691151516179055565b906122a657818103612235575050565b600560ff818461224861035296866120f6565b61225860018201600187016120f6565b61228260028601846002840161227760018060a01b03825416846121cf565b5460a01c1690612205565b6003810154600386015561229c60048201600487016120f6565b0154169101612214565b612071565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561204f57565b8181029291811591840414171561204f57565b6122f48154610245565b90816122fe575050565b81601f60009311600114612310575055565b8183526020832061232c91601f0160051c810190600101612087565b808252602082209081548360011b9084198560031b1c191617905555565b8054801561239c5760001901906123618282611ede565b6122a6576005816123736000936122ea565b61237f600182016122ea565b826002820155826003820155612397600482016122ea565b015555565b6122ab565b61246b956123e161247398999461240d966123d860ff959d96999d6123c46142bb565b6040519a6123d18c6102a0565b3691611003565b89523691611003565b60208701526001600160a01b039099166040860190815298166060850152608084019687523691611003565b60a0820152600160c082015284516001600160a01b03166000908152600260205260409020546124409060ff16156142e4565b6124538161244e8651610215565b614327565b6124636119d261056187516103bd565b5193516103bd565b915192614469565b6001600160a01b0390911690600080516020615b95833981519152600080a4565b6001600160a01b039091169052565b604051906124b0826102c0565b6060604083828152600060208201520152565b156124ca57565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161204f57565b9190820180921161204f57565b805115611e065760200190565b805160011015611e065760400190565b805160021015611e065760600190565b8051821015611e065760209160051b010190565b6040516080919061257483826102f6565b6003815291601f1901366020840137565b61258f60026112d7565b9061259d60405192836102f6565b6002825281601f196125af60026112d7565b019060005b8281106125c057505050565b6020906040516125cf816102db565b600081526000838201526060604082015260608082015260006080820152600060a0820152828285010152016125b4565b6040516060919061261183826102f6565b6002815291601f19018260005b82811061262a57505050565b80606060208093850101520161261e565b516001600160a01b031690565b60405181548082529092918390612662602083019161027f565b926000905b8060098301106127c6576103529454918181106127b0575b818110612796575b81811061277c575b818110612762575b818110612748575b81811061272e575b818110612714575b8181106126fa575b8181106126e0575b106126cd575b5003836102f6565b60d81c62ffffff168152602001386126c5565b60c083901c62ffffff1684529260019060200193016126bf565b60a883901c62ffffff1684529260019060200193016126b7565b609083901c62ffffff1684529260019060200193016126af565b607883901c62ffffff1684529260019060200193016126a7565b606083901c62ffffff16845292600190602001930161269f565b604883901c62ffffff168452926001906020019301612697565b603083901c62ffffff16845292600190602001930161268f565b601883901c62ffffff168452926001906020019301612687565b62ffffff8316845292600190602001930161267f565b91600a91935061014060019161287387546127ea8362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391612667565b9391969596949290946128926142bb565b6001600160a01b0381169789908790879086906128b08d1515612985565b61293a9b61291a6129359a6129026129309a6128ea6128d961292b9b6129219961296157610235565b986128e2610fc9565b9a3691611003565b89526128f98b60208b01612494565b60408901612494565b600160608801528a1515608088015260a08701612494565b3691612a54565b60c0830152612cc1565b610684565b612214565b612e31565b7fa996cb2fb76f06529d6a56403f6ae3a1669ece05b5e092b2960759b229f520d1600080a4565b6129756001600160a01b03871615156129ca565b612980881515612a0f565b610235565b1561298c57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b156129d157565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15612a1657565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190612a60816112d7565b93612a6e60405195866102f6565b602085838152019160051b810192831161047d57905b828210612a9057505050565b602080918335612a9f816112bd565b815201910190612a84565b81519192916001600160401b0381116102bb57612acb816121268454610245565b6020601f8211600114612aee5781906121509394956000926111435750506120e3565b601f19821690612afd8461027f565b9160005b818110612b3857509583600195969710612b1f57505050811b019055565b015160001960f88460031b161c1916905538808061218f565b9192602060018192868b015181550194019201612b01565b9061215090151582546121ee565b90600160401b81116102bb578154818355808210612b7b57505050565b61035292600052600a60096020600020926003838084880104860196060280612ba9575b5001040190612087565b6000198601908154906000199060200360031b1c16905538612b9f565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b0382116102bb576020612c1291612c0b8486612b5e565b019261027f565b600a82049160005b838110612c7d5750600a8302900380612c34575b50505050565b9260009360005b818110612c5057505050015538808080612c2e565b9091946020612c73600192612c68895162ffffff1690565b908560030290612bd3565b9601929101612c3b565b6000805b600a8110612c96575083820155600101612c1a565b95906020612cb8600192612cad855162ffffff1690565b908a60030290612bd3565b92019601612c81565b8054919291600160401b8110156102bb57612ce191600182018155611dea565b6122a657825180519093906001600160401b0381116102bb57612d08816110f28554610245565b6020601f8211600114612dc15791612d338260c09360049561035298996000926111435750506120e3565b84555b612d4661184360208301516103bd565b612d9f60028501612d63612d5d60408501516103bd565b826121cf565b612d79612d736060850151151590565b82612b50565b608083015115155b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612db8612daf60a08301516103bd565b600386016121cf565b01519101612be9565b601f19821695612dd08561027f565b9660005b818110612e195750926103529697600495936001938360c09710612e00575b505050811b018455612d36565b015160001960f88460031b161c19169055388080612df3565b83830151895560019098019760209384019301612dd4565b81604051928392833781016000815203902090565b15612e4d57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15612e8757565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15612ec857565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b15612f0857565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b15612f4d57565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b15612f9857565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b15612fde57565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561302557565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b9081602091031261047d57516107d781610eee565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b9015611e065780359060be198136030182121561047d570190565b9190811015611e065760051b8101359060be198136030182121561047d570190565b156130df57565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b356107d781610482565b6001600160a01b039091168152602081019190915260400190565b604051906131556020836102f6565b60008252565b3d15613186573d9061316c82610fe8565b9161317a60405193846102f6565b82523d6000602084013e565b606090565b1561319257565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b91969861320290989593919694986131e9851515612e80565b6131fd6001600160a01b0387161515612ec1565b6150d8565b976132176001600160a01b038a161515612f01565b6001600160a01b038316958615806135b6575b6132349015612f46565b866135af57899a5b6001600160a01b0389166135a8578a935b881589613591575b61325e90612f91565b6001600160a01b038a1680159061357a575b61327990612fd7565b8861357457349a5b61328c8c151561301e565b89806135195750506001600160a01b038c163b1561047d57600460008d60405192838092630d0e30db60e41b8252349060018060a01b03165af18015611d2457613504575b505b60009c6132de61511b565b6000905b8882106134b15750509089858d8f6133266133108261330b6133319b9a9961332b9510156130d8565b613cc9565b9c6001600160a01b03909616159890959061309b565b613121565b9261544f565b6001600160a01b03861661343957506001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101839052966000908890602490829084906001600160a01b03165af1938415611d2457600080516020615bd58339815191529761340c9561341e575b506133b7600080808087895af16133b161315b565b5061318b565b61341857506000935b6001600160a01b03811661341257506000945b604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b946133d3565b936133c0565b8061342d6000613433936102f6565b80611249565b3861339c565b60405163a9059cbb60e01b8152975060209088908160008161345f888a6004840161312b565b03926001600160a01b03165af1938415611d2457600080516020615bd58339815191529761340c95613492575b506133b7565b6134aa9060203d602011611d1d57611d1581836102f6565b503861348c565b909d6134fc8f91610a3a8f8f88906134f48f97886134e58f966109d49060206134dd8660019f8c6130b6565b0135906122d7565b938a8060a01b031615956130b6565b908d896151c4565b9e01906132e2565b8061342d6000613513936102f6565b386132d1565b6135406020916000936040519485809481936323b872dd60e01b835230336004850161306d565b03925af18015611d2457613555575b506132d3565b61356d9060203d602011611d1d57611d1581836102f6565b503861354f565b8a613281565b5061327961358a6119798c61066a565b9050613270565b5061325e6135a16119798861066a565b9050613255565b889361324d565b839a61323c565b506001600160a01b0388161561322a565b156135ce57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b1561360957565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b6040516060919061365e83826102f6565b6002815291601f1901366020840137565b6040519061367e6020836102f6565b6000808352366020840137565b60208183031261047d578051906001600160401b03821161047d57019080601f8301121561047d5781516136be816112d7565b926136cc60405194856102f6565b81845260208085019260051b82010192831161047d57602001905b8282106136f45750505090565b81518152602091820191016136e7565b919260809361372992979695978452602084015260a0604084015260a08301906106e0565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9195976137ca99919394986138299861378f60018060a01b0389161515612ec1565b6001600160a01b038516801580159890956137b490878b613cb8575b613c7d576150d8565b6001600160a01b0381169e9092908f1515612f01565b6001600160a01b038916159b8780613c76575b6137e79015612f46565b8715613c6f57835b8d15613c67579a5b8890613c50575b61380790612f91565b8c8d15613c39575b61381890612fd7565b8715613c3157349d8e5b1515613602565b8715613b745750508d3b1561047d5760049160008f60405194858092630d0e30db60e41b825234905af1908115611d24578d968f948c93613b5f575b505b61387361197986610684565b15613a1f5750906138849691615b1d565b985b61388f8a613cc9565b95905087156139a257506138a56119798a610684565b613930575b50918391600080516020615bd583398151915298936138d760008080808b9a61340c9c5af16133b161315b565b1561392a57506000955b1561392457506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b956138eb565b956138e1565b979290949391883b1561047d57604051632e1a7d4d60e01b815260048101849052986000908a90602490829084905af1958615611d2457600080516020615bd58339815191529961340c9761398d575b50919398509193946138aa565b8061342d600061399c936102f6565b38613980565b98939195949290506020604051809a63a9059cbb60e01b8252816000816139cd898c6004840161312b565b03926001600160a01b03165af1958615611d2457600080516020615bd58339815191529961340c97613a00575b506138d7565b613a189060203d602011611d1d57611d1581836102f6565b50386139fa565b959450613a3b613a36613a3188612522565b61263b565b6103bd565b158015613b49575b613b1a575b8715613a5f5790613a599691615957565b98613886565b919392918c15613b0b5750505090613a916000939260405195869485946318cbafe560e01b8652309260048701613704565b0381836001600160a01b038e165af160009181613ae6575b50613acb5760405162461bcd60e51b815280613ac76004820161373d565b0390fd5b80613ad9613adf9251612040565b9061254f565b5198613886565b613b049192503d806000833e613afc81836102f6565b81019061368b565b9038613aa9565b90613a59969194929394615957565b9450613b2461364d565b613b3686613b3183612522565b612494565b613b4382613b318361252f565b94613a48565b50613b59613a36613a318861252f565b15613a43565b8061342d6000613b6e936102f6565b38613865565b6040516323b872dd60e01b81529391602090859081600081613b9b8730336004850161306d565b03925af1908115611d24578f613bcf95602093613c16575b5060405163095ea7b360e01b815295869283926004840161312b565b038160006001600160a01b0386165af1908115611d24578d968f948c93613bf7575b50613867565b613c0f9060203d602011611d1d57611d1581836102f6565b5038613bf1565b613c2c90843d8611611d1d57611d1581836102f6565b613bb3565b809d8e613822565b50613818613c496119798c61066a565b905061380f565b50613807613c606119798b61066a565b90506137fe565b50899a6137f7565b88936137ef565b508c6137dd565b613c8c613a36613a3189612522565b1580613c9d575b6131fd90156135c7565b506131fd613cb0613a36613a318a61252f565b159050613c93565b506001600160a01b038a16156137ab565b90612710613cd9600654846122d7565b0480830392831161204f579190565b90808214613d7e578054906001600160401b0382116102bb57613d17613d1d91613d128486612b5e565b61027f565b9261027f565b91600a82049181549160005b848110613d61575050600a8302808203613d45575b5050505050565b60039060001992030260031b1b19169101553880808080613d3e565b600191820180546001600160f01b03909516878301559101613d29565b5050565b906122a657818103613d92575050565b60048083613da361035295856120f6565b613dbc60018060a01b03600183015416600186016121cf565b613dfd60028501612d8160028401613ddd60018060a01b03825416846121cf565b613df160ff825460a01c16151584546121ee565b83555460a81c60ff1690565b613e0d612daf60038301546103bd565b019101613ce8565b8054801561239c576000190190613e2c8282611dea565b6122a65780613e3c6004926122ea565b6000600182015560006002820155600060038201550180546000825580613e6257505055565b613e7d91600052600a60096020600020920104810190612087565b55565b9190613e8d368285611003565b6020815191012092613e9e83610235565b9360005b855480821015613f505782613ec0613eba848a611dea565b50610319565b6020815191012014613ed55750600101613ea2565b612935925061292b87613f2484613f1e613f16613f10613f0a6001613f299e9f6105669b613f0291611dea565b5001546103bd565b97612040565b85611dea565b509184611dea565b90613d82565b613e15565b7f920794705994e7d9e02cbb96f6a4492a1b379bc6c7aefb7a8ebc2f3fcc84fc72600080a3565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b038111838210176102bb57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b15613fdd57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b9015611e065780359060de198136030182121561047d570190565b9190811015611e065760051b8101359060de198136030182121561047d570190565b903590601e198136030182121561047d57018035906001600160401b03821161047d5760200191813603831361047d57565b9092916001600160401b0381116102bb576140a5816121268454610245565b6000601f82116001146140d35781906121509394956000926140c85750506120e3565b013590503880611123565b601f198216946140e28461027f565b91805b87811061411c57508360019596971061410257505050811b019055565b0135600019600384901b60f8161c1916905538808061218f565b909260206001819286860135815501940191016140e5565b356107d7816105c4565b356107d781610eee565b8054919291600160401b8110156102bb5761416891600182018155611ede565b6122a6576141768380614054565b9093906001600160401b0381116102bb57614195816110f28554610245565b6000601f8211600114614239576005926141c3836142329460c094610352999a6000926140c85750506120e3565b85555b6141e06141d66020830183614054565b9060018801614086565b614208600286016141f6612d5d60408501613121565b61420260608401614134565b90612205565b6080810135600386015561422c61422260a0830183614054565b9060048801614086565b0161413e565b9101612214565b601f198216906142488561027f565b91815b81811061429457508360c093610352989960059794614232976001951061427a575b505050811b0185556141c6565b0135600019600384901b60f8161c1916905538808061426d565b9192602060018192868c01358155019401920161424b565b600019811461204f5760010190565b6000546001600160a01b031633036142cf57565b63118cdaa760e01b6000523360045260246000fd5b156142eb57565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b8054919291600160401b8110156102bb5761434791600182018155611ede565b6122a657825180519093906001600160401b0381116102bb5761436e816110f28554610245565b6020601f82116001146143f65760059261439c836142329460c094610352999a6000926111435750506120e3565b85555b6143b0602082015160018701612aaa565b6143d4600286016143c7612d5d60408501516103bd565b606083015160ff16614202565b608081015160038601556143ef60a082015160048701612aaa565b0151151590565b601f198216956144058561027f565b9660005b818110614451575083610352979860c094600597946142329760019510614438575b505050811b01855561439f565b015160001960f88460031b161c1916905538808061442b565b83830151895560019098019760209384019301614409565b614481906020604051928284809451938492016103c9565b810103902090565b90614493826112d7565b6144a060405191826102f6565b82815280926144b1601f19916112d7565b019060005b8281106144c257505050565b6020906144cd613f85565b828285010152016144b6565b6040906107d79392815281602082015201906106e0565b9190918054831015611e06576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b9081602091031261047d575190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b93929091936145ad6145a86145a284610235565b546122c1565b614489565b9160009384925b6145bd83610235565b54841015614b4a576145ef6145eb60026145df876145da88610235565b611dea565b50015460a01c60ff1690565b1590565b614b40576146116002614605866145da87610235565b50015460a81c60ff1690565b1561482b5761462b613a366003613f02876145da88610235565b6001600160a01b03169660005b896004614648886145da89610235565b50015482101561481a57600080916146a26146b061468161467a8760046146738f8f6145da90610235565b50016144f0565b9054612bc6565b92604051928391602083019563f7729d4360e01b87528c8c60248601614512565b03601f1981018352826102f6565b51908c5afa6146bd61315b565b906146cc575b50600101614638565b8098919851810160200190602001906146e491614548565b866146ee87610235565b906146f891611dea565b5090858c896147068a610235565b9061471091611dea565b506001015461471e906103bd565b9261472761366f565b918d8c6147338d610235565b9061473d91611dea565b506004019061474b916144f0565b90549061475791612bc6565b89604051958692602084019261476c93614557565b03601f198101855261477e90856102f6565b8d8c6147898d610235565b9061479391611dea565b50600401906147a1916144f0565b9054906147ad91612bc6565b946147b6610fd8565b966147c090610319565b87526147cf9060208801612494565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526147fe828961254f565b52614809818861254f565b50614813906142ac565b96386146c3565b50509360019197505b0192956145b4565b9592614836836150d8565b61483e61364d565b8861484882612522565b9061485291612494565b8361485c8261252f565b9061486691612494565b61486e612563565b918961487984612522565b9061488391612494565b61488c8361252f565b9061489691612494565b836148a08361253f565b906148aa91612494565b6148b2612563565b91896148bd84612522565b906148c791612494565b6148d086610225565b600201546001600160a01b03166148e68461252f565b906148f091612494565b846148fa8461253f565b9061490491612494565b8361490e87610235565b9061491891611dea565b5060010154614926906103bd565b61492f906103bd565b614938906103bd565b918b8360405180809363d06ca61f60e01b825285600483019161495a926144d9565b03815a93600094fa60009181614b25575b50614af35750506149946000828d604051938492839263d06ca61f60e01b8452600484016144d9565b0381865afa60009181614ad8575b50614aa65750506000826149cd928c60405180958194829363d06ca61f60e01b8452600484016144d9565b03915afa60009181614a8b575b506149ea575b5050600190614823565b9684614a83928499614a3d614a1f614a196001613f028a6145da614a12849d6145da8c610235565b5099610235565b9261253f565b5191614a32614a2c610fd8565b95610319565b855260208501612494565b8c604084015260608301526080820152614a55613146565b60a0820152600060c0820152600060e0820152614a72828961254f565b52614a7d818861254f565b506142ac565b9590386149e0565b614a9f91923d8091833e613afc81836102f6565b90386149da565b614ad2935084999250908691614a3d614a1f614a196001613f028a6145da614a12849d6145da8c610235565b95614823565b614aec91923d8091833e613afc81836102f6565b90386149a2565b614ad29450859a9350879250614a3d614a1f614b1f6001613f028a6145da614a12849d6145da8c610235565b9261252f565b614b3991923d8091833e613afc81836102f6565b903861496b565b9592600190614823565b505050918152925050565b929394909194614b6a6145a86145a283610235565b9260009485935b614b7a84610235565b548510156150cb57614b976145eb60026145df886145da89610235565b6150bf57614bad6002614605876145da88610235565b15614db15796614bc8613a366003613f02886145da89610235565b6001600160a01b03169760005b8a6004614be5896145da8a610235565b500154821015614d9d57600080916146a2614c32614c1161467a8760048f8f906145da61467392610235565b92604051928391602083019563f7729d4360e01b87528d8d60248601614512565b51908d5afa614c3f61315b565b90614c4e575b50600101614bd5565b809991995181016020019060200190614c6691614548565b8b868b8a614c738b610235565b90614c7d91611dea565b50938b614c898c610235565b90614c9391611dea565b5060010154614ca1906103bd565b93614caa61366f565b928d8d8282614cb883610235565b90614cc291611dea565b5060040190614cd0916144f0565b905490614cdc91612bc6565b8d6040519889926020840192614cf193614557565b03601f1981018852614d0390886102f6565b614d0c90610235565b90614d1691611dea565b5060040190614d24916144f0565b905490614d3091612bc6565b94614d39610fd8565b96614d4390610319565b8752614d529060208801612494565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614d81828a61254f565b52614d8c818961254f565b50614d96906142ac565b9738614c45565b5050946001919298505b0193969096614b71565b93614dbe849892986150d8565b614dc661364d565b9089614dd183612522565b90614ddb91612494565b84614de58361252f565b90614def91612494565b614df7612563565b908a614e0283612522565b90614e0c91612494565b614e158261252f565b90614e1f91612494565b84614e298261253f565b90614e3391612494565b838b614e3d612563565b928c614e4885612522565b90614e5291612494565b614e5b89610225565b600201546001600160a01b0316614e718561252f565b90614e7b91612494565b87614e858561253f565b90614e8f91612494565b85614e998a610235565b90614ea391611dea565b5060010154614eb1906103bd565b614eba906103bd565b614ec3906103bd565b60405163d06ca61f60e01b8152909590868180614ee48588600484016144d9565b03815a93600094fa600091816150a4575b5061506857505060405163d06ca61f60e01b815260008180614f1b8587600484016144d9565b0381895afa6000918161504d575b5061500957505082614f55939460009260405180968194829363d06ca61f60e01b8452600484016144d9565b03915afa60009281614fee575b50614f73575b505050600190614da7565b614f7e575b83614f68565b9785614fe692849a614fa6614a1f614a196001613f028a6145da614a12849d6145da8c610235565b8d604084015260608301526080820152614fbe613146565b60a0820152600060c0820152600060e0820152614fdb828a61254f565b52614a7d818961254f565b969038614f78565b61500291933d8091833e613afc81836102f6565b9138614f62565b935093505061501d575b5050600190614da7565b978561504592849a614fa6614a1f614a196001613f028a6145da614a12849d6145da8c610235565b969038615013565b61506191923d8091833e613afc81836102f6565b9038614f29565b94509450505061507c575050600190614da7565b978561504592849a614fa6614a1f614b1f6001613f028a6145da614a12849d6145da8c610235565b6150b891923d8091833e613afc81836102f6565b9038614ef5565b93600190979197614da7565b9750505050509150815290565b6000818152600860205260409020600101546001600160a01b03166150fd5750600090565b6000908152600860205260409020600101546001600160a01b031690565b6000806040516020810190637b3338ad60e11b8252600b60248201528260448201526044815261514c6064826102f6565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561047d57018035906001600160401b03821161047d57602001918160051b3603831361047d57565b90608092613729919695949683526000602084015260a0604084015260a08301906106e0565b356107d7816112bd565b929190946151f26020836151d786613121565b60405163095ea7b360e01b815293849283926004840161312b565b038160006001600160a01b038a165af18015611d2457615432575b5061521a6080840161413e565b1561523f57506107d79461523960a061523285613121565b94016151ba565b93615a23565b909290156153855791816000949361526861526160406152b19996018461515f565b36916112ee565b938451158015615369575b8015615344575b61530b575b5050615291613a36613a368793613121565b92604051968795869485936318cbafe560e01b8552309160048601615194565b03925af1600091816152ee575b506152dc5760405162461bcd60e51b815280613ac76004820161373d565b80613ad96152ea9251612040565b5190565b6153049192503d806000833e613afc81836102f6565b90386152be565b86929450613a366152919261533b613a369361533261532861364d565b93613b3185612522565b613b318361252f565b9593505061527f565b5060018060a01b03615362613a3161535c8851612040565b8861254f565b161561527a565b506001600160a01b0361537e613a3187612522565b1615615273565b9092916107d79461539c615261604087018761515f565b948551158015615416575b80156153f1575b6153c2575b6153bc90613121565b92615860565b94506153bc6153cf61364d565b6153dc85613b3183612522565b6153e983613b318361252f565b9590506153b3565b5060018060a01b0361540f613a316154098951612040565b8961254f565b16156153ae565b506001600160a01b0361542b613a3188612522565b16156153a7565b61544a9060203d602011611d1d57611d1581836102f6565b61520d565b9493929195600554906154668260ff9060a01c1690565b80615717575b156156b75750506001600160a01b03868116949082168581146155f9575085106155b9576154b2906154a961549f61364d565b97613b3189612522565b613b318761252f565b47936020604051809563095ea7b360e01b8252816000816154d787896004840161312b565b03925af18015611d245761550f96600095869261559c575b506040516318cbafe560e01b815297889586948593309160048601615194565b03926001600160a01b03165af1918215611d245761553392615583575b5047612064565b8061553c575b50565b61554a613a366007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d245715615539578061342d6000610352936102f6565b615597903d806000833e613afc81836102f6565b61552c565b6155b49060203d602011611d1d57611d1581836102f6565b6154ef565b5050506155d0925090602091611cc56005546103bd565b03925af18015611d24576155e15750565b6155399060203d602011611d1d57611d1581836102f6565b9596505066038d7ea4c68000861093506156a59250505057803b1561047d57604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af18015611d2457615690575b50615655613a366007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d24576156815750565b8061342d6000610352936102f6565b8061342d600061569f936102f6565b38615646565b6155d091602091611cc56005546103bd565b9350935050509291926000146156ed5750506000808080610352946156e3613a36613a366005546103bd565b5af16133b161315b565b91602091611cc56156fd946103bd565b03926001600160a01b03165af18015611d24576155e15750565b506007546001600160a01b039061573190613a36906103bd565b16151561546c565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615bb58339815191529080a3565b1561577557565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b156157b757565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561580f57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b6158e9956158c860009695949361589f889461588060028651101561576e565b61588c613a3186612522565b6001600160a01b039081169116146157b0565b6158b5613a316158af8551612040565b8561254f565b6001600160a01b03908116911614615808565b6040516338ed173960e01b8152968795869485933091869060048701613704565b03926001600160a01b03165af16000918161593a575b506152dc5760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6159509192503d806000833e613afc81836102f6565b90386158ff565b926159986000969793959492615982889461597660028851101561576e565b61588c613a3188612522565b6158b5613a316159928751612040565b8761254f565b6158e9604051978896879586946338ed173960e01b8652309260048701613704565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b9091600095615a5c602096615a50615a9b9796615a48615a41610fd8565b9788612494565b898701612494565b62ffffff166040850152565b615a693060608501612494565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b8352600483016159ba565b03926001600160a01b03165af160009181615aec575b506107d75760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615b0f91925060203d602011615b16575b615b0781836102f6565b810190614548565b9038615ab1565b503d615afd565b91600096615b56602097615b4a615a9b989795615b42615b3b610fd8565b9889612494565b8a8801612494565b62ffffff166040860152565b615b633060608601612494565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b8352600483016159ba56fe021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f707888be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da26469706673582212200041b57e0c81e62a3a83a71cd4b6ec5252fd8f64df8c216befd97c3e5fddaad064736f6c634300081c0033
Deployed Bytecode
0x60806040526004361015610010575b005b60003560e01c806303a56b321461021057806313baf1e61461020b5780632182e46714610206578063240028e8146102015780632688807c146101fc5780634c984d38146101f757806359e63b23146101f25780635bc4e0ec146101ed5780635f524ea3146101e85780636c96b2bf146101e3578063715018a6146101de57806381ee0715146101d957806384b06bc0146101d4578063880cdc31146101cf5780638cf106e1146101ca5780638da5cb5b146101c557806399a5d747146101c05780639dd373b9146101bb5780639ed12c31146101b6578063a7d87c0e146101b1578063b0fa3694146101ac578063b24266cb146101a7578063b26baa5f146101a2578063b5d52d1a1461019d578063ba14713214610198578063cc21392e14610193578063cea9d26f1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063f71918771461017a5763fa972c660361000e57611f5c565b611e54565b611db7565b611d52565b611d29565b611c8a565b611b8b565b611a99565b611a70565b6118ca565b611783565b611673565b61159b565b611564565b6114da565b6114ac565b611483565b611441565b6113e6565b61135f565b61129b565b611254565b6111c4565b611096565b610f28565b610de0565b610c52565b610859565b61069e565b6105cf565b610493565b610411565b6000526001602052604060002090565b6000526008602052604060002090565b6000526003602052604060002090565b90600182811c92168015610275575b602083101461025f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610254565b600052602060002090565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b038211176102bb57604052565b61028a565b606081019081106001600160401b038211176102bb57604052565b60c081019081106001600160401b038211176102bb57604052565b601f909101601f19168101906001600160401b038211908210176102bb57604052565b906040519182600082549261032d84610245565b808452936001811690811561039b5750600114610354575b50610352925003836102f6565b565b90506000929192526020600020906000915b81831061037f5750509060206103529282010138610345565b6020919350806001915483858901015201910190918492610366565b90506020925061035294915060ff191682840152151560051b82010138610345565b6001600160a01b031690565b60005b8381106103dc5750506000910152565b81810151838201526020016103cc565b90602091610405815180928185528580860191016103c9565b601f01601f1916010190565b3461047d57602036600319011261047d57600435600052600860205261046e604060002061043e81610319565b60018201546002909201546040516060808252909485946001600160a01b039081169493169290918501906103ec565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361047d57565b3461047d57604036600319011261047d576004356104b081610482565b602435906104bc6142bb565b6001600160a01b0381166000818152600260205260409020546104e19060ff16611fec565b6104ea83610215565b9160005b83548082101561000e57836105038387611ede565b50600201546001600160a01b039061051a906103bd565b161461052957506001016104ee565b610570939461055c610566949361055661054e61054861056196612040565b85611ede565b509184611ede565b90612225565b61234a565b61066a565b805460ff19169055565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e600080a3005b9181601f8401121561047d578235916001600160401b03831161047d576020838186019501011161047d57565b60ff81160361047d57565b3461047d5760c036600319011261047d576004356001600160401b03811161047d576105ff903690600401610597565b6024356001600160401b03811161047d5761061e903690600401610597565b60449391933561062d81610482565b6064359061063a826105c4565b60a4359560843593906001600160401b03881161047d5761066261000e983690600401610597565b9790966123a1565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461047d57602036600319011261047d576004356106bb81610482565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b906020808351928381520192019060005b8181106106fe5750505090565b82516001600160a01b03168452602093840193909201916001016106f1565b9080602083519182815201916020808360051b8301019401926000915b83831061074957505050505090565b9091929394602080610767600193601f1986820301875289516103ec565b9701930193019193929061073a565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b8282106107da57505050509260408460206107d795960151828401520151906060601f198285030191015261071d565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610838610826604087015160c0604088015260c08701906106e0565b606087015186820360608801526103ec565b946080810151151560808601520151169101529701920192019092916107a7565b3461047d57608036600319011261047d5760043561087681610482565b6108a36024359161088683610482565b604435809361089460643590565b9261089d6124a3565b5061458e565b6108af815115156124c3565b60005b6108bc8251612040565b811015610952576108cc81612507565b8251811015610949578060606108e46001938661254f565b51015160606108f3858761254f565b51015110610902575b016108cc565b61090c838561254f565b51610917828661254f565b51610922858761254f565b5261092d848661254f565b50610938828661254f565b52610943818561254f565b506108fc565b506001016108b2565b5060009061095e6124a3565b906000905b8051821015610c405761097582612507565b8151811015610c3557610986612563565b926109c461099385612522565b526113886109a08561252f565b52611d4c6109ad8561253f565b5260005b8451811015610c2a576109e26109dc6109d46109cd848961254f565b518b6122d7565b612710900490565b89612064565b50610a40610a0c6109d460606109f8868961254f565b510151610a05858a61254f565b51906122d7565b610a3a6109d46060610a1e888a61254f565b510151610a34610a2e878c61254f565b51612054565b906122d7565b90612515565b878111610a51575b506001016109b1565b965086610a5c612585565b8752610a66612600565b60408801908152610a77848761254f565b5160200151610a85906103bd565b610a8f848961254f565b51610a9a868961254f565b5160800151610aa9878a61254f565b5160a00151610ab8888b61254f565b5160c00151151591610aca898c61254f565b5160e0015162ffffff1693610add610fba565b95610ae89087612494565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610b1482612522565b52610b1e90612522565b50610b29858761254f565b51602001610b369061263b565b610b40848961254f565b51610b4a90612054565b610b54878961254f565b5160800151610b63888a61254f565b5160a00151610b72898b61254f565b5160c00151151591610b848a8c61254f565b5160e0015162ffffff1693610b97610fba565b95610ba29087612494565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610bce8261252f565b52610bd89061252f565b50610be3848761254f565b5151815190610bf182612522565b52610bfb90612522565b50610c06858761254f565b5151905190610c148261252f565b52610c1e9061252f565b50602087015238610a48565b509250600101610975565b509060010190610963565b60405180610c4e8582610776565b0390f35b3461047d57602036600319011261047d57600435610c6f81610482565b610c776142bb565b6001600160a01b03168015610c9c57600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b818110610cf15750505090565b825162ffffff16845260209384019390920191600101610ce4565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610d3f57505050505090565b9091929394602080610dd1600193603f1986820301875289519060c0610d6e835160e0845260e08401906103ec565b92878060a01b03868201511686840152878060a01b036040820151166040840152606081015115156060840152610dae6080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152610cd3565b97019301930191939290610d30565b3461047d57602036600319011261047d57600435600052600360205260406000208054610e0c816112d7565b91610e1a60405193846102f6565b818352602083019060005260206000206000915b838310610e435760405180610c4e8782610d0c565b60056020600192604051610e56816102a0565b610e5f86610319565b8152848060a01b03858701541683820152610eb6610ead6002880154610e90610e87826103bd565b60408601612494565b610ea460a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b610ecf610ec660038801546103bd565b60a08301612494565b610edb60048701612648565b60c0820152815201920192019190610e2e565b8015150361047d57565b9181601f8401121561047d578235916001600160401b03831161047d576020808501948460051b01011161047d57565b3461047d5760e036600319011261047d576004356001600160401b03811161047d57610f58903690600401610597565b90602435610f6581610482565b60443592610f7284610482565b606435610f7e81610eee565b60843590610f8b82610482565b60a435956001600160401b03871161047d57610fae61000e973690600401610ef8565b95909460c43597612881565b6040519061035260c0836102f6565b6040519061035260e0836102f6565b60405190610352610100836102f6565b6001600160401b0381116102bb57601f01601f191660200190565b92919261100f82610fe8565b9161101d60405193846102f6565b82948184528183011161047d578281602093846000960137010152565b608060031982011261047d57600435906001600160401b03821161047d578060238301121561047d5781602461107593600401359101611003565b9060243561108281610482565b9060443561108f81610482565b9060643590565b3461047d576110a43661103a565b926110b09291926142bb565b6110c46001600160a01b0383161515612e46565b6000848152600860205260409020815190916001600160401b0382116102bb576110f8826110f28554610245565b8561209e565b602090601f831160011461114e57936111389361112a8461000e999561113e95600299600092611143575b50506120e3565b90555b600161113884610225565b016121cf565b610225565b015190503880611123565b601f198316919061115e8561027f565b9260005b8181106111ac57508461113e9460029894611138989461000e9c9860019510611193575b505050811b01905561112d565b015160001960f88460031b161c19169055388080611186565b92936020600181928786015181550195019301611162565b61012036600319011261047d576004356111dd81610482565b602435906111ea82610482565b6064359160843591906044356001600160401b03841161047d57610c4e94611219611239953690600401610ef8565b9060a4359261122784610482565b60c4359460e4359661010435986131d0565b6040519081529081906020820190565b600091031261047d57565b3461047d57600036600319011261047d5761126d6142bb565b600080546001600160a01b0319811682556001600160a01b0316600080516020615bb58339815191528280a3005b3461047d57600036600319011261047d57602060405166038d7ea4c680008152f35b62ffffff81160361047d57565b60e43590610352826112bd565b6001600160401b0381116102bb5760051b60200190565b9291906112fa816112d7565b9361130860405195866102f6565b602085838152019160051b810192831161047d57905b82821061132a57505050565b60208091833561133981610482565b81520191019061131e565b9080601f8301121561047d578160206107d7933591016112ee565b61016036600319011261047d5760043561137881610482565b60243561138481610482565b604435916064359160843561139881610482565b60a4356113a481610482565b60c435906113b06112ca565b61012435969093906001600160401b03881161047d57610c4e986113db611239993690600401611344565b96610144359861376d565b3461047d57602036600319011261047d5760043561140381610482565b61140b6142bb565b6114136142bb565b6001600160a01b0381161561142b5761000e90615739565b631e4fbdf760e01b600052600060045260246000fd5b3461047d57602036600319011261047d5760043561145e81610482565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b3461047d57600036600319011261047d576000546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d576114c8600435613cc9565b60408051928352602083019190915290f35b3461047d57602036600319011261047d576004356114f781610482565b6114ff6142bb565b6001600160a01b0316801561152457600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461047d57602036600319011261047d5761159660043561158481610eee565b61158c6142bb565b15156005546121ee565b600555005b3461047d57604036600319011261047d576004356001600160401b03811161047d576115ce61000e913690600401610597565b602435916115da6142bb565b613e80565b6107d7906020815261010060e061165b61164561160887518560208801526101208701906103ec565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a08801526106e0565b60a0870151858203601f190160c08701526103ec565b60c086015115158483015294015162ffffff16910152565b3461047d5760a036600319011261047d5760043561169081610482565b6116c5602435916116a083610482565b604435926064359384916116b383610eee565b608435936116bf613f85565b50614b55565b906116d2825115156124c3565b600090801561177b57815b90825b8451811015611761578115611729578260606116fc838861254f565b5101511161170f575b6001905b016116e0565b92509050606061171f838561254f565b5101519082611705565b826040611736838861254f565b51015110611747575b600190611709565b925090506040611757838561254f565b510151908261173f565b610c4e61176e858761254f565b51604051918291826115df565b6000196116dd565b3461047d576117913661103a565b929161179b6142bb565b6001600160a01b0316926117b0841515612e46565b604051926117bd846102c0565b835260208301938452604083019160018060a01b0316825260005260086020526040600020915192835160018060401b0381116102bb57611808816118028654610245565b8661209e565b6020601f82116001146118535761184361184c9361183a846002979561183d9561000e9b6000926111435750506120e3565b87555b516103bd565b600186016121cf565b91016121cf565b601f198216956118628661027f565b9660005b8181106118b257509360018461000e9961183d956118439560029a9861184c9a10611899575b505050811b01875561183d565b015160001960f88460031b161c1916905538808061188c565b83830151895560019098019760209384019301611866565b3461047d57602036600319011261047d576004356001600160401b03811161047d576118fa903690600401610ef8565b6119026142bb565b61190d811515613fd6565b600090608061191c8285614017565b01359282915b80831061195a575050508061193357005b7f12ee4d3ca844fd5718529d46d685ee6b4112a6e0193c4a15b1564877c182d522600080a3005b9091926119806119796105616040611973888789614032565b01613121565b5460ff1690565b8015611a50575b611a47576119e46001916119bc6119ab60806119a489888a614032565b0135610215565b6119b6888789614032565b90614148565b6119df6119d261056160406119738a898b614032565b805460ff19166001179055565b6142ac565b936119f96119f3828587614032565b80614054565b611a22611a0c604061197386898b614032565b916080611a1a86898b614032565b013593612e31565b90848060a01b031690600080516020615b95833981519152600080a45b019190611922565b92600190611a3f565b506001600160a01b03611a696040611973878688614032565b1615611987565b3461047d57600036600319011261047d576005546040516001600160a01b039091168152602090f35b3461047d57600036600319011261047d57602060ff60055460a01c166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310611af257505050505090565b9091929394602080600192603f19858203018652611b7c89519160c080611b72611b38611b28875160e0875260e08701906103ec565b888801518682038a8801526103ec565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a08701526103ec565b9401511515910152565b97019301930191939290611ae3565b3461047d57602036600319011261047d57600435600052600160205260406000208054611bb7816112d7565b91611bc560405193846102f6565b818352602083019060005260206000206000915b838310611bee5760405180610c4e8782611abf565b60066020600192604051611c01816102a0565b611c0a86610319565b8152611c17858701610319565b83820152611c47611c3d6002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b60038601546080820152611c5d60048701610319565b60a0820152611c7c611c73600588015460ff1690565b151560c0830152565b815201920192019190611bd9565b3461047d57606036600319011261047d57611ce36020600435611cac81610482565b60243590611cb982610482565b60443591611cc56142bb565b600060405180968195829463a9059cbb60e01b84526004840161312b565b03926001600160a01b03165af18015611d2457611cfc57005b61000e9060203d602011611d1d575b611d1581836102f6565b810190613058565b503d611d0b565b61308f565b3461047d57600036600319011261047d576007546040516001600160a01b039091168152602090f35b3461047d57602036600319011261047d57600435611d6e6142bb565b60648111611d7b57600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b3461047d57602036600319011261047d5760043561140b81610482565b634e487b7160e01b600052603260045260246000fd5b8054821015611e06576000526005602060002091020190600090565b611dd4565b9491969592611e2560a0959260c0885260c08801906103ec565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461047d57604036600319011261047d57600435602435906000526003602052604060002090815481101561047d57611e8c91611dea565b50611e9681610319565b60018201546002830154600390930154604051938493610c4e936001600160a01b039384169360a884901c60ff9081169460a081901c90911693908216929091169087611e0b565b8054821015611e06576000526006602060002091020190600090565b9591611f5494611f2c60ff92611f1e60c099959c9b9c60e08c5260e08c01906103ec565b908a820360208c01526103ec565b6001600160a01b039095166040890152166060870152608086015284820360a08601526103ec565b931515910152565b3461047d57604036600319011261047d57600435602435906000526001602052604060002090815481101561047d57611f9491611ede565b50611f9e81610319565b90610c4e611fae60018301610319565b91600281015490600381015460ff6005611fca60048501610319565b930154169260405196879660ff8360a01c169260018060a01b03169188611efa565b15611ff357565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161204f57565b61202a565b6127100390612710821161204f57565b9190820391821161204f57565b634e487b7160e01b600052600060045260246000fd5b818110612092575050565b60008155600101612087565b9190601f81116120ad57505050565b610352926000526020600020906020601f840160051c830193106120d9575b601f0160051c0190612087565b90915081906120cc565b8160011b916000199060031b1c19161790565b9190918281146121ca5761210a8354610245565b6001600160401b0381116102bb5761212c816121268454610245565b8461209e565b600093601f821160011461215f5761215092939482916000926121545750506120e3565b9055565b015490503880611123565b61216d601f1983169161027f565b946121778461027f565b91815b8181106121b257509583600195969710612199575b505050811b019055565b015460001960f88460031b161c1916905538808061218f565b9192600180602092868b01548155019401920161217a565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612150911682546121ee565b9060ff801983541691151516179055565b906122a657818103612235575050565b600560ff818461224861035296866120f6565b61225860018201600187016120f6565b61228260028601846002840161227760018060a01b03825416846121cf565b5460a01c1690612205565b6003810154600386015561229c60048201600487016120f6565b0154169101612214565b612071565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561204f57565b8181029291811591840414171561204f57565b6122f48154610245565b90816122fe575050565b81601f60009311600114612310575055565b8183526020832061232c91601f0160051c810190600101612087565b808252602082209081548360011b9084198560031b1c191617905555565b8054801561239c5760001901906123618282611ede565b6122a6576005816123736000936122ea565b61237f600182016122ea565b826002820155826003820155612397600482016122ea565b015555565b6122ab565b61246b956123e161247398999461240d966123d860ff959d96999d6123c46142bb565b6040519a6123d18c6102a0565b3691611003565b89523691611003565b60208701526001600160a01b039099166040860190815298166060850152608084019687523691611003565b60a0820152600160c082015284516001600160a01b03166000908152600260205260409020546124409060ff16156142e4565b6124538161244e8651610215565b614327565b6124636119d261056187516103bd565b5193516103bd565b915192614469565b6001600160a01b0390911690600080516020615b95833981519152600080a4565b6001600160a01b039091169052565b604051906124b0826102c0565b6060604083828152600060208201520152565b156124ca57565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161204f57565b9190820180921161204f57565b805115611e065760200190565b805160011015611e065760400190565b805160021015611e065760600190565b8051821015611e065760209160051b010190565b6040516080919061257483826102f6565b6003815291601f1901366020840137565b61258f60026112d7565b9061259d60405192836102f6565b6002825281601f196125af60026112d7565b019060005b8281106125c057505050565b6020906040516125cf816102db565b600081526000838201526060604082015260608082015260006080820152600060a0820152828285010152016125b4565b6040516060919061261183826102f6565b6002815291601f19018260005b82811061262a57505050565b80606060208093850101520161261e565b516001600160a01b031690565b60405181548082529092918390612662602083019161027f565b926000905b8060098301106127c6576103529454918181106127b0575b818110612796575b81811061277c575b818110612762575b818110612748575b81811061272e575b818110612714575b8181106126fa575b8181106126e0575b106126cd575b5003836102f6565b60d81c62ffffff168152602001386126c5565b60c083901c62ffffff1684529260019060200193016126bf565b60a883901c62ffffff1684529260019060200193016126b7565b609083901c62ffffff1684529260019060200193016126af565b607883901c62ffffff1684529260019060200193016126a7565b606083901c62ffffff16845292600190602001930161269f565b604883901c62ffffff168452926001906020019301612697565b603083901c62ffffff16845292600190602001930161268f565b601883901c62ffffff168452926001906020019301612687565b62ffffff8316845292600190602001930161267f565b91600a91935061014060019161287387546127ea8362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391612667565b9391969596949290946128926142bb565b6001600160a01b0381169789908790879086906128b08d1515612985565b61293a9b61291a6129359a6129026129309a6128ea6128d961292b9b6129219961296157610235565b986128e2610fc9565b9a3691611003565b89526128f98b60208b01612494565b60408901612494565b600160608801528a1515608088015260a08701612494565b3691612a54565b60c0830152612cc1565b610684565b612214565b612e31565b7fa996cb2fb76f06529d6a56403f6ae3a1669ece05b5e092b2960759b229f520d1600080a4565b6129756001600160a01b03871615156129ca565b612980881515612a0f565b610235565b1561298c57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b156129d157565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15612a1657565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190612a60816112d7565b93612a6e60405195866102f6565b602085838152019160051b810192831161047d57905b828210612a9057505050565b602080918335612a9f816112bd565b815201910190612a84565b81519192916001600160401b0381116102bb57612acb816121268454610245565b6020601f8211600114612aee5781906121509394956000926111435750506120e3565b601f19821690612afd8461027f565b9160005b818110612b3857509583600195969710612b1f57505050811b019055565b015160001960f88460031b161c1916905538808061218f565b9192602060018192868b015181550194019201612b01565b9061215090151582546121ee565b90600160401b81116102bb578154818355808210612b7b57505050565b61035292600052600a60096020600020926003838084880104860196060280612ba9575b5001040190612087565b6000198601908154906000199060200360031b1c16905538612b9f565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b0382116102bb576020612c1291612c0b8486612b5e565b019261027f565b600a82049160005b838110612c7d5750600a8302900380612c34575b50505050565b9260009360005b818110612c5057505050015538808080612c2e565b9091946020612c73600192612c68895162ffffff1690565b908560030290612bd3565b9601929101612c3b565b6000805b600a8110612c96575083820155600101612c1a565b95906020612cb8600192612cad855162ffffff1690565b908a60030290612bd3565b92019601612c81565b8054919291600160401b8110156102bb57612ce191600182018155611dea565b6122a657825180519093906001600160401b0381116102bb57612d08816110f28554610245565b6020601f8211600114612dc15791612d338260c09360049561035298996000926111435750506120e3565b84555b612d4661184360208301516103bd565b612d9f60028501612d63612d5d60408501516103bd565b826121cf565b612d79612d736060850151151590565b82612b50565b608083015115155b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b612db8612daf60a08301516103bd565b600386016121cf565b01519101612be9565b601f19821695612dd08561027f565b9660005b818110612e195750926103529697600495936001938360c09710612e00575b505050811b018455612d36565b015160001960f88460031b161c19169055388080612df3565b83830151895560019098019760209384019301612dd4565b81604051928392833781016000815203902090565b15612e4d57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15612e8757565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15612ec857565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b15612f0857565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b15612f4d57565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b15612f9857565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b15612fde57565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561302557565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b9081602091031261047d57516107d781610eee565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b9015611e065780359060be198136030182121561047d570190565b9190811015611e065760051b8101359060be198136030182121561047d570190565b156130df57565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b356107d781610482565b6001600160a01b039091168152602081019190915260400190565b604051906131556020836102f6565b60008252565b3d15613186573d9061316c82610fe8565b9161317a60405193846102f6565b82523d6000602084013e565b606090565b1561319257565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b91969861320290989593919694986131e9851515612e80565b6131fd6001600160a01b0387161515612ec1565b6150d8565b976132176001600160a01b038a161515612f01565b6001600160a01b038316958615806135b6575b6132349015612f46565b866135af57899a5b6001600160a01b0389166135a8578a935b881589613591575b61325e90612f91565b6001600160a01b038a1680159061357a575b61327990612fd7565b8861357457349a5b61328c8c151561301e565b89806135195750506001600160a01b038c163b1561047d57600460008d60405192838092630d0e30db60e41b8252349060018060a01b03165af18015611d2457613504575b505b60009c6132de61511b565b6000905b8882106134b15750509089858d8f6133266133108261330b6133319b9a9961332b9510156130d8565b613cc9565b9c6001600160a01b03909616159890959061309b565b613121565b9261544f565b6001600160a01b03861661343957506001600160a01b0387163b1561047d57604051632e1a7d4d60e01b815260048101839052966000908890602490829084906001600160a01b03165af1938415611d2457600080516020615bd58339815191529761340c9561341e575b506133b7600080808087895af16133b161315b565b5061318b565b61341857506000935b6001600160a01b03811661341257506000945b604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b946133d3565b936133c0565b8061342d6000613433936102f6565b80611249565b3861339c565b60405163a9059cbb60e01b8152975060209088908160008161345f888a6004840161312b565b03926001600160a01b03165af1938415611d2457600080516020615bd58339815191529761340c95613492575b506133b7565b6134aa9060203d602011611d1d57611d1581836102f6565b503861348c565b909d6134fc8f91610a3a8f8f88906134f48f97886134e58f966109d49060206134dd8660019f8c6130b6565b0135906122d7565b938a8060a01b031615956130b6565b908d896151c4565b9e01906132e2565b8061342d6000613513936102f6565b386132d1565b6135406020916000936040519485809481936323b872dd60e01b835230336004850161306d565b03925af18015611d2457613555575b506132d3565b61356d9060203d602011611d1d57611d1581836102f6565b503861354f565b8a613281565b5061327961358a6119798c61066a565b9050613270565b5061325e6135a16119798861066a565b9050613255565b889361324d565b839a61323c565b506001600160a01b0388161561322a565b156135ce57565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b1561360957565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b6040516060919061365e83826102f6565b6002815291601f1901366020840137565b6040519061367e6020836102f6565b6000808352366020840137565b60208183031261047d578051906001600160401b03821161047d57019080601f8301121561047d5781516136be816112d7565b926136cc60405194856102f6565b81845260208085019260051b82010192831161047d57602001905b8282106136f45750505090565b81518152602091820191016136e7565b919260809361372992979695978452602084015260a0604084015260a08301906106e0565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9195976137ca99919394986138299861378f60018060a01b0389161515612ec1565b6001600160a01b038516801580159890956137b490878b613cb8575b613c7d576150d8565b6001600160a01b0381169e9092908f1515612f01565b6001600160a01b038916159b8780613c76575b6137e79015612f46565b8715613c6f57835b8d15613c67579a5b8890613c50575b61380790612f91565b8c8d15613c39575b61381890612fd7565b8715613c3157349d8e5b1515613602565b8715613b745750508d3b1561047d5760049160008f60405194858092630d0e30db60e41b825234905af1908115611d24578d968f948c93613b5f575b505b61387361197986610684565b15613a1f5750906138849691615b1d565b985b61388f8a613cc9565b95905087156139a257506138a56119798a610684565b613930575b50918391600080516020615bd583398151915298936138d760008080808b9a61340c9c5af16133b161315b565b1561392a57506000955b1561392457506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b956138eb565b956138e1565b979290949391883b1561047d57604051632e1a7d4d60e01b815260048101849052986000908a90602490829084905af1958615611d2457600080516020615bd58339815191529961340c9761398d575b50919398509193946138aa565b8061342d600061399c936102f6565b38613980565b98939195949290506020604051809a63a9059cbb60e01b8252816000816139cd898c6004840161312b565b03926001600160a01b03165af1958615611d2457600080516020615bd58339815191529961340c97613a00575b506138d7565b613a189060203d602011611d1d57611d1581836102f6565b50386139fa565b959450613a3b613a36613a3188612522565b61263b565b6103bd565b158015613b49575b613b1a575b8715613a5f5790613a599691615957565b98613886565b919392918c15613b0b5750505090613a916000939260405195869485946318cbafe560e01b8652309260048701613704565b0381836001600160a01b038e165af160009181613ae6575b50613acb5760405162461bcd60e51b815280613ac76004820161373d565b0390fd5b80613ad9613adf9251612040565b9061254f565b5198613886565b613b049192503d806000833e613afc81836102f6565b81019061368b565b9038613aa9565b90613a59969194929394615957565b9450613b2461364d565b613b3686613b3183612522565b612494565b613b4382613b318361252f565b94613a48565b50613b59613a36613a318861252f565b15613a43565b8061342d6000613b6e936102f6565b38613865565b6040516323b872dd60e01b81529391602090859081600081613b9b8730336004850161306d565b03925af1908115611d24578f613bcf95602093613c16575b5060405163095ea7b360e01b815295869283926004840161312b565b038160006001600160a01b0386165af1908115611d24578d968f948c93613bf7575b50613867565b613c0f9060203d602011611d1d57611d1581836102f6565b5038613bf1565b613c2c90843d8611611d1d57611d1581836102f6565b613bb3565b809d8e613822565b50613818613c496119798c61066a565b905061380f565b50613807613c606119798b61066a565b90506137fe565b50899a6137f7565b88936137ef565b508c6137dd565b613c8c613a36613a3189612522565b1580613c9d575b6131fd90156135c7565b506131fd613cb0613a36613a318a61252f565b159050613c93565b506001600160a01b038a16156137ab565b90612710613cd9600654846122d7565b0480830392831161204f579190565b90808214613d7e578054906001600160401b0382116102bb57613d17613d1d91613d128486612b5e565b61027f565b9261027f565b91600a82049181549160005b848110613d61575050600a8302808203613d45575b5050505050565b60039060001992030260031b1b19169101553880808080613d3e565b600191820180546001600160f01b03909516878301559101613d29565b5050565b906122a657818103613d92575050565b60048083613da361035295856120f6565b613dbc60018060a01b03600183015416600186016121cf565b613dfd60028501612d8160028401613ddd60018060a01b03825416846121cf565b613df160ff825460a01c16151584546121ee565b83555460a81c60ff1690565b613e0d612daf60038301546103bd565b019101613ce8565b8054801561239c576000190190613e2c8282611dea565b6122a65780613e3c6004926122ea565b6000600182015560006002820155600060038201550180546000825580613e6257505055565b613e7d91600052600a60096020600020920104810190612087565b55565b9190613e8d368285611003565b6020815191012092613e9e83610235565b9360005b855480821015613f505782613ec0613eba848a611dea565b50610319565b6020815191012014613ed55750600101613ea2565b612935925061292b87613f2484613f1e613f16613f10613f0a6001613f299e9f6105669b613f0291611dea565b5001546103bd565b97612040565b85611dea565b509184611dea565b90613d82565b613e15565b7f920794705994e7d9e02cbb96f6a4492a1b379bc6c7aefb7a8ebc2f3fcc84fc72600080a3565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b038111838210176102bb57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b15613fdd57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b9015611e065780359060de198136030182121561047d570190565b9190811015611e065760051b8101359060de198136030182121561047d570190565b903590601e198136030182121561047d57018035906001600160401b03821161047d5760200191813603831361047d57565b9092916001600160401b0381116102bb576140a5816121268454610245565b6000601f82116001146140d35781906121509394956000926140c85750506120e3565b013590503880611123565b601f198216946140e28461027f565b91805b87811061411c57508360019596971061410257505050811b019055565b0135600019600384901b60f8161c1916905538808061218f565b909260206001819286860135815501940191016140e5565b356107d7816105c4565b356107d781610eee565b8054919291600160401b8110156102bb5761416891600182018155611ede565b6122a6576141768380614054565b9093906001600160401b0381116102bb57614195816110f28554610245565b6000601f8211600114614239576005926141c3836142329460c094610352999a6000926140c85750506120e3565b85555b6141e06141d66020830183614054565b9060018801614086565b614208600286016141f6612d5d60408501613121565b61420260608401614134565b90612205565b6080810135600386015561422c61422260a0830183614054565b9060048801614086565b0161413e565b9101612214565b601f198216906142488561027f565b91815b81811061429457508360c093610352989960059794614232976001951061427a575b505050811b0185556141c6565b0135600019600384901b60f8161c1916905538808061426d565b9192602060018192868c01358155019401920161424b565b600019811461204f5760010190565b6000546001600160a01b031633036142cf57565b63118cdaa760e01b6000523360045260246000fd5b156142eb57565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b8054919291600160401b8110156102bb5761434791600182018155611ede565b6122a657825180519093906001600160401b0381116102bb5761436e816110f28554610245565b6020601f82116001146143f65760059261439c836142329460c094610352999a6000926111435750506120e3565b85555b6143b0602082015160018701612aaa565b6143d4600286016143c7612d5d60408501516103bd565b606083015160ff16614202565b608081015160038601556143ef60a082015160048701612aaa565b0151151590565b601f198216956144058561027f565b9660005b818110614451575083610352979860c094600597946142329760019510614438575b505050811b01855561439f565b015160001960f88460031b161c1916905538808061442b565b83830151895560019098019760209384019301614409565b614481906020604051928284809451938492016103c9565b810103902090565b90614493826112d7565b6144a060405191826102f6565b82815280926144b1601f19916112d7565b019060005b8281106144c257505050565b6020906144cd613f85565b828285010152016144b6565b6040906107d79392815281602082015201906106e0565b9190918054831015611e06576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b9081602091031261047d575190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b93929091936145ad6145a86145a284610235565b546122c1565b614489565b9160009384925b6145bd83610235565b54841015614b4a576145ef6145eb60026145df876145da88610235565b611dea565b50015460a01c60ff1690565b1590565b614b40576146116002614605866145da87610235565b50015460a81c60ff1690565b1561482b5761462b613a366003613f02876145da88610235565b6001600160a01b03169660005b896004614648886145da89610235565b50015482101561481a57600080916146a26146b061468161467a8760046146738f8f6145da90610235565b50016144f0565b9054612bc6565b92604051928391602083019563f7729d4360e01b87528c8c60248601614512565b03601f1981018352826102f6565b51908c5afa6146bd61315b565b906146cc575b50600101614638565b8098919851810160200190602001906146e491614548565b866146ee87610235565b906146f891611dea565b5090858c896147068a610235565b9061471091611dea565b506001015461471e906103bd565b9261472761366f565b918d8c6147338d610235565b9061473d91611dea565b506004019061474b916144f0565b90549061475791612bc6565b89604051958692602084019261476c93614557565b03601f198101855261477e90856102f6565b8d8c6147898d610235565b9061479391611dea565b50600401906147a1916144f0565b9054906147ad91612bc6565b946147b6610fd8565b966147c090610319565b87526147cf9060208801612494565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526147fe828961254f565b52614809818861254f565b50614813906142ac565b96386146c3565b50509360019197505b0192956145b4565b9592614836836150d8565b61483e61364d565b8861484882612522565b9061485291612494565b8361485c8261252f565b9061486691612494565b61486e612563565b918961487984612522565b9061488391612494565b61488c8361252f565b9061489691612494565b836148a08361253f565b906148aa91612494565b6148b2612563565b91896148bd84612522565b906148c791612494565b6148d086610225565b600201546001600160a01b03166148e68461252f565b906148f091612494565b846148fa8461253f565b9061490491612494565b8361490e87610235565b9061491891611dea565b5060010154614926906103bd565b61492f906103bd565b614938906103bd565b918b8360405180809363d06ca61f60e01b825285600483019161495a926144d9565b03815a93600094fa60009181614b25575b50614af35750506149946000828d604051938492839263d06ca61f60e01b8452600484016144d9565b0381865afa60009181614ad8575b50614aa65750506000826149cd928c60405180958194829363d06ca61f60e01b8452600484016144d9565b03915afa60009181614a8b575b506149ea575b5050600190614823565b9684614a83928499614a3d614a1f614a196001613f028a6145da614a12849d6145da8c610235565b5099610235565b9261253f565b5191614a32614a2c610fd8565b95610319565b855260208501612494565b8c604084015260608301526080820152614a55613146565b60a0820152600060c0820152600060e0820152614a72828961254f565b52614a7d818861254f565b506142ac565b9590386149e0565b614a9f91923d8091833e613afc81836102f6565b90386149da565b614ad2935084999250908691614a3d614a1f614a196001613f028a6145da614a12849d6145da8c610235565b95614823565b614aec91923d8091833e613afc81836102f6565b90386149a2565b614ad29450859a9350879250614a3d614a1f614b1f6001613f028a6145da614a12849d6145da8c610235565b9261252f565b614b3991923d8091833e613afc81836102f6565b903861496b565b9592600190614823565b505050918152925050565b929394909194614b6a6145a86145a283610235565b9260009485935b614b7a84610235565b548510156150cb57614b976145eb60026145df886145da89610235565b6150bf57614bad6002614605876145da88610235565b15614db15796614bc8613a366003613f02886145da89610235565b6001600160a01b03169760005b8a6004614be5896145da8a610235565b500154821015614d9d57600080916146a2614c32614c1161467a8760048f8f906145da61467392610235565b92604051928391602083019563f7729d4360e01b87528d8d60248601614512565b51908d5afa614c3f61315b565b90614c4e575b50600101614bd5565b809991995181016020019060200190614c6691614548565b8b868b8a614c738b610235565b90614c7d91611dea565b50938b614c898c610235565b90614c9391611dea565b5060010154614ca1906103bd565b93614caa61366f565b928d8d8282614cb883610235565b90614cc291611dea565b5060040190614cd0916144f0565b905490614cdc91612bc6565b8d6040519889926020840192614cf193614557565b03601f1981018852614d0390886102f6565b614d0c90610235565b90614d1691611dea565b5060040190614d24916144f0565b905490614d3091612bc6565b94614d39610fd8565b96614d4390610319565b8752614d529060208801612494565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614d81828a61254f565b52614d8c818961254f565b50614d96906142ac565b9738614c45565b5050946001919298505b0193969096614b71565b93614dbe849892986150d8565b614dc661364d565b9089614dd183612522565b90614ddb91612494565b84614de58361252f565b90614def91612494565b614df7612563565b908a614e0283612522565b90614e0c91612494565b614e158261252f565b90614e1f91612494565b84614e298261253f565b90614e3391612494565b838b614e3d612563565b928c614e4885612522565b90614e5291612494565b614e5b89610225565b600201546001600160a01b0316614e718561252f565b90614e7b91612494565b87614e858561253f565b90614e8f91612494565b85614e998a610235565b90614ea391611dea565b5060010154614eb1906103bd565b614eba906103bd565b614ec3906103bd565b60405163d06ca61f60e01b8152909590868180614ee48588600484016144d9565b03815a93600094fa600091816150a4575b5061506857505060405163d06ca61f60e01b815260008180614f1b8587600484016144d9565b0381895afa6000918161504d575b5061500957505082614f55939460009260405180968194829363d06ca61f60e01b8452600484016144d9565b03915afa60009281614fee575b50614f73575b505050600190614da7565b614f7e575b83614f68565b9785614fe692849a614fa6614a1f614a196001613f028a6145da614a12849d6145da8c610235565b8d604084015260608301526080820152614fbe613146565b60a0820152600060c0820152600060e0820152614fdb828a61254f565b52614a7d818961254f565b969038614f78565b61500291933d8091833e613afc81836102f6565b9138614f62565b935093505061501d575b5050600190614da7565b978561504592849a614fa6614a1f614a196001613f028a6145da614a12849d6145da8c610235565b969038615013565b61506191923d8091833e613afc81836102f6565b9038614f29565b94509450505061507c575050600190614da7565b978561504592849a614fa6614a1f614b1f6001613f028a6145da614a12849d6145da8c610235565b6150b891923d8091833e613afc81836102f6565b9038614ef5565b93600190979197614da7565b9750505050509150815290565b6000818152600860205260409020600101546001600160a01b03166150fd5750600090565b6000908152600860205260409020600101546001600160a01b031690565b6000806040516020810190637b3338ad60e11b8252600b60248201528260448201526044815261514c6064826102f6565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561047d57018035906001600160401b03821161047d57602001918160051b3603831361047d57565b90608092613729919695949683526000602084015260a0604084015260a08301906106e0565b356107d7816112bd565b929190946151f26020836151d786613121565b60405163095ea7b360e01b815293849283926004840161312b565b038160006001600160a01b038a165af18015611d2457615432575b5061521a6080840161413e565b1561523f57506107d79461523960a061523285613121565b94016151ba565b93615a23565b909290156153855791816000949361526861526160406152b19996018461515f565b36916112ee565b938451158015615369575b8015615344575b61530b575b5050615291613a36613a368793613121565b92604051968795869485936318cbafe560e01b8552309160048601615194565b03925af1600091816152ee575b506152dc5760405162461bcd60e51b815280613ac76004820161373d565b80613ad96152ea9251612040565b5190565b6153049192503d806000833e613afc81836102f6565b90386152be565b86929450613a366152919261533b613a369361533261532861364d565b93613b3185612522565b613b318361252f565b9593505061527f565b5060018060a01b03615362613a3161535c8851612040565b8861254f565b161561527a565b506001600160a01b0361537e613a3187612522565b1615615273565b9092916107d79461539c615261604087018761515f565b948551158015615416575b80156153f1575b6153c2575b6153bc90613121565b92615860565b94506153bc6153cf61364d565b6153dc85613b3183612522565b6153e983613b318361252f565b9590506153b3565b5060018060a01b0361540f613a316154098951612040565b8961254f565b16156153ae565b506001600160a01b0361542b613a3188612522565b16156153a7565b61544a9060203d602011611d1d57611d1581836102f6565b61520d565b9493929195600554906154668260ff9060a01c1690565b80615717575b156156b75750506001600160a01b03868116949082168581146155f9575085106155b9576154b2906154a961549f61364d565b97613b3189612522565b613b318761252f565b47936020604051809563095ea7b360e01b8252816000816154d787896004840161312b565b03925af18015611d245761550f96600095869261559c575b506040516318cbafe560e01b815297889586948593309160048601615194565b03926001600160a01b03165af1918215611d245761553392615583575b5047612064565b8061553c575b50565b61554a613a366007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d245715615539578061342d6000610352936102f6565b615597903d806000833e613afc81836102f6565b61552c565b6155b49060203d602011611d1d57611d1581836102f6565b6154ef565b5050506155d0925090602091611cc56005546103bd565b03925af18015611d24576155e15750565b6155399060203d602011611d1d57611d1581836102f6565b9596505066038d7ea4c68000861093506156a59250505057803b1561047d57604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af18015611d2457615690575b50615655613a366007546103bd565b803b1561047d576000906004604051809481936306f4a2cd60e41b83525af18015611d24576156815750565b8061342d6000610352936102f6565b8061342d600061569f936102f6565b38615646565b6155d091602091611cc56005546103bd565b9350935050509291926000146156ed5750506000808080610352946156e3613a36613a366005546103bd565b5af16133b161315b565b91602091611cc56156fd946103bd565b03926001600160a01b03165af18015611d24576155e15750565b506007546001600160a01b039061573190613a36906103bd565b16151561546c565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615bb58339815191529080a3565b1561577557565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b156157b757565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561580f57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b6158e9956158c860009695949361589f889461588060028651101561576e565b61588c613a3186612522565b6001600160a01b039081169116146157b0565b6158b5613a316158af8551612040565b8561254f565b6001600160a01b03908116911614615808565b6040516338ed173960e01b8152968795869485933091869060048701613704565b03926001600160a01b03165af16000918161593a575b506152dc5760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6159509192503d806000833e613afc81836102f6565b90386158ff565b926159986000969793959492615982889461597660028851101561576e565b61588c613a3188612522565b6158b5613a316159928751612040565b8761254f565b6158e9604051978896879586946338ed173960e01b8652309260048701613704565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b9091600095615a5c602096615a50615a9b9796615a48615a41610fd8565b9788612494565b898701612494565b62ffffff166040850152565b615a693060608501612494565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b8352600483016159ba565b03926001600160a01b03165af160009181615aec575b506107d75760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615b0f91925060203d602011615b16575b615b0781836102f6565b810190614548565b9038615ab1565b503d615afd565b91600096615b56602097615b4a615a9b989795615b42615b3b610fd8565b9889612494565b8a8801612494565b62ffffff166040860152565b615b633060608601612494565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b8352600483016159ba56fe021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f707888be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da26469706673582212200041b57e0c81e62a3a83a71cd4b6ec5252fd8f64df8c216befd97c3e5fddaad064736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.