Source Code
Latest 25 from a total of 840 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Sell Tokens | 44370327 | 154 days ago | IN | 0 S | 0.02119414 | ||||
| Buy Tokens | 42607540 | 167 days ago | IN | 0.5 S | 0.00860688 | ||||
| Buy Tokens | 42459821 | 168 days ago | IN | 1 S | 0.00860688 | ||||
| Buy Tokens | 42459625 | 168 days ago | IN | 0.5 S | 0.00789107 | ||||
| Sell Tokens | 42459531 | 168 days ago | IN | 0 S | 0.02145582 | ||||
| Buy Tokens | 42229974 | 170 days ago | IN | 1 S | 0.00626272 | ||||
| Buy Tokens | 42223888 | 170 days ago | IN | 2 S | 0.00690336 | ||||
| Buy Tokens | 42221385 | 170 days ago | IN | 3 S | 0.00716047 | ||||
| Buy Tokens | 42219635 | 170 days ago | IN | 3 S | 0.00789107 | ||||
| Buy Tokens | 41189125 | 178 days ago | IN | 1 S | 0.00716047 | ||||
| Sell Tokens | 41188992 | 178 days ago | IN | 0 S | 0.02022657 | ||||
| Buy Tokens | 40725162 | 181 days ago | IN | 1 S | 0.00716047 | ||||
| Buy Tokens | 40696377 | 181 days ago | IN | 0.4 S | 0.00789107 | ||||
| Sell Tokens | 40553067 | 182 days ago | IN | 0 S | 0.02119359 | ||||
| Sell Tokens | 40551389 | 182 days ago | IN | 0 S | 0.02022657 | ||||
| Buy Tokens | 40295665 | 184 days ago | IN | 0.5 S | 0.00626272 | ||||
| Buy Tokens | 40293641 | 184 days ago | IN | 1 S | 0.00716047 | ||||
| Buy Tokens | 39626873 | 188 days ago | IN | 0.4 S | 0.00789107 | ||||
| Buy Tokens | 39493764 | 189 days ago | IN | 0.2 S | 0.00690336 | ||||
| Sell Tokens | 38600130 | 195 days ago | IN | 0 S | 0.02022709 | ||||
| Sell Tokens | 38599033 | 195 days ago | IN | 0 S | 0.00560227 | ||||
| Buy Tokens | 38555327 | 195 days ago | IN | 0.3 S | 0.00690336 | ||||
| Buy Tokens | 38460093 | 196 days ago | IN | 0.1 S | 0.00716047 | ||||
| Buy Tokens | 38458152 | 196 days ago | IN | 7 S | 0.00716047 | ||||
| Buy Tokens | 38457570 | 196 days ago | IN | 100 S | 0.00789107 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 44370327 | 154 days ago | 29.70075 S | ||||
| 44370327 | 154 days ago | 0.14924999 S | ||||
| 44029417 | 157 days ago | 0.15 S | ||||
| 44029417 | 157 days ago | 30 S | ||||
| 44029417 | 157 days ago | Contract Creation | 0 S | |||
| 42607540 | 167 days ago | 0.0025 S | ||||
| 42459821 | 168 days ago | 0.005 S | ||||
| 42459625 | 168 days ago | 0.0025 S | ||||
| 42459531 | 168 days ago | 3.00380551 S | ||||
| 42459531 | 168 days ago | 0.0150945 S | ||||
| 42229974 | 170 days ago | 0.005 S | ||||
| 42223888 | 170 days ago | 0.01 S | ||||
| 42221385 | 170 days ago | 0.015 S | ||||
| 42219635 | 170 days ago | 0.015 S | ||||
| 42219182 | 170 days ago | 0.01 S | ||||
| 42219182 | 170 days ago | 2 S | ||||
| 42219182 | 170 days ago | Contract Creation | 0 S | |||
| 41347107 | 177 days ago | 0.015 S | ||||
| 41347107 | 177 days ago | 3 S | ||||
| 41347107 | 177 days ago | Contract Creation | 0 S | |||
| 41189125 | 178 days ago | 0.005 S | ||||
| 41188992 | 178 days ago | 0.990025 S | ||||
| 41188992 | 178 days ago | 0.00497499 S | ||||
| 41144690 | 178 days ago | 0.01 S | ||||
| 41144690 | 178 days ago | 2 S |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SonicxPool
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// @title Sonicx.fun - Decentralized Launchpad
// @notice Powered by SonicXSwap.com, enabling fast and secure transactions
// @author SuryaprakashMalgo
import "@openzeppelin/contracts/proxy/Clones.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; // Protects against reentrancy attacks
import "@openzeppelin/contracts/access/Ownable.sol"; // Provides ownership functionality
import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(
address recipient,
uint256 amount
) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(
address owner,
address spender
) external returns (uint256);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function decimals() external returns (uint8);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface SonicxswapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function getAmountsOut(
uint256 amountIn,
address[] calldata path
) external view returns (uint256[] memory amounts);
function getAmountsIn(
uint256 amountOut,
address[] calldata path
) external view returns (uint256[] memory amounts);
}
interface SonicxswapFactory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function getPair(
address tokenA,
address tokenB
) external view returns (address pair);
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
interface LPToken {
function sync() external;
}
interface IFunDeployerInterface {
function getOwnerPer() external view returns (uint256);
function emitRoyal(
address funContract,
address tokenAddress,
address router,
address baseAddress,
uint256 liquidityAmount,
uint256 tokenAmount,
uint256 _time,
uint256 totalVolume
) external;
}
interface IFunToken {
function initialize(
uint256 initialSupply,
string memory _name,
string memory _symbol,
address _midDeployer,
address _deployer
) external;
function initiateDex() external;
}
contract SonicxPool is Ownable, ReentrancyGuard {
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
uint256 public constant HUNDRED = 100;
uint256 public constant BASIS_POINTS = 10000;
AggregatorV3Interface internal dataFeed;
struct FunTokenPoolData {
uint256 reserveTokens;
uint256 reserveETH;
uint256 volume;
uint256 listThreshold;
uint256 initialReserveEth;
uint8 nativePer;
bool tradeActive;
bool lpBurn;
bool royalemitted;
}
struct FunTokenPool {
address creator;
address token;
address baseToken;
address router;
address lockerAddress;
address storedLPAddress;
address deployer;
FunTokenPoolData pool;
}
// deployer allowed to create fun tokens
mapping(address => bool) public allowedDeployers;
// user => array of fun tokens
mapping(address => address[]) public userFunTokens;
// fun token => fun token details
mapping(address => FunTokenPool) public tokenPools;
address public implementation;
uint16 public feePer;
uint16 public lpfee = 3;
event LiquidityAdded(
address indexed provider,
uint256 tokenAmount,
uint256 ethAmount
);
event sold(
address indexed user,
uint256 amountIn,
uint256 amountOut,
uint256 _time,
uint256 reserveEth,
uint256 reserveTokens,
uint256 totalVolume
);
event bought(
address indexed user,
uint256 amountIn,
uint256 amountOut,
uint256 _time,
uint256 reserveEth,
uint256 reserveTokens,
uint256 totalVolume
);
event funTradeCall(
address indexed user,
uint256 amountIn,
uint256 amountOut,
uint256 _time,
uint256 reserveEth,
uint256 reserveTokens,
string tradeType,
uint256 totalVolume
);
event listed(
address indexed user,
address indexed tokenAddress,
address indexed router,
uint256 liquidityAmount,
uint256 tokenAmount,
uint256 _time,
uint256 totalVolume
);
constructor(
address _implementation,
uint16 _feePer
) payable Ownable(msg.sender) {
implementation = _implementation;
feePer = _feePer;
dataFeed = AggregatorV3Interface(
0xc76dFb89fF298145b417d221B2c747d84952e01d
);
}
function getChainlinkDataFeedLatestAnswer() public view returns (int256) {
(
,
/* uint80 roundID */ int answer /*uint startedAt*/ /*uint timeStamp*/ /*uint80 answeredInRound*/,
,
,
) = dataFeed.latestRoundData();
return answer;
}
function createFun(
string[2] memory _name_symbol,
uint256 _totalSupply,
address _creator,
address _baseToken,
address _router,
uint256[2] memory listThreshold_initReserveEth,
bool lpBurn
) public payable returns (address funtoken) {
require(allowedDeployers[msg.sender], "not deployer");
address funToken = Clones.clone(implementation);
IFunToken(funToken).initialize(
_totalSupply,
_name_symbol[0],
_name_symbol[1],
address(this),
msg.sender
);
userFunTokens[_creator].push(funToken);
FunTokenPool memory pool;
pool.creator = _creator;
pool.token = funToken;
pool.baseToken = _baseToken;
pool.router = _router;
pool.deployer = msg.sender;
if (_baseToken == SonicxswapRouter(_router).WETH()) {
pool.pool.nativePer = 100;
} else {
pool.pool.nativePer = 50;
}
pool.pool.tradeActive = true;
pool.pool.lpBurn = lpBurn;
pool.pool.reserveTokens += _totalSupply;
pool.pool.reserveETH += (listThreshold_initReserveEth[1] + msg.value);
pool.pool.listThreshold = listThreshold_initReserveEth[0];
pool.pool.initialReserveEth = listThreshold_initReserveEth[1];
tokenPools[funToken] = pool;
emit LiquidityAdded(address(this), _totalSupply, msg.value);
return address(funToken);
}
function getAmountOutTokens(
address funToken,
uint256 amountIn
) public view returns (uint256 amountOut) {
require(amountIn > 0, "Invalid input amount");
FunTokenPool storage token = tokenPools[funToken];
require(
token.pool.reserveTokens > 0 && token.pool.reserveETH > 0,
"Invalid reserves"
);
uint256 numerator = amountIn * token.pool.reserveTokens;
uint256 denominator = (token.pool.reserveETH) + amountIn;
amountOut = numerator / denominator;
}
function getAmountOutETH(
address funToken,
uint256 amountIn
) public view returns (uint256 amountOut) {
require(amountIn > 0, "Invalid input amount");
FunTokenPool storage token = tokenPools[funToken];
require(
token.pool.reserveTokens > 0 && token.pool.reserveETH > 0,
"Invalid reserves"
);
uint256 numerator = amountIn * token.pool.reserveETH;
uint256 denominator = (token.pool.reserveTokens) + amountIn;
amountOut = numerator / denominator;
}
function getBaseToken(address funToken) public view returns (address) {
FunTokenPool storage token = tokenPools[funToken];
return address(token.baseToken);
}
function getWrapAddr(address funToken) public view returns (address) {
return SonicxswapRouter(tokenPools[funToken].router).WETH();
}
function getLatestPrice() public view returns (uint256) {
(, int256 price, , , ) = dataFeed.latestRoundData();
require(price >= 0, "Price cannot be negative");
return uint256(price * 10 ** 10);
}
function getCurrentCap(address funToken) public view returns (uint256) {
FunTokenPool storage token = tokenPools[funToken];
return
(((getLatestPrice() * token.pool.reserveETH) / 10 ** 18) *
IERC20(funToken).totalSupply()) / token.pool.reserveTokens;
}
function getFuntokenPool(
address funToken
) public view returns (FunTokenPool memory) {
return tokenPools[funToken];
}
function getFuntokenPools(
address[] memory funTokens
) public view returns (FunTokenPool[] memory) {
uint256 length = funTokens.length;
FunTokenPool[] memory pools = new FunTokenPool[](length);
for (uint256 i = 0; i < length; ) {
pools[i] = tokenPools[funTokens[i]];
unchecked {
i++;
}
}
return pools;
}
function getUserFuntokens(
address user
) public view returns (address[] memory) {
return userFunTokens[user];
}
function sellTokens(
address funToken,
uint256 tokenAmount,
uint256 minEth
) public nonReentrant returns (bool, bool) {
FunTokenPool storage token = tokenPools[funToken];
require(token.pool.tradeActive, "Trading not active");
uint256 tokenToSell = tokenAmount;
uint256 ethAmount = getAmountOutETH(funToken, tokenToSell);
uint256 ethAmountFee = (ethAmount * feePer) / 10000;
require(ethAmount > 0 && ethAmount >= minEth, "Slippage too high");
token.pool.reserveTokens += tokenAmount;
token.pool.reserveETH -= ethAmount;
token.pool.volume += ethAmount;
IERC20(funToken).transferFrom(msg.sender, address(this), tokenToSell);
(bool success, ) = owner().call{value: ethAmountFee}("");
require(success, "ownr ETH transfer failed");
(success, ) = msg.sender.call{value: ethAmount - ethAmountFee}("");
require(success, "seller ETH transfer failed");
emit sold(
msg.sender,
tokenAmount,
ethAmount,
block.timestamp,
token.pool.reserveETH,
token.pool.reserveTokens,
token.pool.volume
);
emit funTradeCall(
msg.sender,
tokenAmount,
ethAmount,
block.timestamp,
token.pool.reserveETH,
token.pool.reserveTokens,
"sell",
token.pool.volume
);
return (true, true);
}
function buyTokens(
address funToken,
uint256 minTokens
) public payable nonReentrant {
require(msg.value > 0, "Invalid buy value");
FunTokenPool storage token = tokenPools[funToken];
require(token.pool.tradeActive, "Trading not active");
{
uint256 ethAmount = msg.value;
uint256 ethAmountFee = (ethAmount * feePer) / 10000;
uint256 tokenAmount = getAmountOutTokens(
funToken,
ethAmount - ethAmountFee
);
require(tokenAmount >= minTokens, "Slippage too high");
token.pool.reserveETH += (ethAmount - ethAmountFee);
token.pool.reserveTokens -= tokenAmount;
token.pool.volume += ethAmount;
(bool success, ) = owner().call{value: ethAmountFee}("");
require(success, "fee ETH transfer failed");
IERC20(funToken).transfer(msg.sender, tokenAmount);
emit bought(
msg.sender,
msg.value,
tokenAmount,
block.timestamp,
token.pool.reserveETH,
token.pool.reserveTokens,
token.pool.volume
);
emit funTradeCall(
msg.sender,
msg.value,
tokenAmount,
block.timestamp,
token.pool.reserveETH,
token.pool.reserveTokens,
"buy",
token.pool.volume
);
}
uint256 currentMarketCap = getCurrentCap(funToken);
uint256 listThresholdCap = token.pool.listThreshold * 10 ** 18;
if (
currentMarketCap >= (listThresholdCap / 2) &&
!token.pool.royalemitted
) {
IFunDeployerInterface(token.deployer).emitRoyal(
funToken,
funToken,
token.router,
token.baseToken,
token.pool.reserveETH,
token.pool.reserveTokens,
block.timestamp,
token.pool.volume
);
token.pool.royalemitted = true;
}
if (currentMarketCap >= listThresholdCap) {
token.pool.tradeActive = false;
IFunToken(funToken).initiateDex();
token.pool.reserveETH -= token.pool.initialReserveEth;
_addLiquidityETH(
funToken,
IERC20(funToken).balanceOf(address(this)),
token.pool.reserveETH
);
token.pool.reserveETH -= token.pool.reserveETH;
}
}
function changeNativePer(address funToken, uint8 _newNativePer) public {
require(_isUserFunToken(funToken), "Unauthorized");
FunTokenPool storage token = tokenPools[funToken];
require(
token.baseToken != getWrapAddr(funToken),
"no custom base selected"
);
require(_newNativePer >= 0 && _newNativePer <= 100, "invalid per");
token.pool.nativePer = _newNativePer;
}
function _addLiquidityETH(
address funToken,
uint256 amountTokenDesired,
uint256 nativeForDex // bool lpBurn
) internal {
uint256 amountETH = nativeForDex;
uint256 amountETHMin = (amountETH * 90) / HUNDRED;
uint256 amountTokenToAddLiq = amountTokenDesired;
uint256 amountTokenMin = (amountTokenToAddLiq * 90) / HUNDRED;
FunTokenPool storage token = tokenPools[funToken];
address wrapperAddress = getWrapAddr(funToken);
token.storedLPAddress = _getpair(funToken, funToken, wrapperAddress);
address storedLPAddress = token.storedLPAddress;
_approve(funToken, false);
SonicxswapRouter(token.router).addLiquidityETH{value: amountETH}(
funToken,
amountTokenToAddLiq,
amountTokenMin,
amountETHMin,
address(this),
block.timestamp + (300)
);
uint256 lpBalance = IERC20(storedLPAddress).balanceOf(address(this));
// Calculate LP fee distribution
uint256 ownerLPFee = (lpBalance * lpfee) / 100; // Owner's LP fee
uint256 deadLPAmount = lpBalance - ownerLPFee; // Remaining sent to DEAD address
//3% Transfer LP tokens
IERC20(storedLPAddress).transfer(owner(), ownerLPFee); // Send LP fee to owner
//97%
IERC20(storedLPAddress).transfer(DEAD, deadLPAmount); // Send the rest to DEAD address
emit listed(
msg.sender,
funToken,
token.router,
amountETH,
amountTokenToAddLiq,
block.timestamp,
token.pool.volume
);
}
function _approve(
address funToken,
bool isBaseToken
) internal returns (bool) {
FunTokenPool storage token = tokenPools[funToken];
IERC20 token_ = IERC20(funToken);
if (isBaseToken) {
token_ = IERC20(token.baseToken);
}
if (token_.allowance(address(this), token.router) == 0) {
token_.approve(token.router, type(uint256).max);
}
return true;
}
function _approveLock(
address _lp,
address _lockDeployer
) internal returns (bool) {
IERC20 lp_ = IERC20(_lp);
if (lp_.allowance(address(this), _lockDeployer) == 0) {
lp_.approve(_lockDeployer, type(uint256).max);
}
return true;
}
function _getpair(
address funToken,
address _token1,
address _token2
) internal returns (address) {
address router = tokenPools[funToken].router;
address factory = SonicxswapRouter(router).factory();
address pair = SonicxswapFactory(factory).getPair(_token1, _token2);
if (pair != address(0)) {
return pair;
} else {
return SonicxswapFactory(factory).createPair(_token1, _token2);
}
}
function _isUserFunToken(address funToken) internal view returns (bool) {
for (uint256 i = 0; i < userFunTokens[msg.sender].length; ) {
if (funToken == userFunTokens[msg.sender][i]) {
return true;
}
unchecked {
i++;
}
}
return false;
}
function addDeployer(address _deployer) public onlyOwner {
allowedDeployers[_deployer] = true;
}
function removeDeployer(address _deployer) public onlyOwner {
allowedDeployers[_deployer] = false;
}
function updateImplementation(address _implementation) public onlyOwner {
require(_implementation != address(0));
implementation = _implementation;
}
function updateteamFeeper(uint16 _newFeePer) public onlyOwner {
feePer = _newFeePer;
}
function updateLpfee(uint16 _lpfee) public onlyOwner {
lpfee = _lpfee;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// solhint-disable-next-line interface-starts-with-i
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(
uint80 _roundId
) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}// 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.2.0) (proxy/Clones.sol)
pragma solidity ^0.8.20;
import {Create2} from "../utils/Create2.sol";
import {Errors} from "../utils/Errors.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*/
library Clones {
error CloneArgumentsTooLong();
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
return clone(implementation, 0);
}
/**
* @dev Same as {xref-Clones-clone-address-}[clone], but with a `value` parameter to send native currency
* to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function clone(address implementation, uint256 value) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(value, 0x09, 0x37)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple times will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
return cloneDeterministic(implementation, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministic-address-bytes32-}[cloneDeterministic], but with
* a `value` parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministic(
address implementation,
bytes32 salt,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(value, 0x09, 0x37, salt)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly ("memory-safe") {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := and(keccak256(add(ptr, 0x43), 0x55), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddress(implementation, salt, address(this));
}
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create opcode, which should never revert.
*/
function cloneWithImmutableArgs(address implementation, bytes memory args) internal returns (address instance) {
return cloneWithImmutableArgs(implementation, args, 0);
}
/**
* @dev Same as {xref-Clones-cloneWithImmutableArgs-address-bytes-}[cloneWithImmutableArgs], but with a `value`
* parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneWithImmutableArgs(
address implementation,
bytes memory args,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
assembly ("memory-safe") {
instance := create(value, add(bytecode, 0x20), mload(bytecode))
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy the clone. Using the same
* `implementation`, `args` and `salt` multiple times will revert, since the clones cannot be deployed twice
* at the same address.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal returns (address instance) {
return cloneDeterministicWithImmutableArgs(implementation, args, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministicWithImmutableArgs-address-bytes-bytes32-}[cloneDeterministicWithImmutableArgs],
* but with a `value` parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
uint256 value
) internal returns (address instance) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.deploy(value, salt, bytecode);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.computeAddress(salt, keccak256(bytecode), deployer);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddressWithImmutableArgs(implementation, args, salt, address(this));
}
/**
* @dev Get the immutable args attached to a clone.
*
* - If `instance` is a clone that was deployed using `clone` or `cloneDeterministic`, this
* function will return an empty array.
* - If `instance` is a clone that was deployed using `cloneWithImmutableArgs` or
* `cloneDeterministicWithImmutableArgs`, this function will return the args array used at
* creation.
* - If `instance` is NOT a clone deployed using this library, the behavior is undefined. This
* function should only be used to check addresses that are known to be clones.
*/
function fetchCloneArgs(address instance) internal view returns (bytes memory) {
bytes memory result = new bytes(instance.code.length - 45); // revert if length is too short
assembly ("memory-safe") {
extcodecopy(instance, add(result, 32), 45, mload(result))
}
return result;
}
/**
* @dev Helper that prepares the initcode of the proxy with immutable args.
*
* An assembly variant of this function requires copying the `args` array, which can be efficiently done using
* `mcopy`. Unfortunately, that opcode is not available before cancun. A pure solidity implementation using
* abi.encodePacked is more expensive but also more portable and easier to review.
*
* NOTE: https://eips.ethereum.org/EIPS/eip-170[EIP-170] limits the length of the contract code to 24576 bytes.
* With the proxy code taking 45 bytes, that limits the length of the immutable args to 24531 bytes.
*/
function _cloneCodeWithImmutableArgs(
address implementation,
bytes memory args
) private pure returns (bytes memory) {
if (args.length > 24531) revert CloneArgumentsTooLong();
return
abi.encodePacked(
hex"61",
uint16(args.length + 45),
hex"3d81600a3d39f3363d3d373d3d3d363d73",
implementation,
hex"5af43d82803e903d91602b57fd5bf3",
args
);
}
}// 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
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
/**
* @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
* `CREATE2` can be used to compute in advance the address where a smart
* contract will be deployed, which allows for interesting new mechanisms known
* as 'counterfactual interactions'.
*
* See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
* information.
*/
library Create2 {
/**
* @dev There's no code to deploy.
*/
error Create2EmptyBytecode();
/**
* @dev Deploys a contract using `CREATE2`. The address where the contract
* will be deployed can be known in advance via {computeAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
*
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already.
* - the factory must have a balance of at least `amount`.
* - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
*/
function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
if (bytecode.length == 0) {
revert Create2EmptyBytecode();
}
assembly ("memory-safe") {
addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
// if no address was created, and returndata is not empty, bubble revert
if and(iszero(addr), not(iszero(returndatasize()))) {
let p := mload(0x40)
returndatacopy(p, 0, returndatasize())
revert(p, returndatasize())
}
}
if (addr == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
* `bytecodeHash` or `salt` will result in a new destination address.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
return computeAddress(salt, bytecodeHash, address(this));
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
* `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
assembly ("memory-safe") {
let ptr := mload(0x40) // Get free memory pointer
// | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |
// |-------------------|---------------------------------------------------------------------------|
// | bytecodeHash | CCCCCCCCCCCCC...CC |
// | salt | BBBBBBBBBBBBB...BB |
// | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |
// | 0xFF | FF |
// |-------------------|---------------------------------------------------------------------------|
// | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
// | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |
mstore(add(ptr, 0x40), bytecodeHash)
mstore(add(ptr, 0x20), salt)
mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
mstore8(start, 0xff)
addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*
* _Available since v5.1._
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"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":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"uint16","name":"_feePer","type":"uint16"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalVolume","type":"uint256"}],"name":"bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"indexed":false,"internalType":"string","name":"tradeType","type":"string"},{"indexed":false,"internalType":"uint256","name":"totalVolume","type":"uint256"}],"name":"funTradeCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidityAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalVolume","type":"uint256"}],"name":"listed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalVolume","type":"uint256"}],"name":"sold","type":"event"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_deployer","type":"address"}],"name":"addDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedDeployers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"},{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"},{"internalType":"uint8","name":"_newNativePer","type":"uint8"}],"name":"changeNativePer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[2]","name":"_name_symbol","type":"string[2]"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256[2]","name":"listThreshold_initReserveEth","type":"uint256[2]"},{"internalType":"bool","name":"lpBurn","type":"bool"}],"name":"createFun","outputs":[{"internalType":"address","name":"funtoken","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePer","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getAmountOutETH","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getAmountOutTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"}],"name":"getBaseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainlinkDataFeedLatestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"}],"name":"getCurrentCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"}],"name":"getFuntokenPool","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct SonicxPool.FunTokenPoolData","name":"pool","type":"tuple"}],"internalType":"struct SonicxPool.FunTokenPool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"funTokens","type":"address[]"}],"name":"getFuntokenPools","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct SonicxPool.FunTokenPoolData","name":"pool","type":"tuple"}],"internalType":"struct SonicxPool.FunTokenPool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserFuntokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"}],"name":"getWrapAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpfee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_deployer","type":"address"}],"name":"removeDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"funToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minEth","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPools","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct SonicxPool.FunTokenPoolData","name":"pool","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"updateImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_lpfee","type":"uint16"}],"name":"updateLpfee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFeePer","type":"uint16"}],"name":"updateteamFeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userFunTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526003600660166101000a81548161ffff021916908361ffff16021790555060405162005ceb38038062005ceb8339818101604052810190620000479190620002fe565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000bd5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000b4919062000356565b60405180910390fd5b620000ce816200019160201b60201c565b506001808190555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660146101000a81548161ffff021916908361ffff16021790555073c76dfb89ff298145b417d221b2c747d84952e01d600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000373565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000287826200025a565b9050919050565b62000299816200027a565b8114620002a557600080fd5b50565b600081519050620002b9816200028e565b92915050565b600061ffff82169050919050565b620002d881620002bf565b8114620002e457600080fd5b50565b600081519050620002f881620002cd565b92915050565b6000806040838503121562000318576200031762000255565b5b60006200032885828601620002a8565b92505060206200033b85828601620002e7565b9150509250929050565b62000350816200027a565b82525050565b60006020820190506200036d600083018462000345565b92915050565b61596880620003836000396000f3fe6080604052600436106101d85760003560e01c80638da5cb5b11610102578063c3d2c3c111610095578063f2fde38b11610064578063f2fde38b1461071e578063f315df8614610747578063f85fc0ab14610770578063fa7e03651461079b576101d8565b8063c3d2c3c114610648578063ceeee9df1461068c578063e1f1c4a7146106b5578063e4e57b9e146106e0576101d8565b8063b536b78e116100d1578063b536b78e14610578578063bea4dfb5146105b5578063c2e4d08f146105e0578063c34223fb1461060b576101d8565b80638da5cb5b146104a85780638e15f473146104d35780639c8c3648146104fe578063a1e1fbc21461053b576101d8565b80635c60da1b1161017a578063715018a611610149578063715018a61461040f57806372521cc3146104265780637fec435314610456578063880f40391461047f576101d8565b80635c60da1b1461032d5780636832e5de146103585780636d090218146103955780636f3eebae146103d2576101d8565b80630c10fd0f116101b65780630c10fd0f1461024d578063172083ce1461028a5780632c612832146102b35780634d6dcae1146102f0576101d8565b8063025b22bc146101dd57806303fd2a45146102065780630752881a14610231575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613e23565b6107c6565b005b34801561021257600080fd5b5061021b61084b565b6040516102289190613e5f565b60405180910390f35b61024b60048036038101906102469190613eb0565b610851565b005b34801561025957600080fd5b50610274600480360381019061026f9190613e23565b610f20565b6040516102819190613e5f565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190613f29565b610f91565b005b3480156102bf57600080fd5b506102da60048036038101906102d59190613e23565b611132565b6040516102e79190613f78565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613eb0565b611236565b6040516103249190613f78565b60405180910390f35b34801561033957600080fd5b5061034261135f565b60405161034f9190613e5f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613eb0565b611385565b60405161038c9190613f78565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613e23565b6114ae565b6040516103c99190613fae565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190613e23565b6114ce565b6040516104069190613e5f565b60405180910390f35b34801561041b57600080fd5b506104246115a8565b005b610440600480360381019061043b91906142c0565b6115bc565b60405161044d9190613e5f565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906143b9565b611dd6565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613e23565b611dfe565b005b3480156104b457600080fd5b506104bd611e61565b6040516104ca9190613e5f565b60405180910390f35b3480156104df57600080fd5b506104e8611e8a565b6040516104f59190613f78565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190613e23565b611f7f565b60405161053291906144a4565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190614589565b61204c565b60405161056f9190614808565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613e23565b612461565b6040516105ac91906148cc565b60405180910390f35b3480156105c157600080fd5b506105ca6127ca565b6040516105d79190614901565b60405180910390f35b3480156105ec57600080fd5b506105f561286b565b604051610602919061492b565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190613eb0565b61287f565b60405161063f9190613e5f565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613e23565b6128cd565b6040516106839897969594939291906149fd565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906143b9565b612aa0565b005b3480156106c157600080fd5b506106ca612ac8565b6040516106d79190613f78565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190614a7b565b612ace565b604051610715929190614ace565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613e23565b612f3e565b005b34801561075357600080fd5b5061076e60048036038101906107699190613e23565b612fc4565b005b34801561077c57600080fd5b50610785613027565b6040516107929190613f78565b60405180910390f35b3480156107a757600080fd5b506107b061302c565b6040516107bd919061492b565b60405180910390f35b6107ce613040565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361080757600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61dead81565b6108596130c7565b6000341161089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390614b54565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060070160050160019054906101000a900460ff16610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614bc0565b60405180910390fd5b60003490506000612710600660149054906101000a900461ffff1661ffff168361095d9190614c0f565b6109679190614c80565b9050600061098086838561097b9190614cb1565b611236565b9050848110156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614d31565b60405180910390fd5b81836109d19190614cb1565b8460070160010160008282546109e79190614d51565b9250508190555080846007016000016000828254610a059190614cb1565b9250508190555082846007016002016000828254610a239190614d51565b925050819055506000610a34611e61565b73ffffffffffffffffffffffffffffffffffffffff1683604051610a5790614db6565b60006040518083038185875af1925050503d8060008114610a94576040519150601f19603f3d011682016040523d82523d6000602084013e610a99565b606091505b5050905080610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490614e17565b60405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610b18929190614e37565b6020604051808303816000875af1158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b9190614e75565b503373ffffffffffffffffffffffffffffffffffffffff167f2ab932704044a97dfcb4c1cbd1ddfd869c7d10bc1e42daac2e1056cbb05449b334844289600701600101548a600701600001548b60070160020154604051610bc196959493929190614ea2565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167fb66c0615d3b6ef6e11182c9630d64a5f82fd527023c2017652c002d982ed0e1134844289600701600101548a600701600001548b60070160020154604051610c2e96959493929190614f4f565b60405180910390a2505050506000610c4584611132565b90506000670de0b6b3a76400008360070160030154610c649190614c0f565b9050600281610c739190614c80565b8210158015610c9457508260070160050160039054906101000a900460ff16155b15610db4578260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663886f5e8e86878660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600701600101548960070160000154428b600701600201546040518963ffffffff1660e01b8152600401610d61989796959493929190614fc3565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b5050505060018360070160050160036101000a81548160ff0219169083151502179055505b808210610f115760008360070160050160016101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff1663d51669946040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e2357600080fd5b505af1158015610e37573d6000803e3d6000fd5b505050508260070160040154836007016001016000828254610e599190614cb1565b92505081905550610eeb858673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9d9190613e5f565b602060405180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190615056565b856007016001015461310d565b8260070160010154836007016001016000828254610f099190614cb1565b925050819055505b505050610f1c61355f565b5050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b610f9a82613568565b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906150cf565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611025836114ce565b73ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad9061513b565b60405180910390fd5b60008260ff16101580156110ce575060648260ff1611155b61110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906151a7565b60405180910390fd5b818160070160050160006101000a81548160ff021916908360ff160217905550505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600701600001548373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed9190615056565b670de0b6b3a76400008360070160010154611206611e8a565b6112109190614c0f565b61121a9190614c80565b6112249190614c0f565b61122e9190614c80565b915050919050565b600080821161127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190615213565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600701600001541180156112db575060008160070160010154115b61131a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113119061527f565b60405180910390fd5b600081600701600001548461132f9190614c0f565b905060008483600701600101546113469190614d51565b905080826113549190614c80565b935050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008082116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090615213565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816007016000015411801561142a575060008160070160010154115b611469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114609061527f565b60405180910390fd5b600081600701600101548461147e9190614c0f565b905060008483600701600001546114959190614d51565b905080826114a39190614c80565b935050505092915050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a191906152b4565b9050919050565b6115b0613040565b6115ba600061368a565b565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661164a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116419061532d565b60405180910390fd5b6000611677600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661374e565b90508073ffffffffffffffffffffffffffffffffffffffff166366faaae3898b6000600281106116aa576116a961534d565b5b60200201518c6001600281106116c3576116c261534d565b5b602002015130336040518663ffffffff1660e01b81526004016116ea9594939291906153ea565b600060405180830381600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b50505050600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506117c4613c77565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050338160c0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906152b4565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036119995760648160e0015160a0019060ff16908160ff16815250506119b1565b60328160e0015160a0019060ff16908160ff16815250505b60018160e0015160c0019015159081151581525050838160e0015160e0019015159081151581525050888160e001516000018181516119f09190614d51565b915081815250503485600160028110611a0c57611a0b61534d565b5b6020020151611a1b9190614d51565b8160e00151602001818151611a309190614d51565b9150818152505084600060028110611a4b57611a4a61534d565b5b60200201518160e00151606001818152505084600160028110611a7157611a7061534d565b5b60200201518160e00151608001818152505080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e082015181600701600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908360ff16021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff02191690831515021790555050509050503073ffffffffffffffffffffffffffffffffffffffff167fac1d76749e5447b7b16f5ab61447e1bd502f3bb4807af3b28e620d1700a6ee458a34604051611dbe92919061544b565b60405180910390a28192505050979650505050505050565b611dde613040565b80600660146101000a81548161ffff021916908361ffff16021790555050565b611e06613040565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e91906154e2565b5050509150506000811215611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f906155a9565b60405180910390fd5b6402540be40081611f7991906155c9565b91505090565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561204057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ff6575b50505050509050919050565b606060008251905060008167ffffffffffffffff8111156120705761206f613fdf565b5b6040519080825280602002602001820160405280156120a957816020015b612096613c77565b81526020019060019003908161208e5790505b50905060005b8281101561245657600560008683815181106120ce576120cd61534d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016006820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600782016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff1615151515815250508152505082828151811061243e5761243d61534d565b5b602002602001018190525080806001019150506120af565b508092505050919050565b612469613c77565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016006820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600782016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff161515151581525050815250509050919050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e91906154e2565b5050509150508091505090565b600660149054906101000a900461ffff1681565b6004602052816000526040600020818154811061289b57600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806007016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff161515151581525050905088565b612aa8613040565b80600660166101000a81548161ffff021916908361ffff16021790555050565b61271081565b600080612ad96130c7565b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060070160050160019054906101000a900460ff16612b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6790614bc0565b60405180910390fd5b60008590506000612b818883611385565b90506000612710600660149054906101000a900461ffff1661ffff1683612ba89190614c0f565b612bb29190614c80565b9050600082118015612bc45750868210155b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614d31565b60405180910390fd5b87846007016000016000828254612c1a9190614d51565b9250508190555081846007016001016000828254612c389190614cb1565b9250508190555081846007016002016000828254612c569190614d51565b925050819055508873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612c9a93929190615641565b6020604051808303816000875af1158015612cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdd9190614e75565b506000612ce8611e61565b73ffffffffffffffffffffffffffffffffffffffff1682604051612d0b90614db6565b60006040518083038185875af1925050503d8060008114612d48576040519150601f19603f3d011682016040523d82523d6000602084013e612d4d565b606091505b5050905080612d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d88906156c4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168284612db49190614cb1565b604051612dc090614db6565b60006040518083038185875af1925050503d8060008114612dfd576040519150601f19603f3d011682016040523d82523d6000602084013e612e02565b606091505b50508091505080612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f90615730565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fb5c4deeb00ec61f7509ac91d1423c0125ef5de64d15d79c41b3cb6ef7e7daca88a854289600701600101548a600701600001548b60070160020154604051612ead96959493929190614ea2565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167fb66c0615d3b6ef6e11182c9630d64a5f82fd527023c2017652c002d982ed0e118a854289600701600101548a600701600001548b60070160020154604051612f1a9695949392919061579c565b60405180910390a2600180965096505050505050612f3661355f565b935093915050565b612f46613040565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fb85760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612faf9190613e5f565b60405180910390fd5b612fc18161368a565b50565b612fcc613040565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606481565b600660169054906101000a900461ffff1681565b613048613762565b73ffffffffffffffffffffffffffffffffffffffff16613066611e61565b73ffffffffffffffffffffffffffffffffffffffff16146130c557613089613762565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016130bc9190613e5f565b60405180910390fd5b565b600260015403613103576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b600081905060006064605a836131239190614c0f565b61312d9190614c80565b9050600084905060006064605a836131459190614c0f565b61314f9190614c80565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061319f896114ce565b90506131ac898a8361376a565b8260050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506132228a600061398f565b508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719888c88888b3061012c426132779190614d51565b6040518863ffffffff1660e01b815260040161329896959493929190615810565b60606040518083038185885af11580156132b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132db9190615871565b50505060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133199190613e5f565b602060405180830381865afa158015613336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335a9190615056565b905060006064600660169054906101000a900461ffff1661ffff16836133809190614c0f565b61338a9190614c80565b90506000818361339a9190614cb1565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133c0611e61565b846040518363ffffffff1660e01b81526004016133de929190614e37565b6020604051808303816000875af11580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190614e75565b508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead836040518363ffffffff1660e01b815260040161345f929190614e37565b6020604051808303816000875af115801561347e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a29190614e75565b508560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f630616749c0aa3ac2b8943843261fd2d07d0045dde6fe2a8b25381b8e6dc0f278d8c428c6007016002015460405161354894939291906158c4565b60405180910390a450505050505050505050505050565b60018081905550565b600080600090505b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561367f57600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061360b5761360a61534d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613672576001915050613685565b8080600101915050613570565b50600090505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061375b826000613b7f565b9050919050565b600033905090565b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384391906152b4565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e6a4390587876040518363ffffffff1660e01b8152600401613882929190615909565b602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c391906152b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461390457809350505050613988565b8173ffffffffffffffffffffffffffffffffffffffff1663c9c6539687876040518363ffffffff1660e01b815260040161393f929190615909565b6020604051808303816000875af115801561395e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061398291906152b4565b93505050505b9392505050565b600080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008490508315613a06578160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e308560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401613a67929190615909565b6020604051808303816000875af1158015613a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aaa9190615056565b03613b73578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b38360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613b2e929190614e37565b6020604051808303816000875af1158015613b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b719190614e75565b505b60019250505092915050565b600081471015613bc85747826040517fcf479181000000000000000000000000000000000000000000000000000000008152600401613bbf92919061544b565b60405180910390fd5b763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b176020526037600983f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613c71576040517fb06ebf3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001613d56613d5c565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681526020016000151581526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613df082613dc5565b9050919050565b613e0081613de5565b8114613e0b57600080fd5b50565b600081359050613e1d81613df7565b92915050565b600060208284031215613e3957613e38613dbb565b5b6000613e4784828501613e0e565b91505092915050565b613e5981613de5565b82525050565b6000602082019050613e746000830184613e50565b92915050565b6000819050919050565b613e8d81613e7a565b8114613e9857600080fd5b50565b600081359050613eaa81613e84565b92915050565b60008060408385031215613ec757613ec6613dbb565b5b6000613ed585828601613e0e565b9250506020613ee685828601613e9b565b9150509250929050565b600060ff82169050919050565b613f0681613ef0565b8114613f1157600080fd5b50565b600081359050613f2381613efd565b92915050565b60008060408385031215613f4057613f3f613dbb565b5b6000613f4e85828601613e0e565b9250506020613f5f85828601613f14565b9150509250929050565b613f7281613e7a565b82525050565b6000602082019050613f8d6000830184613f69565b92915050565b60008115159050919050565b613fa881613f93565b82525050565b6000602082019050613fc36000830184613f9f565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61401782613fce565b810181811067ffffffffffffffff8211171561403657614035613fdf565b5b80604052505050565b6000614049613db1565b9050614055828261400e565b919050565b600067ffffffffffffffff82111561407557614074613fdf565b5b602082029050919050565b600080fd5b600080fd5b600067ffffffffffffffff8211156140a5576140a4613fdf565b5b6140ae82613fce565b9050602081019050919050565b82818337600083830152505050565b60006140dd6140d88461408a565b61403f565b9050828152602081018484840111156140f9576140f8614085565b5b6141048482856140bb565b509392505050565b600082601f83011261412157614120613fc9565b5b81356141318482602086016140ca565b91505092915050565b600061414d6141488461405a565b61403f565b9050806020840283018581111561416757614166614080565b5b835b818110156141ae57803567ffffffffffffffff81111561418c5761418b613fc9565b5b808601614199898261410c565b85526020850194505050602081019050614169565b5050509392505050565b600082601f8301126141cd576141cc613fc9565b5b60026141da84828561413a565b91505092915050565b600067ffffffffffffffff8211156141fe576141fd613fdf565b5b602082029050919050565b600061421c614217846141e3565b61403f565b9050806020840283018581111561423657614235614080565b5b835b8181101561425f578061424b8882613e9b565b845260208401935050602081019050614238565b5050509392505050565b600082601f83011261427e5761427d613fc9565b5b600261428b848285614209565b91505092915050565b61429d81613f93565b81146142a857600080fd5b50565b6000813590506142ba81614294565b92915050565b6000806000806000806000610100888a0312156142e0576142df613dbb565b5b600088013567ffffffffffffffff8111156142fe576142fd613dc0565b5b61430a8a828b016141b8565b975050602061431b8a828b01613e9b565b965050604061432c8a828b01613e0e565b955050606061433d8a828b01613e0e565b945050608061434e8a828b01613e0e565b93505060a061435f8a828b01614269565b92505060e06143708a828b016142ab565b91505092959891949750929550565b600061ffff82169050919050565b6143968161437f565b81146143a157600080fd5b50565b6000813590506143b38161438d565b92915050565b6000602082840312156143cf576143ce613dbb565b5b60006143dd848285016143a4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61441b81613de5565b82525050565b600061442d8383614412565b60208301905092915050565b6000602082019050919050565b6000614451826143e6565b61445b81856143f1565b935061446683614402565b8060005b8381101561449757815161447e8882614421565b975061448983614439565b92505060018101905061446a565b5085935050505092915050565b600060208201905081810360008301526144be8184614446565b905092915050565b600067ffffffffffffffff8211156144e1576144e0613fdf565b5b602082029050602081019050919050565b6000614505614500846144c6565b61403f565b9050808382526020820190506020840283018581111561452857614527614080565b5b835b81811015614551578061453d8882613e0e565b84526020840193505060208101905061452a565b5050509392505050565b600082601f8301126145705761456f613fc9565b5b81356145808482602086016144f2565b91505092915050565b60006020828403121561459f5761459e613dbb565b5b600082013567ffffffffffffffff8111156145bd576145bc613dc0565b5b6145c98482850161455b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61460781613e7a565b82525050565b61461681613ef0565b82525050565b61462581613f93565b82525050565b6101208201600082015161464260008501826145fe565b50602082015161465560208501826145fe565b50604082015161466860408501826145fe565b50606082015161467b60608501826145fe565b50608082015161468e60808501826145fe565b5060a08201516146a160a085018261460d565b5060c08201516146b460c085018261461c565b5060e08201516146c760e085018261461c565b506101008201516146dc61010085018261461c565b50505050565b610200820160008201516146f96000850182614412565b50602082015161470c6020850182614412565b50604082015161471f6040850182614412565b5060608201516147326060850182614412565b5060808201516147456080850182614412565b5060a082015161475860a0850182614412565b5060c082015161476b60c0850182614412565b5060e082015161477e60e085018261462b565b50505050565b600061479083836146e2565b6102008301905092915050565b6000602082019050919050565b60006147b5826145d2565b6147bf81856145dd565b93506147ca836145ee565b8060005b838110156147fb5781516147e28882614784565b97506147ed8361479d565b9250506001810190506147ce565b5085935050505092915050565b6000602082019050818103600083015261482281846147aa565b905092915050565b610200820160008201516148416000850182614412565b5060208201516148546020850182614412565b5060408201516148676040850182614412565b50606082015161487a6060850182614412565b50608082015161488d6080850182614412565b5060a08201516148a060a0850182614412565b5060c08201516148b360c0850182614412565b5060e08201516148c660e085018261462b565b50505050565b6000610200820190506148e2600083018461482a565b92915050565b6000819050919050565b6148fb816148e8565b82525050565b600060208201905061491660008301846148f2565b92915050565b6149258161437f565b82525050565b6000602082019050614940600083018461491c565b92915050565b6101208201600082015161495d60008501826145fe565b50602082015161497060208501826145fe565b50604082015161498360408501826145fe565b50606082015161499660608501826145fe565b5060808201516149a960808501826145fe565b5060a08201516149bc60a085018261460d565b5060c08201516149cf60c085018261461c565b5060e08201516149e260e085018261461c565b506101008201516149f761010085018261461c565b50505050565b600061020082019050614a13600083018b613e50565b614a20602083018a613e50565b614a2d6040830189613e50565b614a3a6060830188613e50565b614a476080830187613e50565b614a5460a0830186613e50565b614a6160c0830185613e50565b614a6e60e0830184614946565b9998505050505050505050565b600080600060608486031215614a9457614a93613dbb565b5b6000614aa286828701613e0e565b9350506020614ab386828701613e9b565b9250506040614ac486828701613e9b565b9150509250925092565b6000604082019050614ae36000830185613f9f565b614af06020830184613f9f565b9392505050565b600082825260208201905092915050565b7f496e76616c6964206275792076616c7565000000000000000000000000000000600082015250565b6000614b3e601183614af7565b9150614b4982614b08565b602082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614baa601283614af7565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c1a82613e7a565b9150614c2583613e7a565b9250828202614c3381613e7a565b91508282048414831517614c4a57614c49614be0565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c8b82613e7a565b9150614c9683613e7a565b925082614ca657614ca5614c51565b5b828204905092915050565b6000614cbc82613e7a565b9150614cc783613e7a565b9250828203905081811115614cdf57614cde614be0565b5b92915050565b7f536c69707061676520746f6f2068696768000000000000000000000000000000600082015250565b6000614d1b601183614af7565b9150614d2682614ce5565b602082019050919050565b60006020820190508181036000830152614d4a81614d0e565b9050919050565b6000614d5c82613e7a565b9150614d6783613e7a565b9250828201905080821115614d7f57614d7e614be0565b5b92915050565b600081905092915050565b50565b6000614da0600083614d85565b9150614dab82614d90565b600082019050919050565b6000614dc182614d93565b9150819050919050565b7f66656520455448207472616e73666572206661696c6564000000000000000000600082015250565b6000614e01601783614af7565b9150614e0c82614dcb565b602082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b6000604082019050614e4c6000830185613e50565b614e596020830184613f69565b9392505050565b600081519050614e6f81614294565b92915050565b600060208284031215614e8b57614e8a613dbb565b5b6000614e9984828501614e60565b91505092915050565b600060c082019050614eb76000830189613f69565b614ec46020830188613f69565b614ed16040830187613f69565b614ede6060830186613f69565b614eeb6080830185613f69565b614ef860a0830184613f69565b979650505050505050565b7f6275790000000000000000000000000000000000000000000000000000000000600082015250565b6000614f39600383614af7565b9150614f4482614f03565b602082019050919050565b600060e082019050614f646000830189613f69565b614f716020830188613f69565b614f7e6040830187613f69565b614f8b6060830186613f69565b614f986080830185613f69565b81810360a0830152614fa981614f2c565b9050614fb860c0830184613f69565b979650505050505050565b600061010082019050614fd9600083018b613e50565b614fe6602083018a613e50565b614ff36040830189613e50565b6150006060830188613e50565b61500d6080830187613f69565b61501a60a0830186613f69565b61502760c0830185613f69565b61503460e0830184613f69565b9998505050505050505050565b60008151905061505081613e84565b92915050565b60006020828403121561506c5761506b613dbb565b5b600061507a84828501615041565b91505092915050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006150b9600c83614af7565b91506150c482615083565b602082019050919050565b600060208201905081810360008301526150e8816150ac565b9050919050565b7f6e6f20637573746f6d20626173652073656c6563746564000000000000000000600082015250565b6000615125601783614af7565b9150615130826150ef565b602082019050919050565b6000602082019050818103600083015261515481615118565b9050919050565b7f696e76616c696420706572000000000000000000000000000000000000000000600082015250565b6000615191600b83614af7565b915061519c8261515b565b602082019050919050565b600060208201905081810360008301526151c081615184565b9050919050565b7f496e76616c696420696e70757420616d6f756e74000000000000000000000000600082015250565b60006151fd601483614af7565b9150615208826151c7565b602082019050919050565b6000602082019050818103600083015261522c816151f0565b9050919050565b7f496e76616c696420726573657276657300000000000000000000000000000000600082015250565b6000615269601083614af7565b915061527482615233565b602082019050919050565b600060208201905081810360008301526152988161525c565b9050919050565b6000815190506152ae81613df7565b92915050565b6000602082840312156152ca576152c9613dbb565b5b60006152d88482850161529f565b91505092915050565b7f6e6f74206465706c6f7965720000000000000000000000000000000000000000600082015250565b6000615317600c83614af7565b9150615322826152e1565b602082019050919050565b600060208201905081810360008301526153468161530a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b60005b838110156153a557808201518184015260208101905061538a565b60008484015250505050565b60006153bc8261537c565b6153c68185614af7565b93506153d6818560208601615387565b6153df81613fce565b840191505092915050565b600060a0820190506153ff6000830188613f69565b818103602083015261541181876153b1565b9050818103604083015261542581866153b1565b90506154346060830185613e50565b6154416080830184613e50565b9695505050505050565b60006040820190506154606000830185613f69565b61546d6020830184613f69565b9392505050565b600069ffffffffffffffffffff82169050919050565b61549381615474565b811461549e57600080fd5b50565b6000815190506154b08161548a565b92915050565b6154bf816148e8565b81146154ca57600080fd5b50565b6000815190506154dc816154b6565b92915050565b600080600080600060a086880312156154fe576154fd613dbb565b5b600061550c888289016154a1565b955050602061551d888289016154cd565b945050604061552e88828901615041565b935050606061553f88828901615041565b9250506080615550888289016154a1565b9150509295509295909350565b7f50726963652063616e6e6f74206265206e656761746976650000000000000000600082015250565b6000615593601883614af7565b915061559e8261555d565b602082019050919050565b600060208201905081810360008301526155c281615586565b9050919050565b60006155d4826148e8565b91506155df836148e8565b92508282026155ed816148e8565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561562557615624614be0565b5b828205841483151761563a57615639614be0565b5b5092915050565b60006060820190506156566000830186613e50565b6156636020830185613e50565b6156706040830184613f69565b949350505050565b7f6f776e7220455448207472616e73666572206661696c65640000000000000000600082015250565b60006156ae601883614af7565b91506156b982615678565b602082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f73656c6c657220455448207472616e73666572206661696c6564000000000000600082015250565b600061571a601a83614af7565b9150615725826156e4565b602082019050919050565b600060208201905081810360008301526157498161570d565b9050919050565b7f73656c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000615786600483614af7565b915061579182615750565b602082019050919050565b600060e0820190506157b16000830189613f69565b6157be6020830188613f69565b6157cb6040830187613f69565b6157d86060830186613f69565b6157e56080830185613f69565b81810360a08301526157f681615779565b905061580560c0830184613f69565b979650505050505050565b600060c0820190506158256000830189613e50565b6158326020830188613f69565b61583f6040830187613f69565b61584c6060830186613f69565b6158596080830185613e50565b61586660a0830184613f69565b979650505050505050565b60008060006060848603121561588a57615889613dbb565b5b600061589886828701615041565b93505060206158a986828701615041565b92505060406158ba86828701615041565b9150509250925092565b60006080820190506158d96000830187613f69565b6158e66020830186613f69565b6158f36040830185613f69565b6159006060830184613f69565b95945050505050565b600060408201905061591e6000830185613e50565b61592b6020830184613e50565b939250505056fea264697066735822122020e14f8fadf9e27339a316bdb1ee58682474847deae8e98d387440223801d60c64736f6c63430008140033000000000000000000000000be97f14f11f97f7299fefc82926bfa8e339badf80000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80638da5cb5b11610102578063c3d2c3c111610095578063f2fde38b11610064578063f2fde38b1461071e578063f315df8614610747578063f85fc0ab14610770578063fa7e03651461079b576101d8565b8063c3d2c3c114610648578063ceeee9df1461068c578063e1f1c4a7146106b5578063e4e57b9e146106e0576101d8565b8063b536b78e116100d1578063b536b78e14610578578063bea4dfb5146105b5578063c2e4d08f146105e0578063c34223fb1461060b576101d8565b80638da5cb5b146104a85780638e15f473146104d35780639c8c3648146104fe578063a1e1fbc21461053b576101d8565b80635c60da1b1161017a578063715018a611610149578063715018a61461040f57806372521cc3146104265780637fec435314610456578063880f40391461047f576101d8565b80635c60da1b1461032d5780636832e5de146103585780636d090218146103955780636f3eebae146103d2576101d8565b80630c10fd0f116101b65780630c10fd0f1461024d578063172083ce1461028a5780632c612832146102b35780634d6dcae1146102f0576101d8565b8063025b22bc146101dd57806303fd2a45146102065780630752881a14610231575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613e23565b6107c6565b005b34801561021257600080fd5b5061021b61084b565b6040516102289190613e5f565b60405180910390f35b61024b60048036038101906102469190613eb0565b610851565b005b34801561025957600080fd5b50610274600480360381019061026f9190613e23565b610f20565b6040516102819190613e5f565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac9190613f29565b610f91565b005b3480156102bf57600080fd5b506102da60048036038101906102d59190613e23565b611132565b6040516102e79190613f78565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613eb0565b611236565b6040516103249190613f78565b60405180910390f35b34801561033957600080fd5b5061034261135f565b60405161034f9190613e5f565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613eb0565b611385565b60405161038c9190613f78565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613e23565b6114ae565b6040516103c99190613fae565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190613e23565b6114ce565b6040516104069190613e5f565b60405180910390f35b34801561041b57600080fd5b506104246115a8565b005b610440600480360381019061043b91906142c0565b6115bc565b60405161044d9190613e5f565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906143b9565b611dd6565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613e23565b611dfe565b005b3480156104b457600080fd5b506104bd611e61565b6040516104ca9190613e5f565b60405180910390f35b3480156104df57600080fd5b506104e8611e8a565b6040516104f59190613f78565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190613e23565b611f7f565b60405161053291906144a4565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190614589565b61204c565b60405161056f9190614808565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613e23565b612461565b6040516105ac91906148cc565b60405180910390f35b3480156105c157600080fd5b506105ca6127ca565b6040516105d79190614901565b60405180910390f35b3480156105ec57600080fd5b506105f561286b565b604051610602919061492b565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190613eb0565b61287f565b60405161063f9190613e5f565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613e23565b6128cd565b6040516106839897969594939291906149fd565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906143b9565b612aa0565b005b3480156106c157600080fd5b506106ca612ac8565b6040516106d79190613f78565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190614a7b565b612ace565b604051610715929190614ace565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613e23565b612f3e565b005b34801561075357600080fd5b5061076e60048036038101906107699190613e23565b612fc4565b005b34801561077c57600080fd5b50610785613027565b6040516107929190613f78565b60405180910390f35b3480156107a757600080fd5b506107b061302c565b6040516107bd919061492b565b60405180910390f35b6107ce613040565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361080757600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61dead81565b6108596130c7565b6000341161089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390614b54565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060070160050160019054906101000a900460ff16610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614bc0565b60405180910390fd5b60003490506000612710600660149054906101000a900461ffff1661ffff168361095d9190614c0f565b6109679190614c80565b9050600061098086838561097b9190614cb1565b611236565b9050848110156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614d31565b60405180910390fd5b81836109d19190614cb1565b8460070160010160008282546109e79190614d51565b9250508190555080846007016000016000828254610a059190614cb1565b9250508190555082846007016002016000828254610a239190614d51565b925050819055506000610a34611e61565b73ffffffffffffffffffffffffffffffffffffffff1683604051610a5790614db6565b60006040518083038185875af1925050503d8060008114610a94576040519150601f19603f3d011682016040523d82523d6000602084013e610a99565b606091505b5050905080610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad490614e17565b60405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610b18929190614e37565b6020604051808303816000875af1158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b9190614e75565b503373ffffffffffffffffffffffffffffffffffffffff167f2ab932704044a97dfcb4c1cbd1ddfd869c7d10bc1e42daac2e1056cbb05449b334844289600701600101548a600701600001548b60070160020154604051610bc196959493929190614ea2565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167fb66c0615d3b6ef6e11182c9630d64a5f82fd527023c2017652c002d982ed0e1134844289600701600101548a600701600001548b60070160020154604051610c2e96959493929190614f4f565b60405180910390a2505050506000610c4584611132565b90506000670de0b6b3a76400008360070160030154610c649190614c0f565b9050600281610c739190614c80565b8210158015610c9457508260070160050160039054906101000a900460ff16155b15610db4578260060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663886f5e8e86878660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600701600101548960070160000154428b600701600201546040518963ffffffff1660e01b8152600401610d61989796959493929190614fc3565b600060405180830381600087803b158015610d7b57600080fd5b505af1158015610d8f573d6000803e3d6000fd5b5050505060018360070160050160036101000a81548160ff0219169083151502179055505b808210610f115760008360070160050160016101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff1663d51669946040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e2357600080fd5b505af1158015610e37573d6000803e3d6000fd5b505050508260070160040154836007016001016000828254610e599190614cb1565b92505081905550610eeb858673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9d9190613e5f565b602060405180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190615056565b856007016001015461310d565b8260070160010154836007016001016000828254610f099190614cb1565b925050819055505b505050610f1c61355f565b5050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b610f9a82613568565b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906150cf565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611025836114ce565b73ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad9061513b565b60405180910390fd5b60008260ff16101580156110ce575060648260ff1611155b61110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906151a7565b60405180910390fd5b818160070160050160006101000a81548160ff021916908360ff160217905550505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600701600001548373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed9190615056565b670de0b6b3a76400008360070160010154611206611e8a565b6112109190614c0f565b61121a9190614c80565b6112249190614c0f565b61122e9190614c80565b915050919050565b600080821161127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190615213565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600701600001541180156112db575060008160070160010154115b61131a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113119061527f565b60405180910390fd5b600081600701600001548461132f9190614c0f565b905060008483600701600101546113469190614d51565b905080826113549190614c80565b935050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008082116113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090615213565b60405180910390fd5b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816007016000015411801561142a575060008160070160010154115b611469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114609061527f565b60405180910390fd5b600081600701600101548461147e9190614c0f565b905060008483600701600001546114959190614d51565b905080826114a39190614c80565b935050505092915050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a191906152b4565b9050919050565b6115b0613040565b6115ba600061368a565b565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661164a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116419061532d565b60405180910390fd5b6000611677600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661374e565b90508073ffffffffffffffffffffffffffffffffffffffff166366faaae3898b6000600281106116aa576116a961534d565b5b60200201518c6001600281106116c3576116c261534d565b5b602002015130336040518663ffffffff1660e01b81526004016116ea9594939291906153ea565b600060405180830381600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b50505050600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506117c4613c77565b87816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050338160c0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194b91906152b4565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036119995760648160e0015160a0019060ff16908160ff16815250506119b1565b60328160e0015160a0019060ff16908160ff16815250505b60018160e0015160c0019015159081151581525050838160e0015160e0019015159081151581525050888160e001516000018181516119f09190614d51565b915081815250503485600160028110611a0c57611a0b61534d565b5b6020020151611a1b9190614d51565b8160e00151602001818151611a309190614d51565b9150818152505084600060028110611a4b57611a4a61534d565b5b60200201518160e00151606001818152505084600160028110611a7157611a7061534d565b5b60200201518160e00151608001818152505080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e082015181600701600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908360ff16021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff02191690831515021790555050509050503073ffffffffffffffffffffffffffffffffffffffff167fac1d76749e5447b7b16f5ab61447e1bd502f3bb4807af3b28e620d1700a6ee458a34604051611dbe92919061544b565b60405180910390a28192505050979650505050505050565b611dde613040565b80600660146101000a81548161ffff021916908361ffff16021790555050565b611e06613040565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e91906154e2565b5050509150506000811215611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f906155a9565b60405180910390fd5b6402540be40081611f7991906155c9565b91505090565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561204057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ff6575b50505050509050919050565b606060008251905060008167ffffffffffffffff8111156120705761206f613fdf565b5b6040519080825280602002602001820160405280156120a957816020015b612096613c77565b81526020019060019003908161208e5790505b50905060005b8281101561245657600560008683815181106120ce576120cd61534d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016006820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600782016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff1615151515815250508152505082828151811061243e5761243d61534d565b5b602002602001018190525080806001019150506120af565b508092505050919050565b612469613c77565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016006820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600782016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff161515151581525050815250509050919050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561283a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285e91906154e2565b5050509150508091505090565b600660149054906101000a900461ffff1681565b6004602052816000526040600020818154811061289b57600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806007016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff1660ff1660ff1681526020016005820160019054906101000a900460ff161515151581526020016005820160029054906101000a900460ff161515151581526020016005820160039054906101000a900460ff161515151581525050905088565b612aa8613040565b80600660166101000a81548161ffff021916908361ffff16021790555050565b61271081565b600080612ad96130c7565b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060070160050160019054906101000a900460ff16612b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6790614bc0565b60405180910390fd5b60008590506000612b818883611385565b90506000612710600660149054906101000a900461ffff1661ffff1683612ba89190614c0f565b612bb29190614c80565b9050600082118015612bc45750868210155b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614d31565b60405180910390fd5b87846007016000016000828254612c1a9190614d51565b9250508190555081846007016001016000828254612c389190614cb1565b9250508190555081846007016002016000828254612c569190614d51565b925050819055508873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612c9a93929190615641565b6020604051808303816000875af1158015612cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdd9190614e75565b506000612ce8611e61565b73ffffffffffffffffffffffffffffffffffffffff1682604051612d0b90614db6565b60006040518083038185875af1925050503d8060008114612d48576040519150601f19603f3d011682016040523d82523d6000602084013e612d4d565b606091505b5050905080612d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d88906156c4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168284612db49190614cb1565b604051612dc090614db6565b60006040518083038185875af1925050503d8060008114612dfd576040519150601f19603f3d011682016040523d82523d6000602084013e612e02565b606091505b50508091505080612e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3f90615730565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fb5c4deeb00ec61f7509ac91d1423c0125ef5de64d15d79c41b3cb6ef7e7daca88a854289600701600101548a600701600001548b60070160020154604051612ead96959493929190614ea2565b60405180910390a23373ffffffffffffffffffffffffffffffffffffffff167fb66c0615d3b6ef6e11182c9630d64a5f82fd527023c2017652c002d982ed0e118a854289600701600101548a600701600001548b60070160020154604051612f1a9695949392919061579c565b60405180910390a2600180965096505050505050612f3661355f565b935093915050565b612f46613040565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fb85760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612faf9190613e5f565b60405180910390fd5b612fc18161368a565b50565b612fcc613040565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606481565b600660169054906101000a900461ffff1681565b613048613762565b73ffffffffffffffffffffffffffffffffffffffff16613066611e61565b73ffffffffffffffffffffffffffffffffffffffff16146130c557613089613762565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016130bc9190613e5f565b60405180910390fd5b565b600260015403613103576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b600081905060006064605a836131239190614c0f565b61312d9190614c80565b9050600084905060006064605a836131459190614c0f565b61314f9190614c80565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061319f896114ce565b90506131ac898a8361376a565b8260050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506132228a600061398f565b508260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719888c88888b3061012c426132779190614d51565b6040518863ffffffff1660e01b815260040161329896959493929190615810565b60606040518083038185885af11580156132b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132db9190615871565b50505060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133199190613e5f565b602060405180830381865afa158015613336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335a9190615056565b905060006064600660169054906101000a900461ffff1661ffff16836133809190614c0f565b61338a9190614c80565b90506000818361339a9190614cb1565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133c0611e61565b846040518363ffffffff1660e01b81526004016133de929190614e37565b6020604051808303816000875af11580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190614e75565b508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead836040518363ffffffff1660e01b815260040161345f929190614e37565b6020604051808303816000875af115801561347e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a29190614e75565b508560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f630616749c0aa3ac2b8943843261fd2d07d0045dde6fe2a8b25381b8e6dc0f278d8c428c6007016002015460405161354894939291906158c4565b60405180910390a450505050505050505050505050565b60018081905550565b600080600090505b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561367f57600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061360b5761360a61534d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613672576001915050613685565b8080600101915050613570565b50600090505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061375b826000613b7f565b9050919050565b600033905090565b600080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561381f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384391906152b4565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e6a4390587876040518363ffffffff1660e01b8152600401613882929190615909565b602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c391906152b4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461390457809350505050613988565b8173ffffffffffffffffffffffffffffffffffffffff1663c9c6539687876040518363ffffffff1660e01b815260040161393f929190615909565b6020604051808303816000875af115801561395e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061398291906152b4565b93505050505b9392505050565b600080600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008490508315613a06578160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e308560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401613a67929190615909565b6020604051808303816000875af1158015613a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aaa9190615056565b03613b73578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b38360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613b2e929190614e37565b6020604051808303816000875af1158015613b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b719190614e75565b505b60019250505092915050565b600081471015613bc85747826040517fcf479181000000000000000000000000000000000000000000000000000000008152600401613bbf92919061544b565b60405180910390fd5b763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b176020526037600983f09050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613c71576040517fb06ebf3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001613d56613d5c565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600060ff1681526020016000151581526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613df082613dc5565b9050919050565b613e0081613de5565b8114613e0b57600080fd5b50565b600081359050613e1d81613df7565b92915050565b600060208284031215613e3957613e38613dbb565b5b6000613e4784828501613e0e565b91505092915050565b613e5981613de5565b82525050565b6000602082019050613e746000830184613e50565b92915050565b6000819050919050565b613e8d81613e7a565b8114613e9857600080fd5b50565b600081359050613eaa81613e84565b92915050565b60008060408385031215613ec757613ec6613dbb565b5b6000613ed585828601613e0e565b9250506020613ee685828601613e9b565b9150509250929050565b600060ff82169050919050565b613f0681613ef0565b8114613f1157600080fd5b50565b600081359050613f2381613efd565b92915050565b60008060408385031215613f4057613f3f613dbb565b5b6000613f4e85828601613e0e565b9250506020613f5f85828601613f14565b9150509250929050565b613f7281613e7a565b82525050565b6000602082019050613f8d6000830184613f69565b92915050565b60008115159050919050565b613fa881613f93565b82525050565b6000602082019050613fc36000830184613f9f565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61401782613fce565b810181811067ffffffffffffffff8211171561403657614035613fdf565b5b80604052505050565b6000614049613db1565b9050614055828261400e565b919050565b600067ffffffffffffffff82111561407557614074613fdf565b5b602082029050919050565b600080fd5b600080fd5b600067ffffffffffffffff8211156140a5576140a4613fdf565b5b6140ae82613fce565b9050602081019050919050565b82818337600083830152505050565b60006140dd6140d88461408a565b61403f565b9050828152602081018484840111156140f9576140f8614085565b5b6141048482856140bb565b509392505050565b600082601f83011261412157614120613fc9565b5b81356141318482602086016140ca565b91505092915050565b600061414d6141488461405a565b61403f565b9050806020840283018581111561416757614166614080565b5b835b818110156141ae57803567ffffffffffffffff81111561418c5761418b613fc9565b5b808601614199898261410c565b85526020850194505050602081019050614169565b5050509392505050565b600082601f8301126141cd576141cc613fc9565b5b60026141da84828561413a565b91505092915050565b600067ffffffffffffffff8211156141fe576141fd613fdf565b5b602082029050919050565b600061421c614217846141e3565b61403f565b9050806020840283018581111561423657614235614080565b5b835b8181101561425f578061424b8882613e9b565b845260208401935050602081019050614238565b5050509392505050565b600082601f83011261427e5761427d613fc9565b5b600261428b848285614209565b91505092915050565b61429d81613f93565b81146142a857600080fd5b50565b6000813590506142ba81614294565b92915050565b6000806000806000806000610100888a0312156142e0576142df613dbb565b5b600088013567ffffffffffffffff8111156142fe576142fd613dc0565b5b61430a8a828b016141b8565b975050602061431b8a828b01613e9b565b965050604061432c8a828b01613e0e565b955050606061433d8a828b01613e0e565b945050608061434e8a828b01613e0e565b93505060a061435f8a828b01614269565b92505060e06143708a828b016142ab565b91505092959891949750929550565b600061ffff82169050919050565b6143968161437f565b81146143a157600080fd5b50565b6000813590506143b38161438d565b92915050565b6000602082840312156143cf576143ce613dbb565b5b60006143dd848285016143a4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61441b81613de5565b82525050565b600061442d8383614412565b60208301905092915050565b6000602082019050919050565b6000614451826143e6565b61445b81856143f1565b935061446683614402565b8060005b8381101561449757815161447e8882614421565b975061448983614439565b92505060018101905061446a565b5085935050505092915050565b600060208201905081810360008301526144be8184614446565b905092915050565b600067ffffffffffffffff8211156144e1576144e0613fdf565b5b602082029050602081019050919050565b6000614505614500846144c6565b61403f565b9050808382526020820190506020840283018581111561452857614527614080565b5b835b81811015614551578061453d8882613e0e565b84526020840193505060208101905061452a565b5050509392505050565b600082601f8301126145705761456f613fc9565b5b81356145808482602086016144f2565b91505092915050565b60006020828403121561459f5761459e613dbb565b5b600082013567ffffffffffffffff8111156145bd576145bc613dc0565b5b6145c98482850161455b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61460781613e7a565b82525050565b61461681613ef0565b82525050565b61462581613f93565b82525050565b6101208201600082015161464260008501826145fe565b50602082015161465560208501826145fe565b50604082015161466860408501826145fe565b50606082015161467b60608501826145fe565b50608082015161468e60808501826145fe565b5060a08201516146a160a085018261460d565b5060c08201516146b460c085018261461c565b5060e08201516146c760e085018261461c565b506101008201516146dc61010085018261461c565b50505050565b610200820160008201516146f96000850182614412565b50602082015161470c6020850182614412565b50604082015161471f6040850182614412565b5060608201516147326060850182614412565b5060808201516147456080850182614412565b5060a082015161475860a0850182614412565b5060c082015161476b60c0850182614412565b5060e082015161477e60e085018261462b565b50505050565b600061479083836146e2565b6102008301905092915050565b6000602082019050919050565b60006147b5826145d2565b6147bf81856145dd565b93506147ca836145ee565b8060005b838110156147fb5781516147e28882614784565b97506147ed8361479d565b9250506001810190506147ce565b5085935050505092915050565b6000602082019050818103600083015261482281846147aa565b905092915050565b610200820160008201516148416000850182614412565b5060208201516148546020850182614412565b5060408201516148676040850182614412565b50606082015161487a6060850182614412565b50608082015161488d6080850182614412565b5060a08201516148a060a0850182614412565b5060c08201516148b360c0850182614412565b5060e08201516148c660e085018261462b565b50505050565b6000610200820190506148e2600083018461482a565b92915050565b6000819050919050565b6148fb816148e8565b82525050565b600060208201905061491660008301846148f2565b92915050565b6149258161437f565b82525050565b6000602082019050614940600083018461491c565b92915050565b6101208201600082015161495d60008501826145fe565b50602082015161497060208501826145fe565b50604082015161498360408501826145fe565b50606082015161499660608501826145fe565b5060808201516149a960808501826145fe565b5060a08201516149bc60a085018261460d565b5060c08201516149cf60c085018261461c565b5060e08201516149e260e085018261461c565b506101008201516149f761010085018261461c565b50505050565b600061020082019050614a13600083018b613e50565b614a20602083018a613e50565b614a2d6040830189613e50565b614a3a6060830188613e50565b614a476080830187613e50565b614a5460a0830186613e50565b614a6160c0830185613e50565b614a6e60e0830184614946565b9998505050505050505050565b600080600060608486031215614a9457614a93613dbb565b5b6000614aa286828701613e0e565b9350506020614ab386828701613e9b565b9250506040614ac486828701613e9b565b9150509250925092565b6000604082019050614ae36000830185613f9f565b614af06020830184613f9f565b9392505050565b600082825260208201905092915050565b7f496e76616c6964206275792076616c7565000000000000000000000000000000600082015250565b6000614b3e601183614af7565b9150614b4982614b08565b602082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614baa601283614af7565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c1a82613e7a565b9150614c2583613e7a565b9250828202614c3381613e7a565b91508282048414831517614c4a57614c49614be0565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c8b82613e7a565b9150614c9683613e7a565b925082614ca657614ca5614c51565b5b828204905092915050565b6000614cbc82613e7a565b9150614cc783613e7a565b9250828203905081811115614cdf57614cde614be0565b5b92915050565b7f536c69707061676520746f6f2068696768000000000000000000000000000000600082015250565b6000614d1b601183614af7565b9150614d2682614ce5565b602082019050919050565b60006020820190508181036000830152614d4a81614d0e565b9050919050565b6000614d5c82613e7a565b9150614d6783613e7a565b9250828201905080821115614d7f57614d7e614be0565b5b92915050565b600081905092915050565b50565b6000614da0600083614d85565b9150614dab82614d90565b600082019050919050565b6000614dc182614d93565b9150819050919050565b7f66656520455448207472616e73666572206661696c6564000000000000000000600082015250565b6000614e01601783614af7565b9150614e0c82614dcb565b602082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b6000604082019050614e4c6000830185613e50565b614e596020830184613f69565b9392505050565b600081519050614e6f81614294565b92915050565b600060208284031215614e8b57614e8a613dbb565b5b6000614e9984828501614e60565b91505092915050565b600060c082019050614eb76000830189613f69565b614ec46020830188613f69565b614ed16040830187613f69565b614ede6060830186613f69565b614eeb6080830185613f69565b614ef860a0830184613f69565b979650505050505050565b7f6275790000000000000000000000000000000000000000000000000000000000600082015250565b6000614f39600383614af7565b9150614f4482614f03565b602082019050919050565b600060e082019050614f646000830189613f69565b614f716020830188613f69565b614f7e6040830187613f69565b614f8b6060830186613f69565b614f986080830185613f69565b81810360a0830152614fa981614f2c565b9050614fb860c0830184613f69565b979650505050505050565b600061010082019050614fd9600083018b613e50565b614fe6602083018a613e50565b614ff36040830189613e50565b6150006060830188613e50565b61500d6080830187613f69565b61501a60a0830186613f69565b61502760c0830185613f69565b61503460e0830184613f69565b9998505050505050505050565b60008151905061505081613e84565b92915050565b60006020828403121561506c5761506b613dbb565b5b600061507a84828501615041565b91505092915050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006150b9600c83614af7565b91506150c482615083565b602082019050919050565b600060208201905081810360008301526150e8816150ac565b9050919050565b7f6e6f20637573746f6d20626173652073656c6563746564000000000000000000600082015250565b6000615125601783614af7565b9150615130826150ef565b602082019050919050565b6000602082019050818103600083015261515481615118565b9050919050565b7f696e76616c696420706572000000000000000000000000000000000000000000600082015250565b6000615191600b83614af7565b915061519c8261515b565b602082019050919050565b600060208201905081810360008301526151c081615184565b9050919050565b7f496e76616c696420696e70757420616d6f756e74000000000000000000000000600082015250565b60006151fd601483614af7565b9150615208826151c7565b602082019050919050565b6000602082019050818103600083015261522c816151f0565b9050919050565b7f496e76616c696420726573657276657300000000000000000000000000000000600082015250565b6000615269601083614af7565b915061527482615233565b602082019050919050565b600060208201905081810360008301526152988161525c565b9050919050565b6000815190506152ae81613df7565b92915050565b6000602082840312156152ca576152c9613dbb565b5b60006152d88482850161529f565b91505092915050565b7f6e6f74206465706c6f7965720000000000000000000000000000000000000000600082015250565b6000615317600c83614af7565b9150615322826152e1565b602082019050919050565b600060208201905081810360008301526153468161530a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b60005b838110156153a557808201518184015260208101905061538a565b60008484015250505050565b60006153bc8261537c565b6153c68185614af7565b93506153d6818560208601615387565b6153df81613fce565b840191505092915050565b600060a0820190506153ff6000830188613f69565b818103602083015261541181876153b1565b9050818103604083015261542581866153b1565b90506154346060830185613e50565b6154416080830184613e50565b9695505050505050565b60006040820190506154606000830185613f69565b61546d6020830184613f69565b9392505050565b600069ffffffffffffffffffff82169050919050565b61549381615474565b811461549e57600080fd5b50565b6000815190506154b08161548a565b92915050565b6154bf816148e8565b81146154ca57600080fd5b50565b6000815190506154dc816154b6565b92915050565b600080600080600060a086880312156154fe576154fd613dbb565b5b600061550c888289016154a1565b955050602061551d888289016154cd565b945050604061552e88828901615041565b935050606061553f88828901615041565b9250506080615550888289016154a1565b9150509295509295909350565b7f50726963652063616e6e6f74206265206e656761746976650000000000000000600082015250565b6000615593601883614af7565b915061559e8261555d565b602082019050919050565b600060208201905081810360008301526155c281615586565b9050919050565b60006155d4826148e8565b91506155df836148e8565b92508282026155ed816148e8565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561562557615624614be0565b5b828205841483151761563a57615639614be0565b5b5092915050565b60006060820190506156566000830186613e50565b6156636020830185613e50565b6156706040830184613f69565b949350505050565b7f6f776e7220455448207472616e73666572206661696c65640000000000000000600082015250565b60006156ae601883614af7565b91506156b982615678565b602082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f73656c6c657220455448207472616e73666572206661696c6564000000000000600082015250565b600061571a601a83614af7565b9150615725826156e4565b602082019050919050565b600060208201905081810360008301526157498161570d565b9050919050565b7f73656c6c00000000000000000000000000000000000000000000000000000000600082015250565b6000615786600483614af7565b915061579182615750565b602082019050919050565b600060e0820190506157b16000830189613f69565b6157be6020830188613f69565b6157cb6040830187613f69565b6157d86060830186613f69565b6157e56080830185613f69565b81810360a08301526157f681615779565b905061580560c0830184613f69565b979650505050505050565b600060c0820190506158256000830189613e50565b6158326020830188613f69565b61583f6040830187613f69565b61584c6060830186613f69565b6158596080830185613e50565b61586660a0830184613f69565b979650505050505050565b60008060006060848603121561588a57615889613dbb565b5b600061589886828701615041565b93505060206158a986828701615041565b92505060406158ba86828701615041565b9150509250925092565b60006080820190506158d96000830187613f69565b6158e66020830186613f69565b6158f36040830185613f69565b6159006060830184613f69565b95945050505050565b600060408201905061591e6000830185613e50565b61592b6020830184613e50565b939250505056fea264697066735822122020e14f8fadf9e27339a316bdb1ee58682474847deae8e98d387440223801d60c64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000be97f14f11f97f7299fefc82926bfa8e339badf80000000000000000000000000000000000000000000000000000000000000032
-----Decoded View---------------
Arg [0] : _implementation (address): 0xbe97f14F11F97f7299feFc82926Bfa8e339BAdf8
Arg [1] : _feePer (uint16): 50
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000be97f14f11f97f7299fefc82926bfa8e339badf8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000032
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$69.22
Net Worth in S
Token Allocations
S
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SONIC | 100.00% | $0.067926 | 1,019.0802 | $69.22 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.