Latest 25 from a total of 306 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 24014105 | 2 mins ago | IN | 0 ETH | 0.00004962 | ||||
| Approve | 23988976 | 3 days ago | IN | 0 ETH | 0.00000563 | ||||
| Approve | 23952626 | 8 days ago | IN | 0 ETH | 0.00004834 | ||||
| Approve | 23947458 | 9 days ago | IN | 0 ETH | 0.00002589 | ||||
| Approve | 23936368 | 10 days ago | IN | 0 ETH | 0.00000121 | ||||
| Approve | 23934162 | 11 days ago | IN | 0 ETH | 0.00004966 | ||||
| Approve | 23933935 | 11 days ago | IN | 0 ETH | 0.00001205 | ||||
| Approve | 23916763 | 13 days ago | IN | 0 ETH | 0.00000619 | ||||
| Approve | 23916758 | 13 days ago | IN | 0 ETH | 0.00000595 | ||||
| Approve | 23888271 | 17 days ago | IN | 0 ETH | 0.00000639 | ||||
| Approve | 23888268 | 17 days ago | IN | 0 ETH | 0.00000635 | ||||
| Approve | 23862340 | 21 days ago | IN | 0 ETH | 0.00000773 | ||||
| Approve | 23861430 | 21 days ago | IN | 0 ETH | 0.00000695 | ||||
| Approve | 23845796 | 23 days ago | IN | 0 ETH | 0.00001253 | ||||
| Approve | 23818614 | 27 days ago | IN | 0 ETH | 0.00001047 | ||||
| Approve | 23789573 | 31 days ago | IN | 0 ETH | 0.00009747 | ||||
| Approve | 23777903 | 33 days ago | IN | 0 ETH | 0.00001775 | ||||
| Transfer | 23774647 | 33 days ago | IN | 0 ETH | 0.00002436 | ||||
| Transfer | 23774605 | 33 days ago | IN | 0 ETH | 0.00001325 | ||||
| Transfer | 23774602 | 33 days ago | IN | 0 ETH | 0.0000131 | ||||
| Approve | 23767336 | 34 days ago | IN | 0 ETH | 0.00002799 | ||||
| Approve | 23763624 | 35 days ago | IN | 0 ETH | 0.00004296 | ||||
| Approve | 23760783 | 35 days ago | IN | 0 ETH | 0.00000452 | ||||
| Approve | 23759584 | 35 days ago | IN | 0 ETH | 0.00000469 | ||||
| Approve | 23756616 | 36 days ago | IN | 0 ETH | 0.00000672 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23988995 | 3 days ago | 0.02766974 ETH | ||||
| Transfer | 23988995 | 3 days ago | 0.02766974 ETH | ||||
| Transfer | 23952628 | 8 days ago | 0.01525213 ETH | ||||
| Transfer | 23952628 | 8 days ago | 0.01525213 ETH | ||||
| Transfer | 23933935 | 11 days ago | 0.02100738 ETH | ||||
| Transfer | 23933935 | 11 days ago | 0.02100738 ETH | ||||
| Transfer | 23789573 | 31 days ago | 0.01780155 ETH | ||||
| Transfer | 23789573 | 31 days ago | 0.01780155 ETH | ||||
| Transfer | 23756618 | 36 days ago | 0.09459837 ETH | ||||
| Transfer | 23756618 | 36 days ago | 0.09459837 ETH | ||||
| Transfer | 23754560 | 36 days ago | 0.01793036 ETH | ||||
| Transfer | 23754560 | 36 days ago | 0.01793036 ETH | ||||
| Transfer | 23746482 | 37 days ago | 0.01369351 ETH | ||||
| Transfer | 23746482 | 37 days ago | 0.01369351 ETH | ||||
| Transfer | 23720768 | 41 days ago | 0.02207802 ETH | ||||
| Transfer | 23720768 | 41 days ago | 0.02207802 ETH | ||||
| Transfer | 23691685 | 45 days ago | 0.02142087 ETH | ||||
| Transfer | 23691685 | 45 days ago | 0.02142087 ETH | ||||
| Transfer | 23676249 | 47 days ago | 0.02196336 ETH | ||||
| Transfer | 23676249 | 47 days ago | 0.02196336 ETH | ||||
| Transfer | 23662839 | 49 days ago | 0.02059465 ETH | ||||
| Transfer | 23662839 | 49 days ago | 0.02059465 ETH | ||||
| Transfer | 23659971 | 49 days ago | 0.01819527 ETH | ||||
| Transfer | 23659971 | 49 days ago | 0.01819527 ETH | ||||
| Transfer | 23656569 | 50 days ago | 0.03444014 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OMNIS
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
No with 200 runs
Other Settings:
prague EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.27;
/*
░█▀█░█▄█░█▀█░▀█▀░█▄█░▀█▀░█▀█░█▀▄░█▀▀
░█░█░█░█░█░█░░█░░█░█░░█░░█░█░█░█░▀▀█
░▀▀▀░▀░▀░▀░▀░▀▀▀░▀░▀░▀▀▀░▀░▀░▀▀░░▀▀▀
*/
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
interface Token {
function manualSwap(uint256 percent) external;
function claimOtherERC20(address token, uint256 amount) external;
}
/// Payment splitter contract for ETH distribution
/// Splits between AstraX and Marketing Wallet based on time and claim limits
contract PaymentSplitter is Ownable2Step, ReentrancyGuard {
error OnlyOwnerOrAstraX();
event MaxAstraXClaimUpdate(uint256 amount);
AggregatorV3Interface internal priceFeed;
uint256 internal lastPriceCheck;
uint256 internal lastPrice;
address public astraXAuthority = address(0x0F31B5ED38B39b435128AdC6B173f0939116859e);
address public astraX = address(0x0F31B5ED38B39b435128AdC6B173f0939116859e);
address public marketingWallet = address(0x65eAe045386dff93094E5896Ceb6aD54a221260D);
uint256 public deploymentTime;
uint256 public astraXClaimedAmount;
uint256 public astraXMaxClaim = 120_000_00; // 120k usd in cents upto 2 decimals
Token public omnis;
bool autoForwardEnabled = true;
error EthTransferFailed();
constructor(address owner, address token) Ownable(owner) {
priceFeed = AggregatorV3Interface(
0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
); //mainnet
omnis = Token(token);
deploymentTime = block.timestamp;
updatePrices();
}
function viewEthPrice()
external
view
returns (uint price, uint256 lastCheck)
{
return (lastPrice, lastPriceCheck);
}
function updatePrices() internal {
//update price if 10mins passed from last check
(
, //roundId
int256 price,
, //startedAt
uint256 timestamp,
//answeredInRound
) = priceFeed.latestRoundData();
// Only update if price is valid AND not stale, otherwise keep last price
// chainlink price feed updates hourly most of time
if (price > 0 && block.timestamp - timestamp <= 1 hours) {
lastPrice = uint256(price / 1e6); //price upto 2 decimals
lastPriceCheck = timestamp;
}
// If price <= 0 OR data is stale, keep using lastPrice without updating
}
receive() external payable nonReentrant {
if (!autoForwardEnabled) return;
uint256 totalEth = msg.value;
if (totalEth == 0) return;
if (astraXClaimedAmount >= astraXMaxClaim) {
// Profit share ended → everything to marketing
(bool sent, ) = marketingWallet.call{value: totalEth}("");
require(sent, "Failed to send to marketing wallet");
return;
}
// Split incoming ETH between AstraX and marketing
(uint256 astraXEthShare, uint256 marketingShare) = calculateSplit(totalEth);
// Update price from Chainlink (return 2 decimals as per your current code)
updatePrices();
uint256 astraXUsdShare = (astraXEthShare * uint256(lastPrice)) / 1e18;
uint256 remainingClaim = astraXMaxClaim - astraXClaimedAmount;
if (remainingClaim >= astraXUsdShare) {
if (astraXEthShare > 0) {
astraXClaimedAmount += astraXUsdShare;
(bool sent, ) = astraX.call{value: astraXEthShare}("");
require(sent, "Failed to transfer to AstraX");
}
} else {
if (astraXEthShare > 0) {
marketingShare += astraXEthShare;
}
}
if (marketingShare > 0) {
(bool sent, ) = marketingWallet.call{value: marketingShare}("");
require(sent, "Failed to send to marketing wallet");
}
}
/// Calculate split percentages based on time from deployment
function calculateSplit(uint256 amount) internal view returns (uint256 astraXAmount, uint256 marketingAmount) {
uint256 timeSinceDeployment = block.timestamp - deploymentTime;
uint256 twoWeeks = 14 days;
if (timeSinceDeployment <= twoWeeks) {
// First 2 weeks: 40% AstraX, 60% Marketing
astraXAmount = (amount * 40) / 100;
marketingAmount = amount - astraXAmount;
} else {
// After 2 weeks: 20% AstraX, 80% Marketing
astraXAmount = (amount * 20) / 100;
marketingAmount = amount - astraXAmount;
}
}
/// Update AstraX max claim amount
function updateAstraXMaxClaim(uint256 newUsdAmount) external {
if (msg.sender != astraXAuthority && msg.sender != owner()) {
revert OnlyOwnerOrAstraX();
}
if(newUsdAmount < astraXClaimedAmount){
newUsdAmount = astraXClaimedAmount;
}
astraXMaxClaim = newUsdAmount;
emit MaxAstraXClaimUpdate(newUsdAmount);
}
/// Update payment addresses
function setPaymentAddresses(
address _astraX,
address _marketing
) external onlyOwner {
astraX = _astraX;
marketingWallet = _marketing;
}
/// Toggle auto forward mode
function toggleAutoForward() external onlyOwner {
autoForwardEnabled = !autoForwardEnabled;
}
/// Claim ETH manually
function claimETH() external onlyOwner nonReentrant {
uint256 balance = address(this).balance;
if (balance == 0) {
revert("No ETH to claim");
}
(bool sent, ) = owner().call{value: balance}("");
require(sent, EthTransferFailed());
}
/// Call manual swap on token
function manualSwap(uint256 percent) external onlyOwner {
omnis.manualSwap(percent);
}
/// Claim ERC20 from token contract
function claimERC20FromTokenContract(
address token,
uint256 amount
) external onlyOwner {
omnis.claimOtherERC20(token, amount);
}
/// Claim any ERC20 token
function claimAnyERC20(address _token, uint256 _amount) external onlyOwner {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = _token.call(
abi.encodeWithSelector(0xa9059cbb, msg.sender, _amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeTransfer: transfer failed"
);
}
}
/// OMNIS is an ERC20 token with 8 decimals
contract OMNIS is ERC20, Ownable2Step, ReentrancyGuard {
/// Custom errors
error CannotRemoveMainPair();
error ZeroAddressNotAllowed();
error FeesLimitExceeds();
error UpdateBoolValue();
error CannotClaimNativeToken();
error OnlyOwnerOrMarketingWallet();
error OnlyOwnerOrClaimsDappWallet();
error BlacklistedUser();
error OnlyOwnerCanAddLP();
error TradingNotEnabled();
error InvalidPercentage();
error InvalidAmount();
/// Claims struct for OG holders
struct OGExemption {
uint256 exemptionAmount;
uint256 exemptionStarts;
}
/// Mapping for OG holders
mapping(address => OGExemption) public ogHolders;
/// Max limit on Buy / Sell fees
uint256 public constant MAX_FEE_LIMIT = 10;
/// Max total supply 1 billion tokens (8 decimals)
uint256 private maxSupply = 1_000_000_000 * 1e8;
/// Swap threshold
uint256 public swapTokensAtAmount = 100_000 * 1e8;
/// Check if it's a swap tx
bool private inSwap = false;
/// Check if trading is enabled
bool public tradingEnabled = false;
bool public allowOthersToAddToLP = false;
/// Buy fees struct
struct BuyFees {
uint16 marketing;
uint16 autoLP;
}
/// Sell fees struct
struct SellFees {
uint16 marketing;
uint16 autoLP;
}
/// Fee variables
BuyFees public buyFee;
SellFees public sellFee;
/// Transaction counter
uint256 private txCounter;
/// Total fees
uint256 private totalBuyFee;
uint256 private totalSellFee;
/// Tax mode
bool private normalMode;
/// Marketing wallet
address public marketingWallet;
/// Claims DAppWallet;
address public claimsDAppWallet;
/// Uniswap router
IUniswapV2Router02 public immutable uniswapV2Router;
/// Uniswap pair
address public uniswapV2Pair;
/// Mappings
mapping(address => bool) public isAutomatedMarketMaker;
mapping(address => bool) public isExcludedFromFees;
mapping(address => bool) public isBlacklisted;
/// Events
event BuyFeesUpdated(
uint16 indexed marketingFee,
uint16 indexed liquidityFee
);
event SellFeesUpdated(
uint16 indexed marketingFee,
uint16 indexed liquidityFee
);
event FeesSwapped(
uint256 indexed ethForLiquidity,
uint256 indexed tokensForLiquidity,
uint256 indexed ethForMarketing
);
event OGHolderSet(
address indexed holder,
uint256 exemptionAmount,
uint256 exemptionStarts
);
event EthReceived(address payer, uint256 amount);
/// Constructor with 8 decimals
constructor() ERC20("Omniminds", "OMNIS") Ownable(msg.sender) {
uniswapV2Router = IUniswapV2Router02(
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
address(this),
uniswapV2Router.WETH()
);
isAutomatedMarketMaker[uniswapV2Pair] = true;
/// Normal trade values
buyFee.marketing = 5;
buyFee.autoLP = 0;
totalBuyFee = 5;
sellFee.marketing = 5;
sellFee.autoLP = 0;
totalSellFee = 5;
PaymentSplitter p = new PaymentSplitter(
owner(), // Deployer becomes PaymentSplitter owner
address(this)
);
marketingWallet = address(p);
claimsDAppWallet = address(0x387d344376a8cE500c3bD86eeC5f104DBAE27534);
isExcludedFromFees[address(this)] = true;
isExcludedFromFees[marketingWallet] = true;
isExcludedFromFees[owner()] = true;
isExcludedFromFees[claimsDAppWallet] = true;
_mint(msg.sender, maxSupply);
}
function decimals() public pure override returns (uint8) {
return 8; // 8 decimals
}
/// Modifier for swap lock
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
/// Receive ETH
receive() external payable {
emit EthReceived(msg.sender, msg.value);
}
/// Set CLAIMDAPP role address (only owner)
function setClaimDapp(address claimDappAddress) external onlyOwner {
// Grant role to new address
claimsDAppWallet = claimDappAddress;
}
/// Get current CLAIMDAPP address
function getClaimDapp() external view returns (address) {
return claimsDAppWallet;
}
/// Claim other ERC20 tokens
function claimOtherERC20(address _token, uint256 _amount) external {
if (msg.sender != marketingWallet && msg.sender != owner()) {
revert OnlyOwnerOrMarketingWallet();
}
if (_token == address(this)) {
revert CannotClaimNativeToken();
}
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = _token.call(
abi.encodeWithSelector(0xa9059cbb, msg.sender, _amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeTransfer: transfer failed"
);
}
/// Exclude from fees
function excludeFromFees(address user, bool value) external onlyOwner {
if (user == address(0)) {
revert ZeroAddressNotAllowed();
}
if (isExcludedFromFees[user] == value) {
revert UpdateBoolValue();
}
isExcludedFromFees[user] = value;
}
/// Check if address is excluded from fees
function isAddressExcludedFromFees(address account) external view returns (bool) {
return isExcludedFromFees[account];
}
/// Blacklist management
function blacklist(address user, bool value) external onlyOwner {
if (user == address(0)) {
revert ZeroAddressNotAllowed();
}
if (isBlacklisted[user] == value) {
revert UpdateBoolValue();
}
isBlacklisted[user] = value;
}
/// Check if address is blacklisted
function isAddressBlacklisted(address account) external view returns (bool) {
return isBlacklisted[account];
}
/// Manage liquidity pairs
function manageLiquidityPairs(address _newPair, bool value) external onlyOwner {
if (_newPair == address(0)) {
revert ZeroAddressNotAllowed();
}
if (_newPair == uniswapV2Pair) {
revert CannotRemoveMainPair();
}
if (isAutomatedMarketMaker[_newPair] == value) {
revert UpdateBoolValue();
}
isAutomatedMarketMaker[_newPair] = value;
}
/// Check if address is an AMM pair
function isAddressAMM(address account) external view returns (bool) {
return isAutomatedMarketMaker[account];
}
/// Update marketing wallet
function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
if (newMarketingWallet == address(0)) {
revert ZeroAddressNotAllowed();
}
marketingWallet = newMarketingWallet;
}
/// Update swap threshold
function updateSwapTokensAtAmount(uint256 amount) external onlyOwner {
if (amount == 0) {
revert InvalidAmount();
}
swapTokensAtAmount = amount * 1e8;
}
/// Update buy fees
function updateBuyFees(uint16 _marketing, uint16 _autoLP) external onlyOwner {
if (_marketing + _autoLP > MAX_FEE_LIMIT) {
revert FeesLimitExceeds();
}
buyFee.marketing = _marketing;
buyFee.autoLP = _autoLP;
totalBuyFee = _marketing + _autoLP;
emit BuyFeesUpdated(_marketing, _autoLP);
}
/// Update sell fees
function updateSellFees(uint16 _marketing, uint16 _autoLP) external onlyOwner {
if (_marketing + _autoLP > MAX_FEE_LIMIT) {
revert FeesLimitExceeds();
}
sellFee.marketing = _marketing;
sellFee.autoLP = _autoLP;
totalSellFee = _marketing + _autoLP;
emit SellFeesUpdated(_marketing, _autoLP);
}
/// Switch to normal tax
function switchToNormalTax() external onlyOwner {
normalMode = true;
}
function enableTrading() external onlyOwner {
tradingEnabled = true;
}
function enableOthersToAddToLP() external onlyOwner {
allowOthersToAddToLP = true;
}
/// Set OG holder exemption
function setOGHolder(address holder, uint256 exemptionAmount) external {
if (msg.sender != claimsDAppWallet && msg.sender != owner()) {
revert OnlyOwnerOrClaimsDappWallet();
}
if (holder == address(0)) {
revert ZeroAddressNotAllowed();
}
if (exemptionAmount == 0) {
revert InvalidAmount();
}
uint256 exemptionStarts = block.timestamp + 180 days;
ogHolders[holder] = OGExemption(exemptionAmount, exemptionStarts);
emit OGHolderSet(holder, exemptionAmount, exemptionStarts);
}
/// Get OG holder exemption details
function getOGExemption(address holder) external view returns (uint256 exemptionAmount, uint256 exemptionStarts, bool isActive) {
OGExemption memory exemption = ogHolders[holder];
return (
exemption.exemptionAmount,
exemption.exemptionStarts,
exemption.exemptionAmount > 0 &&
block.timestamp >= exemption.exemptionStarts
);
}
/// Transfer function with fees
function _update(
address from,
address to,
uint256 amount
) internal override {
if (isBlacklisted[from] || isBlacklisted[to]) {
revert BlacklistedUser();
}
if (amount == 0) {
super._update(from, to, 0);
return;
}
//protect acting adding to LP and trade before LP is added
if (
isAutomatedMarketMaker[to] &&
!allowOthersToAddToLP &&
!isExcludedFromFees[from]
) {
//checks if transfer is to LP and not initiated by owner while allowOtherToAddToLP is false
revert OnlyOwnerCanAddLP();
}
uint256 contractBalance = balanceOf(address(this));
bool canSwapped = contractBalance >= swapTokensAtAmount;
if (
canSwapped &&
!isAutomatedMarketMaker[from] &&
!inSwap &&
!isExcludedFromFees[from] &&
!isExcludedFromFees[to]
) {
swapAndLiquify(contractBalance);
}
bool takeFee = !isExcludedFromFees[from] && !isExcludedFromFees[to];
if (!takeFee) {
super._update(from, to, amount);
return;
}
if (!tradingEnabled) {
revert TradingNotEnabled();
}
uint256 fees = 0;
uint256 currentTime = block.timestamp;
uint256 transferTax = calculateTransferTax();
unchecked {
++txCounter;
}
if (isAutomatedMarketMaker[from] && totalBuyFee > 0) {
// Buy transaction
uint256 buyTax = calculateBuyTax();
uint256 totalTax = transferTax + buyTax;
fees = (amount * totalTax) / 100;
} else if (isAutomatedMarketMaker[to] && totalSellFee > 0) {
// Sell transaction - check OG exemption
OGExemption storage exemption = ogHolders[from];
bool applyExemption = exemption.exemptionAmount > 0 &&
currentTime >= exemption.exemptionStarts &&
amount <= exemption.exemptionAmount;
if (applyExemption) {
// Reduce exemption amount and apply only transfer tax
exemption.exemptionAmount -= amount;
fees = (amount * transferTax) / 100;
} else {
uint256 sellTax = calculateSellTax();
// Apply both transfer and sell tax
uint256 totalTax = transferTax + sellTax;
fees = (amount * totalTax) / 100;
}
} else if (transferTax > 0) {
// Regular transfer
fees = (amount * transferTax) / 100;
}
if (fees > 0) {
super._update(from, address(this), fees);
amount -= fees;
}
super._update(from, to, amount);
}
/// @notice swap the collected fees to eth / add liquidity
/// after conversion, it sends eth to marketing wallet, add auto liquidity
/// @param tokenAmount: tokens to be swapped appropriately as per fee structure
function swapAndLiquify(uint256 tokenAmount) private lockTheSwap {
uint256 totalFees = totalBuyFee + totalSellFee;
if (totalFees == 0) {
swapTokensForEth(tokenAmount);
uint256 ethBalance = address(this).balance;
if (ethBalance > 0) {
(bool success, ) = payable(marketingWallet).call{
value: ethBalance
}("");
require(success, "Marketing transfer failed");
}
return;
}
uint256 marketingTokens = ((buyFee.marketing + sellFee.marketing) *
tokenAmount) / totalFees;
uint256 liquidityTokens = tokenAmount - marketingTokens;
uint256 liquidityTokensHalf = liquidityTokens / 2;
uint256 swapTokens = tokenAmount - liquidityTokensHalf;
uint256 ethBalanceBeforeSwap = address(this).balance;
swapTokensForEth(swapTokens);
uint256 ethBalanceAfterSwap = address(this).balance -
ethBalanceBeforeSwap;
uint256 ethForLiquidity = (liquidityTokensHalf * ethBalanceAfterSwap) /
swapTokens;
if (ethForLiquidity > 0 && liquidityTokensHalf > 0) {
addLiquidity(liquidityTokensHalf, ethForLiquidity);
}
uint256 marketingEth = address(this).balance;
if (marketingEth > 0) {
(bool success, ) = payable(marketingWallet).call{
value: marketingEth
}("");
require(success, "Marketing transfer failed");
}
emit FeesSwapped(ethForLiquidity, liquidityTokensHalf, marketingEth);
}
/// Swap tokens for ETH
function swapTokensForEth(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
if (allowance(address(this), address(uniswapV2Router)) < tokenAmount) {
_approve(
address(this),
address(uniswapV2Router),
type(uint256).max
);
}
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
/// Add liquidity - restricted to owner
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // Accept any amount of tokens
0, // Accept any amount of ETH
owner(), // LP tokens go to owner
block.timestamp
);
}
/// Manual swap
function manualSwap(uint256 percentage) external lockTheSwap {
if (msg.sender != marketingWallet && msg.sender != owner()) {
revert OnlyOwnerOrMarketingWallet();
}
if (percentage == 0 || percentage > 100) {
revert InvalidPercentage();
}
uint256 tokens = balanceOf(address(this));
if (tokens == 0) {
revert InvalidAmount();
}
uint256 amount = (tokens * percentage) / 100;
swapTokensForEth(amount);
uint256 ethAmount = address(this).balance;
if (ethAmount > 0) {
(bool success, ) = payable(marketingWallet).call{value: ethAmount}(
""
);
require(success, "ETH transfer failed");
}
}
/// Tax calculation functions
function calculateBuyTax() internal view returns (uint256) {
if (normalMode) {
return totalBuyFee;
} else {
if (txCounter <= 10) {
return 25;
} else if (txCounter <= 20) {
return 20;
} else if (txCounter <= 25) {
return 15;
} else if (txCounter <= 30) {
return 10;
} else {
return totalBuyFee;
}
}
}
function calculateSellTax() internal view returns (uint256) {
if (normalMode) {
return totalSellFee;
} else {
if (txCounter <= 10) {
return 25;
} else if (txCounter <= 20) {
return 20;
} else if (txCounter <= 25) {
return 15;
} else if (txCounter <= 30) {
return 10;
} else {
return totalSellFee;
}
}
}
function calculateTransferTax() internal view returns (uint256) {
if (normalMode) {
return 0;
} else {
if (txCounter <= 10) {
return 15;
} else if (txCounter <= 30) {
return 10;
} else {
return 0;
}
}
}
/// View functions for better frontend integration
/// Get current buy tax for a transaction
function getCurrentBuyTax() external view returns (uint256) {
return calculateBuyTax();
}
/// Get current sell tax for a transaction
function getCurrentSellTax() external view returns (uint256) {
return calculateSellTax();
}
/// Get current transfer tax for a transaction
function getCurrentTransferTax() external view returns (uint256) {
return calculateTransferTax();
}
/// Get contract statistics
function getContractStats()
external
view
returns (
uint256 totalSupply_,
uint256 contractBalance,
uint256 txCount,
uint256 swapThreshold,
bool normalModeActive
)
{
return (
totalSupply(),
balanceOf(address(this)),
txCounter,
swapTokensAtAmount,
normalMode
);
}
/// Get current fee structure
function getCurrentFees()
external
view
returns (
uint16 buyMarketing,
uint16 buyLP,
uint16 sellMarketing,
uint16 sellLP
)
{
return (
buyFee.marketing,
buyFee.autoLP,
sellFee.marketing,
sellFee.autoLP
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.20;
import {Ownable} from "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This extension of the {Ownable} contract includes a two-step mechanism to transfer
* ownership, where the new owner must call {acceptOwnership} in order to replace the
* old one. This can help prevent common mistakes, such as transfers of ownership to
* incorrect accounts, or to contracts that are unable to interact with the
* permission system.
*
* The initial owner is specified at deployment time in the constructor for `Ownable`. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*
* Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
if (pendingOwner() != sender) {
revert OwnableUnauthorizedAccount(sender);
}
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {IERC165, ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/// @inheritdoc IERC165
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// 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);
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}// 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.4.0) (access/IAccessControl.sol)
pragma solidity >=0.8.4;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted to signal this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
* Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// 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.4.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/// @inheritdoc IERC165
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/=lib/",
"@chainlink/=lib/chainlink-evm/",
"chainlink-evm/=lib/chainlink-evm/",
"chainlink/=lib/chainlink/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"v2-core/=lib/v2-core/contracts/",
"v2-periphery/=lib/v2-periphery/contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "prague",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BlacklistedUser","type":"error"},{"inputs":[],"name":"CannotClaimNativeToken","type":"error"},{"inputs":[],"name":"CannotRemoveMainPair","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FeesLimitExceeds","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPercentage","type":"error"},{"inputs":[],"name":"OnlyOwnerCanAddLP","type":"error"},{"inputs":[],"name":"OnlyOwnerOrClaimsDappWallet","type":"error"},{"inputs":[],"name":"OnlyOwnerOrMarketingWallet","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"},{"inputs":[],"name":"TradingNotEnabled","type":"error"},{"inputs":[],"name":"UpdateBoolValue","type":"error"},{"inputs":[],"name":"ZeroAddressNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"marketingFee","type":"uint16"},{"indexed":true,"internalType":"uint16","name":"liquidityFee","type":"uint16"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ethForLiquidity","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"ethForMarketing","type":"uint256"}],"name":"FeesSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"exemptionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"exemptionStarts","type":"uint256"}],"name":"OGHolderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":"uint16","name":"marketingFee","type":"uint16"},{"indexed":true,"internalType":"uint16","name":"liquidityFee","type":"uint16"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FEE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowOthersToAddToLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"autoLP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimOtherERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimsDAppWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableOthersToAddToLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimDapp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractStats","outputs":[{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"contractBalance","type":"uint256"},{"internalType":"uint256","name":"txCount","type":"uint256"},{"internalType":"uint256","name":"swapThreshold","type":"uint256"},{"internalType":"bool","name":"normalModeActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentFees","outputs":[{"internalType":"uint16","name":"buyMarketing","type":"uint16"},{"internalType":"uint16","name":"buyLP","type":"uint16"},{"internalType":"uint16","name":"sellMarketing","type":"uint16"},{"internalType":"uint16","name":"sellLP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTransferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getOGExemption","outputs":[{"internalType":"uint256","name":"exemptionAmount","type":"uint256"},{"internalType":"uint256","name":"exemptionStarts","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAutomatedMarketMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"manageLiquidityPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogHolders","outputs":[{"internalType":"uint256","name":"exemptionAmount","type":"uint256"},{"internalType":"uint256","name":"exemptionStarts","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"autoLP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimDappAddress","type":"address"}],"name":"setClaimDapp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"exemptionAmount","type":"uint256"}],"name":"setOGHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToNormalTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_autoLP","type":"uint16"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_autoLP","type":"uint16"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a060405267016345785d8a00006009556509184e72a000600a555f600b5f6101000a81548160ff0219169083151502179055505f600b60016101000a81548160ff0219169083151502179055505f600b60026101000a81548160ff021916908315150217905550348015610072575f5ffd5b50336040518060400160405280600981526020017f4f6d6e696d696e647300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f4d4e495300000000000000000000000000000000000000000000000000000081525081600390816100ef9190611d5b565b5080600490816100ff9190611d5b565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610172575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101699190611e69565b60405180910390fd5b610181816106fe60201b60201c565b506001600781905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102419190611eb0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cc9190611eb0565b6040518363ffffffff1660e01b81526004016102e9929190611edb565b6020604051808303815f875af1158015610305573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103299190611eb0565b60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160145f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506005600c5f015f6101000a81548161ffff021916908361ffff1602179055505f600c5f0160026101000a81548161ffff021916908361ffff1602179055506005600f819055506005600d5f015f6101000a81548161ffff021916908361ffff1602179055505f600d5f0160026101000a81548161ffff021916908361ffff16021790555060056010819055505f61047961073460201b60201c565b3060405161048690611b11565b610491929190611edb565b604051809103905ff0801580156104aa573d5f5f3e3d5ffd5b50905080601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073387d344376a8ce500c3bd86eec5f104dbae2753460125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160155f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160155f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160155f61062161073460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160155f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506106f83360095461075c60201b60201c565b506123d9565b60065f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610731816107e160201b60201c565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107cc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107c39190611e69565b60405180910390fd5b6107dd5f83836108a460201b60201c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061093f575060165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610976576040517fd9a60d2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81036109935761098e83835f610f3c60201b60201c565b610f37565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156109f65750600b60029054906101000a900460ff16155b8015610a49575060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610a80576040517fe614db7800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610a903061115560201b60201c565b90505f600a548210159050808015610aef575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b075750600b5f9054906101000a900460ff16155b8015610b5a575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610bad575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610bc257610bc18261119a60201b60201c565b5b5f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015610c61575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b905080610c8157610c79868686610f3c60201b60201c565b505050610f37565b600b60019054906101000a900460ff16610cc7576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f90505f4290505f610cde6114c260201b60201c565b9050600e5f81546001019190508190555060145f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015610d4657505f600f54115b15610d8c575f610d5a61150c60201b60201c565b90505f8183610d699190611f2f565b90506064818a610d799190611f62565b610d839190611fd0565b94505050610ef7565b60145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015610de357505f601054115b15610ed2575f60085f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f825f0154118015610e3f575081600101548410155b8015610e4e5750815f01548911155b90508015610e8e5788825f015f828254610e689190612000565b925050819055506064838a610e7d9190611f62565b610e879190611fd0565b9450610ecb565b5f610e9d61158060201b60201c565b90505f8185610eac9190611f2f565b90506064818c610ebc9190611f62565b610ec69190611fd0565b965050505b5050610ef6565b5f811115610ef55760648188610ee89190611f62565b610ef29190611fd0565b92505b5b5b5f831115610f1f57610f10893085610f3c60201b60201c565b8287610f1c9190612000565b96505b610f30898989610f3c60201b60201c565b5050505050505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f8c578060025f828254610f809190611f2f565b9250508190555061105a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611015578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161100c93929190612042565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a1578060025f82825403925050819055506110eb565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111489190612077565b60405180910390a3505050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6001600b5f6101000a81548160ff0219169083151502179055505f601054600f546111c59190611f2f565b90505f81036112bc576111dd826115f460201b60201c565b5f4790505f8111156112b5575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611230906120bd565b5f6040518083038185875af1925050503d805f811461126a576040519150601f19603f3d011682016040523d82523d5f602084013e61126f565b606091505b50509050806112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa9061212b565b60405180910390fd5b505b50506114a6565b5f8183600d5f015f9054906101000a900461ffff16600c5f015f9054906101000a900461ffff166112ed9190612156565b61ffff166112fb9190611f62565b6113059190611fd0565b90505f81846113149190612000565b90505f6002826113249190611fd0565b90505f81866113339190612000565b90505f479050611348826115f460201b60201c565b5f81476113559190612000565b90505f8382866113659190611f62565b61136f9190611fd0565b90505f8111801561137f57505f85115b1561139557611394858261180d60201b60201c565b5b5f4790505f81111561146d575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516113e8906120bd565b5f6040518083038185875af1925050503d805f8114611422576040519150601f19603f3d011682016040523d82523d5f602084013e611427565b606091505b505090508061146b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114629061212b565b60405180910390fd5b505b8086837ff8cfc1c15ead481ffc3a2df6126e88c84a6730799e332fcfe2dbc386373d517160405160405180910390a45050505050505050505b5f600b5f6101000a81548160ff02191690831515021790555050565b5f60115f9054906101000a900460ff16156114df575f9050611509565b600a600e54116114f257600f9050611509565b601e600e541161150557600a9050611509565b5f90505b90565b5f60115f9054906101000a900460ff161561152b57600f54905061157d565b600a600e541161153e576019905061157d565b6014600e5411611551576014905061157d565b6019600e541161156457600f905061157d565b601e600e541161157757600a905061157d565b600f5490505b90565b5f60115f9054906101000a900460ff161561159f5760105490506115f1565b600a600e54116115b257601990506115f1565b6014600e54116115c557601490506115f1565b6019600e54116115d857600f90506115f1565b601e600e54116115eb57600a90506115f1565b60105490505b90565b5f600267ffffffffffffffff8111156116105761160f611b28565b5b60405190808252806020026020018201604052801561163e5781602001602082028036833780820191505090505b50905030815f815181106116555761165461218b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116fe9190611eb0565b816001815181106117125761171161218b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161175f306080516118a860201b60201c565b101561179957611798306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61192a60201b60201c565b5b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016117dc9594939291906122a8565b5f604051808303815f87803b1580156117f3575f5ffd5b505af1158015611805573d5f5f3e3d5ffd5b505050505050565b60805173ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f5f61183e61073460201b60201c565b426040518863ffffffff1660e01b815260040161186096959493929190612300565b60606040518083038185885af115801561187c573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118a19190612389565b5050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61193d838383600161194260201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119b2575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119a99190611e69565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a22575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a199190611e69565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b0b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b029190612077565b60405180910390a35b50505050565b61218d806168da83390190565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611b9957607f821691505b602082108103611bac57611bab611b55565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611c0e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611bd3565b611c188683611bd3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f611c5c611c57611c5284611c30565b611c39565b611c30565b9050919050565b5f819050919050565b611c7583611c42565b611c89611c8182611c63565b848454611bdf565b825550505050565b5f5f905090565b611ca0611c91565b611cab818484611c6c565b505050565b5b81811015611cce57611cc35f82611c98565b600181019050611cb1565b5050565b601f821115611d1357611ce481611bb2565b611ced84611bc4565b81016020851015611cfc578190505b611d10611d0885611bc4565b830182611cb0565b50505b505050565b5f82821c905092915050565b5f611d335f1984600802611d18565b1980831691505092915050565b5f611d4b8383611d24565b9150826002028217905092915050565b611d6482611b1e565b67ffffffffffffffff811115611d7d57611d7c611b28565b5b611d878254611b82565b611d92828285611cd2565b5f60209050601f831160018114611dc3575f8415611db1578287015190505b611dbb8582611d40565b865550611e22565b601f198416611dd186611bb2565b5f5b82811015611df857848901518255600182019150602085019450602081019050611dd3565b86831015611e155784890151611e11601f891682611d24565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611e5382611e2a565b9050919050565b611e6381611e49565b82525050565b5f602082019050611e7c5f830184611e5a565b92915050565b5f5ffd5b611e8f81611e49565b8114611e99575f5ffd5b50565b5f81519050611eaa81611e86565b92915050565b5f60208284031215611ec557611ec4611e82565b5b5f611ed284828501611e9c565b91505092915050565b5f604082019050611eee5f830185611e5a565b611efb6020830184611e5a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611f3982611c30565b9150611f4483611c30565b9250828201905080821115611f5c57611f5b611f02565b5b92915050565b5f611f6c82611c30565b9150611f7783611c30565b9250828202611f8581611c30565b91508282048414831517611f9c57611f9b611f02565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611fda82611c30565b9150611fe583611c30565b925082611ff557611ff4611fa3565b5b828204905092915050565b5f61200a82611c30565b915061201583611c30565b925082820390508181111561202d5761202c611f02565b5b92915050565b61203c81611c30565b82525050565b5f6060820190506120555f830186611e5a565b6120626020830185612033565b61206f6040830184612033565b949350505050565b5f60208201905061208a5f830184612033565b92915050565b5f81905092915050565b50565b5f6120a85f83612090565b91506120b38261209a565b5f82019050919050565b5f6120c78261209d565b9150819050919050565b5f82825260208201905092915050565b7f4d61726b6574696e67207472616e73666572206661696c6564000000000000005f82015250565b5f6121156019836120d1565b9150612120826120e1565b602082019050919050565b5f6020820190508181035f83015261214281612109565b9050919050565b5f61ffff82169050919050565b5f61216082612149565b915061216b83612149565b9250828201905061ffff81111561218557612184611f02565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f6121db6121d66121d1846121b8565b611c39565b611c30565b9050919050565b6121eb816121c1565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61222381611e49565b82525050565b5f612234838361221a565b60208301905092915050565b5f602082019050919050565b5f612256826121f1565b61226081856121fb565b935061226b8361220b565b805f5b8381101561229b5781516122828882612229565b975061228d83612240565b92505060018101905061226e565b5085935050505092915050565b5f60a0820190506122bb5f830188612033565b6122c860208301876121e2565b81810360408301526122da818661224c565b90506122e96060830185611e5a565b6122f66080830184612033565b9695505050505050565b5f60c0820190506123135f830189611e5a565b6123206020830188612033565b61232d60408301876121e2565b61233a60608301866121e2565b6123476080830185611e5a565b61235460a0830184612033565b979650505050505050565b61236881611c30565b8114612372575f5ffd5b50565b5f815190506123838161235f565b92915050565b5f5f5f606084860312156123a05761239f611e82565b5b5f6123ad86828701612375565b93505060206123be86828701612375565b92505060406123cf86828701612375565b9150509250925092565b6080516144c66124145f395f8181610de9015281816126fc015281816127dc0152818161280c01528181612854015261377d01526144c65ff3fe608060405260043610610302575f3560e01c806389d5c72b1161018f578063d257b34f116100db578063e737b57b11610094578063f2fde38b1161006e578063f2fde38b14610b90578063f54493d814610bb8578063fe575a8714610be2578063fef7090a14610c1e57610342565b8063e737b57b14610aec578063ea84a65c14610b28578063ec0e39bf14610b6657610342565b8063d257b34f146109de578063dd62ed3e14610a06578063dfe6b5d614610a42578063e2f4560514610a70578063e30c397814610a9a578063e35f5bdd14610ac457610342565b8063a9059cbb11610148578063b70143c911610122578063b70143c91461093c578063b8076f7414610964578063c02466681461097a578063c5be000c146109a257610342565b8063a9059cbb146108b0578063aacebbe3146108ec578063b384f7641461091457610342565b806389d5c72b146107ca5780638a8c523c146107e05780638da5cb5b146107f657806390683e8c1461082057806395d89b411461085c5780639edc5f0f1461088657610342565b8063470624021161024e57806370a082311161020757806375f0a874116101e157806375f0a8741461072657806379ba5097146107505780638428841714610766578063858e4a02146107a257610342565b806370a08231146106a7578063715018a6146106e357806371908a03146106f957610342565b8063470624021461059a57806349bd5a5e146105c55780634ada218b146105ef5780634eed4bd5146106195780634fbee1931461064157806360c067011461067d57610342565b806323b872dd116102bb578063313ce56711610295578063313ce567146104f6578063380628da14610520578063404e51291461054857806341bc2aa61461057057610342565b806323b872dd1461045257806323eb11511461048e5780632b14ca56146104cb57610342565b8063039bed0b1461034657806306fdde031461036e578063095ea7b3146103985780631053d256146103d45780631694505e146103fe57806318160ddd1461042857610342565b36610342577f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f866953334604051610338929190613885565b60405180910390a1005b5f5ffd5b348015610351575f5ffd5b5061036c600480360381019061036791906138e7565b610c48565b005b348015610379575f5ffd5b50610382610d27565b60405161038f9190613995565b60405180910390f35b3480156103a3575f5ffd5b506103be60048036038101906103b99190613a09565b610db7565b6040516103cb9190613a61565b60405180910390f35b3480156103df575f5ffd5b506103e8610dd9565b6040516103f59190613a7a565b60405180910390f35b348015610409575f5ffd5b50610412610de7565b60405161041f9190613aee565b60405180910390f35b348015610433575f5ffd5b5061043c610e0b565b6040516104499190613a7a565b60405180910390f35b34801561045d575f5ffd5b5061047860048036038101906104739190613b07565b610e14565b6040516104859190613a61565b60405180910390f35b348015610499575f5ffd5b506104b460048036038101906104af9190613b57565b610e42565b6040516104c2929190613b82565b60405180910390f35b3480156104d6575f5ffd5b506104df610e62565b6040516104ed929190613bb8565b60405180910390f35b348015610501575f5ffd5b5061050a610e8d565b6040516105179190613bfa565b60405180910390f35b34801561052b575f5ffd5b5061054660048036038101906105419190613b57565b610e95565b005b348015610553575f5ffd5b5061056e60048036038101906105699190613c3d565b610ee0565b005b34801561057b575f5ffd5b5061058461102b565b6040516105919190613a7a565b60405180910390f35b3480156105a5575f5ffd5b506105ae611039565b6040516105bc929190613bb8565b60405180910390f35b3480156105d0575f5ffd5b506105d9611064565b6040516105e69190613c7b565b60405180910390f35b3480156105fa575f5ffd5b50610603611089565b6040516106109190613a61565b60405180910390f35b348015610624575f5ffd5b5061063f600480360381019061063a9190613a09565b61109c565b005b34801561064c575f5ffd5b5061066760048036038101906106629190613b57565b6112f8565b6040516106749190613a61565b60405180910390f35b348015610688575f5ffd5b50610691611315565b60405161069e9190613a61565b60405180910390f35b3480156106b2575f5ffd5b506106cd60048036038101906106c89190613b57565b611328565b6040516106da9190613a7a565b60405180910390f35b3480156106ee575f5ffd5b506106f761136d565b005b348015610704575f5ffd5b5061070d611380565b60405161071d9493929190613c94565b60405180910390f35b348015610731575f5ffd5b5061073a6113dc565b6040516107479190613c7b565b60405180910390f35b34801561075b575f5ffd5b50610764611402565b005b348015610771575f5ffd5b5061078c60048036038101906107879190613b57565b611490565b6040516107999190613a61565b60405180910390f35b3480156107ad575f5ffd5b506107c860048036038101906107c391906138e7565b6114ad565b005b3480156107d5575f5ffd5b506107de61158c565b005b3480156107eb575f5ffd5b506107f46115b0565b005b348015610801575f5ffd5b5061080a6115d5565b6040516108179190613c7b565b60405180910390f35b34801561082b575f5ffd5b5061084660048036038101906108419190613b57565b6115fd565b6040516108539190613a61565b60405180910390f35b348015610867575f5ffd5b5061087061164f565b60405161087d9190613995565b60405180910390f35b348015610891575f5ffd5b5061089a6116df565b6040516108a79190613a7a565b60405180910390f35b3480156108bb575f5ffd5b506108d660048036038101906108d19190613a09565b6116e4565b6040516108e39190613a61565b60405180910390f35b3480156108f7575f5ffd5b50610912600480360381019061090d9190613b57565b611706565b005b34801561091f575f5ffd5b5061093a60048036038101906109359190613c3d565b6117b7565b005b348015610947575f5ffd5b50610962600480360381019061095d9190613cd7565b611988565b005b34801561096f575f5ffd5b50610978611c0f565b005b348015610985575f5ffd5b506109a0600480360381019061099b9190613c3d565b611c34565b005b3480156109ad575f5ffd5b506109c860048036038101906109c39190613b57565b611d7f565b6040516109d59190613a61565b60405180910390f35b3480156109e9575f5ffd5b50610a0460048036038101906109ff9190613cd7565b611dd1565b005b348015610a11575f5ffd5b50610a2c6004803603810190610a279190613d02565b611e2b565b604051610a399190613a7a565b60405180910390f35b348015610a4d575f5ffd5b50610a56611ead565b604051610a67959493929190613d40565b60405180910390f35b348015610a7b575f5ffd5b50610a84611ee9565b604051610a919190613a7a565b60405180910390f35b348015610aa5575f5ffd5b50610aae611eef565b604051610abb9190613c7b565b60405180910390f35b348015610acf575f5ffd5b50610aea6004803603810190610ae59190613a09565b611f17565b005b348015610af7575f5ffd5b50610b126004803603810190610b0d9190613b57565b61214a565b604051610b1f9190613a61565b60405180910390f35b348015610b33575f5ffd5b50610b4e6004803603810190610b499190613b57565b61219c565b604051610b5d93929190613d91565b60405180910390f35b348015610b71575f5ffd5b50610b7a61222a565b604051610b879190613c7b565b60405180910390f35b348015610b9b575f5ffd5b50610bb66004803603810190610bb19190613b57565b612252565b005b348015610bc3575f5ffd5b50610bcc6122fe565b604051610bd99190613a7a565b60405180910390f35b348015610bed575f5ffd5b50610c086004803603810190610c039190613b57565b61230c565b604051610c159190613a61565b60405180910390f35b348015610c29575f5ffd5b50610c32612329565b604051610c3f9190613c7b565b60405180910390f35b610c5061234e565b600a8183610c5e9190613df3565b61ffff161115610c9a576040517fe298135000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c5f015f6101000a81548161ffff021916908361ffff16021790555080600c5f0160026101000a81548161ffff021916908361ffff1602179055508082610ce39190613df3565b61ffff16600f819055508061ffff168261ffff167fc8f6ebed6f64bd25f0aed0b6507ae982cddfd23874ad542be24905c9412a4a1660405160405180910390a35050565b606060038054610d3690613e55565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6290613e55565b8015610dad5780601f10610d8457610100808354040283529160200191610dad565b820191905f5260205f20905b815481529060010190602001808311610d9057829003601f168201915b5050505050905090565b5f5f610dc16123d5565b9050610dce8185856123dc565b600191505092915050565b5f610de26123ee565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f5f610e1e6123d5565b9050610e2b858285612462565b610e368585856124f5565b60019150509392505050565b6008602052805f5260405f205f91509050805f0154908060010154905082565b600d805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff16905082565b5f6008905090565b610e9d61234e565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ee861234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f4d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610fd3576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f6110346125e5565b905090565b600c805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff16905082565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900460ff1681565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561112d57506110fd6115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611164576040517ffbc5dd9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c9576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040516024016111fa929190613885565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112489190613ec9565b5f604051808303815f865af19150503d805f8114611281576040519150601f19603f3d011682016040523d82523d5f602084013e611286565b606091505b50915091508180156112b357505f815114806112b25750808060200190518101906112b19190613ef3565b5b5b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613f8e565b60405180910390fd5b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600b60029054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61137561234e565b61137e5f61262f565b565b5f5f5f5f600c5f015f9054906101000a900461ffff16600c5f0160029054906101000a900461ffff16600d5f015f9054906101000a900461ffff16600d5f0160029054906101000a900461ffff16935093509350935090919293565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61140b6123d5565b90508073ffffffffffffffffffffffffffffffffffffffff1661142c611eef565b73ffffffffffffffffffffffffffffffffffffffff161461148457806040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161147b9190613c7b565b60405180910390fd5b61148d8161262f565b50565b6014602052805f5260405f205f915054906101000a900460ff1681565b6114b561234e565b600a81836114c39190613df3565b61ffff1611156114ff576040517fe298135000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d5f015f6101000a81548161ffff021916908361ffff16021790555080600d5f0160026101000a81548161ffff021916908361ffff16021790555080826115489190613df3565b61ffff166010819055508061ffff168261ffff167f52357d2b6ee817f5d57183c13530148906a8ec8b5be2fc82da16afbd8a04507260405160405180910390a35050565b61159461234e565b600160115f6101000a81548160ff021916908315150217905550565b6115b861234e565b6001600b60016101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b60606004805461165e90613e55565b80601f016020809104026020016040519081016040528092919081815260200182805461168a90613e55565b80156116d55780601f106116ac576101008083540402835291602001916116d5565b820191905f5260205f20905b8154815290600101906020018083116116b857829003601f168201915b5050505050905090565b600a81565b5f5f6116ee6123d5565b90506116fb8185856124f5565b600191505092915050565b61170e61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611773576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117bf61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611824576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f02e4f4c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611930576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6001600b5f6101000a81548160ff021916908315150217905550601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611a335750611a036115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611a6a576040517ffbc5dd9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f811480611a785750606481115b15611aaf576040517f1f3b85d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611ab930611328565b90505f8103611af4576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60648383611b039190613fac565b611b0d919061401a565b9050611b188161265f565b5f4790505f811115611bf0575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611b6b9061406d565b5f6040518083038185875af1925050503d805f8114611ba5576040519150601f19603f3d011682016040523d82523d5f602084013e611baa565b606091505b5050905080611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be5906140cb565b60405180910390fd5b505b5050505f600b5f6101000a81548160ff02191690831515021790555050565b611c1761234e565b6001600b60026101000a81548160ff021916908315150217905550565b611c3c61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611d27576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b611dd961234e565b5f8103611e12576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6305f5e10081611e229190613fac565b600a8190555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f5f5f5f5f611eba610e0b565b611ec330611328565b600e54600a5460115f9054906101000a900460ff16945094509450945094509091929394565b600a5481565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611fa75750611f776115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611fde576040517ff537af8e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361207c576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62ed4e004261208c91906140e9565b905060405180604001604052808381526020018281525060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fefa959232c3dff47265ea6402bee01616fb5293e0908468a5ddb92ca4cd3e004838360405161213d929190613b82565b60405180910390a2505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f5f5f5f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050805f015181602001515f835f015111801561221c575082602001514210155b935093509350509193909250565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61225a61234e565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166122b96115d5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6123076128e4565b905090565b6016602052805f5260405f205f915054906101000a900460ff1681565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6123566123d5565b73ffffffffffffffffffffffffffffffffffffffff166123746115d5565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576123976123d5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016123ca9190613c7b565b60405180910390fd5b565b5f33905090565b6123e98383836001612958565b505050565b5f60115f9054906101000a900460ff161561240d57600f54905061245f565b600a600e5411612420576019905061245f565b6014600e5411612433576014905061245f565b6019600e541161244657600f905061245f565b601e600e541161245957600a905061245f565b600f5490505b90565b5f61246d8484611e2b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156124ef57818110156124e0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016124d79392919061411c565b60405180910390fd5b6124ee84848484035f612958565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612565575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161255c9190613c7b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125d5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016125cc9190613c7b565b60405180910390fd5b6125e0838383612b27565b505050565b5f60115f9054906101000a900460ff1615612602575f905061262c565b600a600e541161261557600f905061262c565b601e600e541161262857600a905061262c565b5f90505b90565b60065f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561265c81613189565b50565b5f600267ffffffffffffffff81111561267b5761267a614151565b5b6040519080825280602002602001820160405280156126a95781602001602082028036833780820191505090505b50905030815f815181106126c0576126bf61417e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906141bf565b8160018151811061279b5761279a61417e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612800307f0000000000000000000000000000000000000000000000000000000000000000611e2b565b101561285257612851307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6123dc565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016128b39594939291906142da565b5f604051808303815f87803b1580156128ca575f5ffd5b505af11580156128dc573d5f5f3e3d5ffd5b505050505050565b5f60115f9054906101000a900460ff1615612903576010549050612955565b600a600e54116129165760199050612955565b6014600e54116129295760149050612955565b6019600e541161293c57600f9050612955565b601e600e541161294f57600a9050612955565b60105490505b90565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129c8575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016129bf9190613c7b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a38575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a2f9190613c7b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612b21578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b189190613a7a565b60405180910390a35b50505050565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bc2575060165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612bf9576040517fd9a60d2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103612c1057612c0b83835f61324c565b613184565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c735750600b60029054906101000a900460ff16155b8015612cc6575060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612cfd576040517fe614db7800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d0730611328565b90505f600a548210159050808015612d66575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612d7e5750600b5f9054906101000a900460ff16155b8015612dd1575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612e24575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612e3357612e3282613465565b5b5f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612ed2575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b905080612eec57612ee486868661324c565b505050613184565b600b60019054906101000a900460ff16612f32576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f90505f4290505f612f436125e5565b9050600e5f81546001019190508190555060145f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fab57505f600f54115b15612feb575f612fb96123ee565b90505f8183612fc891906140e9565b90506064818a612fd89190613fac565b612fe2919061401a565b94505050613150565b60145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561304257505f601054115b1561312b575f60085f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f825f015411801561309e575081600101548410155b80156130ad5750815f01548911155b905080156130ed5788825f015f8282546130c79190614332565b925050819055506064838a6130dc9190613fac565b6130e6919061401a565b9450613124565b5f6130f66128e4565b90505f818561310591906140e9565b90506064818c6131159190613fac565b61311f919061401a565b965050505b505061314f565b5f81111561314e57606481886131419190613fac565b61314b919061401a565b92505b5b5b5f8311156131725761316389308561324c565b828761316f9190614332565b96505b61317d89898961324c565b5050505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361329c578060025f82825461329091906140e9565b9250508190555061336a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613325578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161331c9392919061411c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133b1578060025f82825403925050819055506133fb565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134589190613a7a565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f601054600f5461349091906140e9565b90505f8103613581576134a28261265f565b5f4790505f81111561357a575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134f59061406d565b5f6040518083038185875af1925050503d805f811461352f576040519150601f19603f3d011682016040523d82523d5f602084013e613534565b606091505b5050905080613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f906143af565b60405180910390fd5b505b505061375f565b5f8183600d5f015f9054906101000a900461ffff16600c5f015f9054906101000a900461ffff166135b29190613df3565b61ffff166135c09190613fac565b6135ca919061401a565b90505f81846135d99190614332565b90505f6002826135e9919061401a565b90505f81866135f89190614332565b90505f4790506136078261265f565b5f81476136149190614332565b90505f8382866136249190613fac565b61362e919061401a565b90505f8111801561363e57505f85115b1561364e5761364d858261377b565b5b5f4790505f811115613726575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136a19061406d565b5f6040518083038185875af1925050503d805f81146136db576040519150601f19603f3d011682016040523d82523d5f602084013e6136e0565b606091505b5050905080613724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371b906143af565b60405180910390fd5b505b8086837ff8cfc1c15ead481ffc3a2df6126e88c84a6730799e332fcfe2dbc386373d517160405160405180910390a45050505050505050505b5f600b5f6101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f5f6137c46115d5565b426040518863ffffffff1660e01b81526004016137e6969594939291906143cd565b60606040518083038185885af1158015613802573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138279190614440565b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138578261382e565b9050919050565b6138678161384d565b82525050565b5f819050919050565b61387f8161386d565b82525050565b5f6040820190506138985f83018561385e565b6138a56020830184613876565b9392505050565b5f5ffd5b5f61ffff82169050919050565b6138c6816138b0565b81146138d0575f5ffd5b50565b5f813590506138e1816138bd565b92915050565b5f5f604083850312156138fd576138fc6138ac565b5b5f61390a858286016138d3565b925050602061391b858286016138d3565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61396782613925565b613971818561392f565b935061398181856020860161393f565b61398a8161394d565b840191505092915050565b5f6020820190508181035f8301526139ad818461395d565b905092915050565b6139be8161384d565b81146139c8575f5ffd5b50565b5f813590506139d9816139b5565b92915050565b6139e88161386d565b81146139f2575f5ffd5b50565b5f81359050613a03816139df565b92915050565b5f5f60408385031215613a1f57613a1e6138ac565b5b5f613a2c858286016139cb565b9250506020613a3d858286016139f5565b9150509250929050565b5f8115159050919050565b613a5b81613a47565b82525050565b5f602082019050613a745f830184613a52565b92915050565b5f602082019050613a8d5f830184613876565b92915050565b5f819050919050565b5f613ab6613ab1613aac8461382e565b613a93565b61382e565b9050919050565b5f613ac782613a9c565b9050919050565b5f613ad882613abd565b9050919050565b613ae881613ace565b82525050565b5f602082019050613b015f830184613adf565b92915050565b5f5f5f60608486031215613b1e57613b1d6138ac565b5b5f613b2b868287016139cb565b9350506020613b3c868287016139cb565b9250506040613b4d868287016139f5565b9150509250925092565b5f60208284031215613b6c57613b6b6138ac565b5b5f613b79848285016139cb565b91505092915050565b5f604082019050613b955f830185613876565b613ba26020830184613876565b9392505050565b613bb2816138b0565b82525050565b5f604082019050613bcb5f830185613ba9565b613bd86020830184613ba9565b9392505050565b5f60ff82169050919050565b613bf481613bdf565b82525050565b5f602082019050613c0d5f830184613beb565b92915050565b613c1c81613a47565b8114613c26575f5ffd5b50565b5f81359050613c3781613c13565b92915050565b5f5f60408385031215613c5357613c526138ac565b5b5f613c60858286016139cb565b9250506020613c7185828601613c29565b9150509250929050565b5f602082019050613c8e5f83018461385e565b92915050565b5f608082019050613ca75f830187613ba9565b613cb46020830186613ba9565b613cc16040830185613ba9565b613cce6060830184613ba9565b95945050505050565b5f60208284031215613cec57613ceb6138ac565b5b5f613cf9848285016139f5565b91505092915050565b5f5f60408385031215613d1857613d176138ac565b5b5f613d25858286016139cb565b9250506020613d36858286016139cb565b9150509250929050565b5f60a082019050613d535f830188613876565b613d606020830187613876565b613d6d6040830186613876565b613d7a6060830185613876565b613d876080830184613a52565b9695505050505050565b5f606082019050613da45f830186613876565b613db16020830185613876565b613dbe6040830184613a52565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613dfd826138b0565b9150613e08836138b0565b9250828201905061ffff811115613e2257613e21613dc6565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613e6c57607f821691505b602082108103613e7f57613e7e613e28565b5b50919050565b5f81519050919050565b5f81905092915050565b5f613ea382613e85565b613ead8185613e8f565b9350613ebd81856020860161393f565b80840191505092915050565b5f613ed48284613e99565b915081905092915050565b5f81519050613eed81613c13565b92915050565b5f60208284031215613f0857613f076138ac565b5b5f613f1584828501613edf565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a2074725f8201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b5f613f78602d8361392f565b9150613f8382613f1e565b604082019050919050565b5f6020820190508181035f830152613fa581613f6c565b9050919050565b5f613fb68261386d565b9150613fc18361386d565b9250828202613fcf8161386d565b91508282048414831517613fe657613fe5613dc6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140248261386d565b915061402f8361386d565b92508261403f5761403e613fed565b5b828204905092915050565b50565b5f6140585f83613e8f565b91506140638261404a565b5f82019050919050565b5f6140778261404d565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6140b560138361392f565b91506140c082614081565b602082019050919050565b5f6020820190508181035f8301526140e2816140a9565b9050919050565b5f6140f38261386d565b91506140fe8361386d565b925082820190508082111561411657614115613dc6565b5b92915050565b5f60608201905061412f5f83018661385e565b61413c6020830185613876565b6141496040830184613876565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506141b9816139b5565b92915050565b5f602082840312156141d4576141d36138ac565b5b5f6141e1848285016141ab565b91505092915050565b5f819050919050565b5f61420d614208614203846141ea565b613a93565b61386d565b9050919050565b61421d816141f3565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142558161384d565b82525050565b5f614266838361424c565b60208301905092915050565b5f602082019050919050565b5f61428882614223565b614292818561422d565b935061429d8361423d565b805f5b838110156142cd5781516142b4888261425b565b97506142bf83614272565b9250506001810190506142a0565b5085935050505092915050565b5f60a0820190506142ed5f830188613876565b6142fa6020830187614214565b818103604083015261430c818661427e565b905061431b606083018561385e565b6143286080830184613876565b9695505050505050565b5f61433c8261386d565b91506143478361386d565b925082820390508181111561435f5761435e613dc6565b5b92915050565b7f4d61726b6574696e67207472616e73666572206661696c6564000000000000005f82015250565b5f61439960198361392f565b91506143a482614365565b602082019050919050565b5f6020820190508181035f8301526143c68161438d565b9050919050565b5f60c0820190506143e05f83018961385e565b6143ed6020830188613876565b6143fa6040830187614214565b6144076060830186614214565b614414608083018561385e565b61442160a0830184613876565b979650505050505050565b5f8151905061443a816139df565b92915050565b5f5f5f60608486031215614457576144566138ac565b5b5f6144648682870161442c565b93505060206144758682870161442c565b92505060406144868682870161442c565b915050925092509256fea2646970667358221220db06ff491e3596387f050b512310d24a9400c9a3a55a05c3a99eb801da20bfeb64736f6c634300081b00336080604052730f31b5ed38b39b435128adc6b173f0939116859e60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730f31b5ed38b39b435128adc6b173f0939116859e60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507365eae045386dff93094e5896ceb6ad54a221260d60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062b71b00600b556001600c60146101000a81548160ff02191690831515021790555034801561012d575f5ffd5b5060405161218d38038061218d833981810160405281019061014f91906104b6565b815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101c0575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101b79190610503565b60405180910390fd5b6101cf8161028860201b60201c565b506001600281905550735f4ec3df9cbd43714fe2740f5e3616155c5b841960035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426009819055506102816102be60201b60201c565b505061072d565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556102bb8161039760201b60201c565b50565b5f5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561032a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034e91906105c1565b509350509250505f821380156103715750610e10814261036e9190610665565b11155b1561039357620f42408261038591906106c5565b600581905550806004819055505b5050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104858261045c565b9050919050565b6104958161047b565b811461049f575f5ffd5b50565b5f815190506104b08161048c565b92915050565b5f5f604083850312156104cc576104cb610458565b5b5f6104d9858286016104a2565b92505060206104ea858286016104a2565b9150509250929050565b6104fd8161047b565b82525050565b5f6020820190506105165f8301846104f4565b92915050565b5f69ffffffffffffffffffff82169050919050565b61053a8161051c565b8114610544575f5ffd5b50565b5f8151905061055581610531565b92915050565b5f819050919050565b61056d8161055b565b8114610577575f5ffd5b50565b5f8151905061058881610564565b92915050565b5f819050919050565b6105a08161058e565b81146105aa575f5ffd5b50565b5f815190506105bb81610597565b92915050565b5f5f5f5f5f60a086880312156105da576105d9610458565b5b5f6105e788828901610547565b95505060206105f88882890161057a565b9450506040610609888289016105ad565b935050606061061a888289016105ad565b925050608061062b88828901610547565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61066f8261058e565b915061067a8361058e565b925082820390508181111561069257610691610638565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6106cf8261055b565b91506106da8361055b565b9250826106ea576106e9610698565b5b60015f0383147f80000000000000000000000000000000000000000000000000000000000000008314161561072257610721610638565b5b828205905092915050565b611a538061073a5f395ff3fe608060405260043610610122575f3560e01c806380a3f3ef1161009f578063b70143c911610063578063b70143c914610693578063e30c3978146106bb578063ecda10f5146106e5578063f2fde38b1461070f578063ff9fac1a1461073757610470565b806380a3f3ef146105d95780638943b2e4146105ef5780638da5cb5b1461061757806395060e5914610641578063ae3557bb1461066957610470565b806367272999116100e65780636727299914610545578063715018a61461055b57806375f0a87414610571578063773a50d01461059b57806379ba5097146105c357610470565b80632217455a146104745780632af0adb51461049f57806334069243146104c957806350fc019d146104f35780635a7afe641461051d57610470565b366104705761012f610761565b600c60149054906101000a900460ff1615610466575f3490505f81036101555750610466565b600b54600a5410610230575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516101a690611244565b5f6040518083038185875af1925050503d805f81146101e0576040519150601f19603f3d011682016040523d82523d5f602084013e6101e5565b606091505b5050905080610229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610220906112d8565b60405180910390fd5b5050610466565b5f5f61023b836107a5565b91509150610247610825565b5f670de0b6b3a76400006005548461025f919061132c565b610269919061139a565b90505f600a54600b5461027c91906113ca565b9050818110610375575f8411156103705781600a5f82825461029e91906113fd565b925050819055505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16856040516102eb90611244565b5f6040518083038185875af1925050503d805f8114610325576040519150601f19603f3d011682016040523d82523d5f602084013e61032a565b606091505b505090508061036e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103659061147a565b60405180910390fd5b505b61038d565b5f84111561038c57838361038991906113fd565b92505b5b5f831115610460575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516103db90611244565b5f6040518083038185875af1925050503d805f8114610415576040519150601f19603f3d011682016040523d82523d5f602084013e61041a565b606091505b505090508061045e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610455906112d8565b60405180910390fd5b505b50505050505b61046e6108fe565b005b5f5ffd5b34801561047f575f5ffd5b50610488610908565b6040516104969291906114a7565b60405180910390f35b3480156104aa575f5ffd5b506104b3610918565b6040516104c091906114ce565b60405180910390f35b3480156104d4575f5ffd5b506104dd61091e565b6040516104ea91906114ce565b60405180910390f35b3480156104fe575f5ffd5b50610507610924565b6040516105149190611561565b60405180910390f35b348015610528575f5ffd5b50610543600480360381019061053e91906115e3565b610949565b005b348015610550575f5ffd5b506105596109de565b005b348015610566575f5ffd5b5061056f610ae6565b005b34801561057c575f5ffd5b50610585610af9565b6040516105929190611630565b60405180910390f35b3480156105a6575f5ffd5b506105c160048036038101906105bc9190611649565b610b1e565b005b3480156105ce575f5ffd5b506105d7610baa565b005b3480156105e4575f5ffd5b506105ed610c38565b005b3480156105fa575f5ffd5b50610615600480360381019061061091906115e3565b610c6c565b005b348015610622575f5ffd5b5061062b610da3565b6040516106389190611630565b60405180910390f35b34801561064c575f5ffd5b5061066760048036038101906106629190611687565b610dca565b005b348015610674575f5ffd5b5061067d610ee2565b60405161068a9190611630565b60405180910390f35b34801561069e575f5ffd5b506106b960048036038101906106b49190611687565b610f07565b005b3480156106c6575f5ffd5b506106cf610f99565b6040516106dc9190611630565b60405180910390f35b3480156106f0575f5ffd5b506106f9610fc1565b60405161070691906114ce565b60405180910390f35b34801561071a575f5ffd5b50610735600480360381019061073091906116b2565b610fc7565b005b348015610742575f5ffd5b5061074b611073565b6040516107589190611630565b60405180910390f35b600280540361079c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028081905550565b5f5f5f600954426107b691906113ca565b90505f6212750090508082116107f45760646028866107d5919061132c565b6107df919061139a565b935083856107ed91906113ca565b925061081e565b6064601486610803919061132c565b61080d919061139a565b9350838561081b91906113ca565b92505b5050915091565b5f5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610891573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b59190611763565b509350509250505f821380156108d85750610e1081426108d591906113ca565b11155b156108fa57620f4240826108ec91906117da565b600581905550806004819055505b5050565b6001600281905550565b5f5f600554600454915091509091565b600a5481565b600b5481565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610951611098565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634eed4bd583836040518363ffffffff1660e01b81526004016109ad929190611842565b5f604051808303815f87803b1580156109c4575f5ffd5b505af11580156109d6573d5f5f3e3d5ffd5b505050505050565b6109e6611098565b6109ee610761565b5f4790505f8103610a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2b906118b3565b60405180910390fd5b5f610a3d610da3565b73ffffffffffffffffffffffffffffffffffffffff1682604051610a6090611244565b5f6040518083038185875af1925050503d805f8114610a9a576040519150601f19603f3d011682016040523d82523d5f602084013e610a9f565b606091505b5050905080610ada576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610ae46108fe565b565b610aee611098565b610af75f61111f565b565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b26611098565b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f610bb361114f565b90508073ffffffffffffffffffffffffffffffffffffffff16610bd4610f99565b73ffffffffffffffffffffffffffffffffffffffff1614610c2c57806040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c239190611630565b60405180910390fd5b610c358161111f565b50565b610c40611098565b600c60149054906101000a900460ff1615600c60146101000a81548160ff021916908315150217905550565b610c74611098565b5f5f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3385604051602401610ca5929190611842565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cf39190611919565b5f604051808303815f865af19150503d805f8114610d2c576040519150601f19603f3d011682016040523d82523d5f602084013e610d31565b606091505b5091509150818015610d5e57505f81511480610d5d575080806020019051810190610d5c9190611964565b5b5b610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d94906119ff565b60405180910390fd5b50505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610e5a5750610e2a610da3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e91576040517f07e7d15800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54811015610ea157600a5490505b80600b819055507f57119eab85b40f774dd79b299f71f087511b52a5f517997dd9c076ef3abf795981604051610ed791906114ce565b60405180910390a150565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f0f611098565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70143c9826040518263ffffffff1660e01b8152600401610f6991906114ce565b5f604051808303815f87803b158015610f80575f5ffd5b505af1158015610f92573d5f5f3e3d5ffd5b5050505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b610fcf611098565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661102e610da3565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110a061114f565b73ffffffffffffffffffffffffffffffffffffffff166110be610da3565b73ffffffffffffffffffffffffffffffffffffffff161461111d576110e161114f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111149190611630565b60405180910390fd5b565b60015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561114c81611156565b50565b5f33905090565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81905092915050565b50565b5f61122f5f83611217565b915061123a82611221565b5f82019050919050565b5f61124e82611224565b9150819050919050565b5f82825260208201905092915050565b7f4661696c656420746f2073656e6420746f206d61726b6574696e672077616c6c5f8201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b5f6112c2602283611258565b91506112cd82611268565b604082019050919050565b5f6020820190508181035f8301526112ef816112b6565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611336826112f6565b9150611341836112f6565b925082820261134f816112f6565b91508282048414831517611366576113656112ff565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6113a4826112f6565b91506113af836112f6565b9250826113bf576113be61136d565b5b828204905092915050565b5f6113d4826112f6565b91506113df836112f6565b92508282039050818111156113f7576113f66112ff565b5b92915050565b5f611407826112f6565b9150611412836112f6565b925082820190508082111561142a576114296112ff565b5b92915050565b7f4661696c656420746f207472616e7366657220746f20417374726158000000005f82015250565b5f611464601c83611258565b915061146f82611430565b602082019050919050565b5f6020820190508181035f83015261149181611458565b9050919050565b6114a1816112f6565b82525050565b5f6040820190506114ba5f830185611498565b6114c76020830184611498565b9392505050565b5f6020820190506114e15f830184611498565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61152961152461151f846114e7565b611506565b6114e7565b9050919050565b5f61153a8261150f565b9050919050565b5f61154b82611530565b9050919050565b61155b81611541565b82525050565b5f6020820190506115745f830184611552565b92915050565b5f5ffd5b5f611588826114e7565b9050919050565b6115988161157e565b81146115a2575f5ffd5b50565b5f813590506115b38161158f565b92915050565b6115c2816112f6565b81146115cc575f5ffd5b50565b5f813590506115dd816115b9565b92915050565b5f5f604083850312156115f9576115f861157a565b5b5f611606858286016115a5565b9250506020611617858286016115cf565b9150509250929050565b61162a8161157e565b82525050565b5f6020820190506116435f830184611621565b92915050565b5f5f6040838503121561165f5761165e61157a565b5b5f61166c858286016115a5565b925050602061167d858286016115a5565b9150509250929050565b5f6020828403121561169c5761169b61157a565b5b5f6116a9848285016115cf565b91505092915050565b5f602082840312156116c7576116c661157a565b5b5f6116d4848285016115a5565b91505092915050565b5f69ffffffffffffffffffff82169050919050565b6116fb816116dd565b8114611705575f5ffd5b50565b5f81519050611716816116f2565b92915050565b5f819050919050565b61172e8161171c565b8114611738575f5ffd5b50565b5f8151905061174981611725565b92915050565b5f8151905061175d816115b9565b92915050565b5f5f5f5f5f60a0868803121561177c5761177b61157a565b5b5f61178988828901611708565b955050602061179a8882890161173b565b94505060406117ab8882890161174f565b93505060606117bc8882890161174f565b92505060806117cd88828901611708565b9150509295509295909350565b5f6117e48261171c565b91506117ef8361171c565b9250826117ff576117fe61136d565b5b60015f0383147f800000000000000000000000000000000000000000000000000000000000000083141615611837576118366112ff565b5b828205905092915050565b5f6040820190506118555f830185611621565b6118626020830184611498565b9392505050565b7f4e6f2045544820746f20636c61696d00000000000000000000000000000000005f82015250565b5f61189d600f83611258565b91506118a882611869565b602082019050919050565b5f6020820190508181035f8301526118ca81611891565b9050919050565b5f81519050919050565b8281835e5f83830152505050565b5f6118f3826118d1565b6118fd8185611217565b935061190d8185602086016118db565b80840191505092915050565b5f61192482846118e9565b915081905092915050565b5f8115159050919050565b6119438161192f565b811461194d575f5ffd5b50565b5f8151905061195e8161193a565b92915050565b5f602082840312156119795761197861157a565b5b5f61198684828501611950565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a2074725f8201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b5f6119e9602d83611258565b91506119f48261198f565b604082019050919050565b5f6020820190508181035f830152611a16816119dd565b905091905056fea2646970667358221220a912f92b22cb6af316db47aeca9857b8ff17c5048640646cab71d386a6179aa164736f6c634300081b0033
Deployed Bytecode
0x608060405260043610610302575f3560e01c806389d5c72b1161018f578063d257b34f116100db578063e737b57b11610094578063f2fde38b1161006e578063f2fde38b14610b90578063f54493d814610bb8578063fe575a8714610be2578063fef7090a14610c1e57610342565b8063e737b57b14610aec578063ea84a65c14610b28578063ec0e39bf14610b6657610342565b8063d257b34f146109de578063dd62ed3e14610a06578063dfe6b5d614610a42578063e2f4560514610a70578063e30c397814610a9a578063e35f5bdd14610ac457610342565b8063a9059cbb11610148578063b70143c911610122578063b70143c91461093c578063b8076f7414610964578063c02466681461097a578063c5be000c146109a257610342565b8063a9059cbb146108b0578063aacebbe3146108ec578063b384f7641461091457610342565b806389d5c72b146107ca5780638a8c523c146107e05780638da5cb5b146107f657806390683e8c1461082057806395d89b411461085c5780639edc5f0f1461088657610342565b8063470624021161024e57806370a082311161020757806375f0a874116101e157806375f0a8741461072657806379ba5097146107505780638428841714610766578063858e4a02146107a257610342565b806370a08231146106a7578063715018a6146106e357806371908a03146106f957610342565b8063470624021461059a57806349bd5a5e146105c55780634ada218b146105ef5780634eed4bd5146106195780634fbee1931461064157806360c067011461067d57610342565b806323b872dd116102bb578063313ce56711610295578063313ce567146104f6578063380628da14610520578063404e51291461054857806341bc2aa61461057057610342565b806323b872dd1461045257806323eb11511461048e5780632b14ca56146104cb57610342565b8063039bed0b1461034657806306fdde031461036e578063095ea7b3146103985780631053d256146103d45780631694505e146103fe57806318160ddd1461042857610342565b36610342577f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f866953334604051610338929190613885565b60405180910390a1005b5f5ffd5b348015610351575f5ffd5b5061036c600480360381019061036791906138e7565b610c48565b005b348015610379575f5ffd5b50610382610d27565b60405161038f9190613995565b60405180910390f35b3480156103a3575f5ffd5b506103be60048036038101906103b99190613a09565b610db7565b6040516103cb9190613a61565b60405180910390f35b3480156103df575f5ffd5b506103e8610dd9565b6040516103f59190613a7a565b60405180910390f35b348015610409575f5ffd5b50610412610de7565b60405161041f9190613aee565b60405180910390f35b348015610433575f5ffd5b5061043c610e0b565b6040516104499190613a7a565b60405180910390f35b34801561045d575f5ffd5b5061047860048036038101906104739190613b07565b610e14565b6040516104859190613a61565b60405180910390f35b348015610499575f5ffd5b506104b460048036038101906104af9190613b57565b610e42565b6040516104c2929190613b82565b60405180910390f35b3480156104d6575f5ffd5b506104df610e62565b6040516104ed929190613bb8565b60405180910390f35b348015610501575f5ffd5b5061050a610e8d565b6040516105179190613bfa565b60405180910390f35b34801561052b575f5ffd5b5061054660048036038101906105419190613b57565b610e95565b005b348015610553575f5ffd5b5061056e60048036038101906105699190613c3d565b610ee0565b005b34801561057b575f5ffd5b5061058461102b565b6040516105919190613a7a565b60405180910390f35b3480156105a5575f5ffd5b506105ae611039565b6040516105bc929190613bb8565b60405180910390f35b3480156105d0575f5ffd5b506105d9611064565b6040516105e69190613c7b565b60405180910390f35b3480156105fa575f5ffd5b50610603611089565b6040516106109190613a61565b60405180910390f35b348015610624575f5ffd5b5061063f600480360381019061063a9190613a09565b61109c565b005b34801561064c575f5ffd5b5061066760048036038101906106629190613b57565b6112f8565b6040516106749190613a61565b60405180910390f35b348015610688575f5ffd5b50610691611315565b60405161069e9190613a61565b60405180910390f35b3480156106b2575f5ffd5b506106cd60048036038101906106c89190613b57565b611328565b6040516106da9190613a7a565b60405180910390f35b3480156106ee575f5ffd5b506106f761136d565b005b348015610704575f5ffd5b5061070d611380565b60405161071d9493929190613c94565b60405180910390f35b348015610731575f5ffd5b5061073a6113dc565b6040516107479190613c7b565b60405180910390f35b34801561075b575f5ffd5b50610764611402565b005b348015610771575f5ffd5b5061078c60048036038101906107879190613b57565b611490565b6040516107999190613a61565b60405180910390f35b3480156107ad575f5ffd5b506107c860048036038101906107c391906138e7565b6114ad565b005b3480156107d5575f5ffd5b506107de61158c565b005b3480156107eb575f5ffd5b506107f46115b0565b005b348015610801575f5ffd5b5061080a6115d5565b6040516108179190613c7b565b60405180910390f35b34801561082b575f5ffd5b5061084660048036038101906108419190613b57565b6115fd565b6040516108539190613a61565b60405180910390f35b348015610867575f5ffd5b5061087061164f565b60405161087d9190613995565b60405180910390f35b348015610891575f5ffd5b5061089a6116df565b6040516108a79190613a7a565b60405180910390f35b3480156108bb575f5ffd5b506108d660048036038101906108d19190613a09565b6116e4565b6040516108e39190613a61565b60405180910390f35b3480156108f7575f5ffd5b50610912600480360381019061090d9190613b57565b611706565b005b34801561091f575f5ffd5b5061093a60048036038101906109359190613c3d565b6117b7565b005b348015610947575f5ffd5b50610962600480360381019061095d9190613cd7565b611988565b005b34801561096f575f5ffd5b50610978611c0f565b005b348015610985575f5ffd5b506109a0600480360381019061099b9190613c3d565b611c34565b005b3480156109ad575f5ffd5b506109c860048036038101906109c39190613b57565b611d7f565b6040516109d59190613a61565b60405180910390f35b3480156109e9575f5ffd5b50610a0460048036038101906109ff9190613cd7565b611dd1565b005b348015610a11575f5ffd5b50610a2c6004803603810190610a279190613d02565b611e2b565b604051610a399190613a7a565b60405180910390f35b348015610a4d575f5ffd5b50610a56611ead565b604051610a67959493929190613d40565b60405180910390f35b348015610a7b575f5ffd5b50610a84611ee9565b604051610a919190613a7a565b60405180910390f35b348015610aa5575f5ffd5b50610aae611eef565b604051610abb9190613c7b565b60405180910390f35b348015610acf575f5ffd5b50610aea6004803603810190610ae59190613a09565b611f17565b005b348015610af7575f5ffd5b50610b126004803603810190610b0d9190613b57565b61214a565b604051610b1f9190613a61565b60405180910390f35b348015610b33575f5ffd5b50610b4e6004803603810190610b499190613b57565b61219c565b604051610b5d93929190613d91565b60405180910390f35b348015610b71575f5ffd5b50610b7a61222a565b604051610b879190613c7b565b60405180910390f35b348015610b9b575f5ffd5b50610bb66004803603810190610bb19190613b57565b612252565b005b348015610bc3575f5ffd5b50610bcc6122fe565b604051610bd99190613a7a565b60405180910390f35b348015610bed575f5ffd5b50610c086004803603810190610c039190613b57565b61230c565b604051610c159190613a61565b60405180910390f35b348015610c29575f5ffd5b50610c32612329565b604051610c3f9190613c7b565b60405180910390f35b610c5061234e565b600a8183610c5e9190613df3565b61ffff161115610c9a576040517fe298135000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c5f015f6101000a81548161ffff021916908361ffff16021790555080600c5f0160026101000a81548161ffff021916908361ffff1602179055508082610ce39190613df3565b61ffff16600f819055508061ffff168261ffff167fc8f6ebed6f64bd25f0aed0b6507ae982cddfd23874ad542be24905c9412a4a1660405160405180910390a35050565b606060038054610d3690613e55565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6290613e55565b8015610dad5780601f10610d8457610100808354040283529160200191610dad565b820191905f5260205f20905b815481529060010190602001808311610d9057829003601f168201915b5050505050905090565b5f5f610dc16123d5565b9050610dce8185856123dc565b600191505092915050565b5f610de26123ee565b905090565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f5f610e1e6123d5565b9050610e2b858285612462565b610e368585856124f5565b60019150509392505050565b6008602052805f5260405f205f91509050805f0154908060010154905082565b600d805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff16905082565b5f6008905090565b610e9d61234e565b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ee861234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f4d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610fd3576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f6110346125e5565b905090565b600c805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff16905082565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60019054906101000a900460ff1681565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561112d57506110fd6115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611164576040517ffbc5dd9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c9576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040516024016111fa929190613885565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112489190613ec9565b5f604051808303815f865af19150503d805f8114611281576040519150601f19603f3d011682016040523d82523d5f602084013e611286565b606091505b50915091508180156112b357505f815114806112b25750808060200190518101906112b19190613ef3565b5b5b6112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613f8e565b60405180910390fd5b50505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600b60029054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61137561234e565b61137e5f61262f565b565b5f5f5f5f600c5f015f9054906101000a900461ffff16600c5f0160029054906101000a900461ffff16600d5f015f9054906101000a900461ffff16600d5f0160029054906101000a900461ffff16935093509350935090919293565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61140b6123d5565b90508073ffffffffffffffffffffffffffffffffffffffff1661142c611eef565b73ffffffffffffffffffffffffffffffffffffffff161461148457806040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161147b9190613c7b565b60405180910390fd5b61148d8161262f565b50565b6014602052805f5260405f205f915054906101000a900460ff1681565b6114b561234e565b600a81836114c39190613df3565b61ffff1611156114ff576040517fe298135000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d5f015f6101000a81548161ffff021916908361ffff16021790555080600d5f0160026101000a81548161ffff021916908361ffff16021790555080826115489190613df3565b61ffff166010819055508061ffff168261ffff167f52357d2b6ee817f5d57183c13530148906a8ec8b5be2fc82da16afbd8a04507260405160405180910390a35050565b61159461234e565b600160115f6101000a81548160ff021916908315150217905550565b6115b861234e565b6001600b60016101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b60606004805461165e90613e55565b80601f016020809104026020016040519081016040528092919081815260200182805461168a90613e55565b80156116d55780601f106116ac576101008083540402835291602001916116d5565b820191905f5260205f20905b8154815290600101906020018083116116b857829003601f168201915b5050505050905090565b600a81565b5f5f6116ee6123d5565b90506116fb8185856124f5565b600191505092915050565b61170e61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611773576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117bf61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611824576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118aa576040517f02e4f4c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611930576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6001600b5f6101000a81548160ff021916908315150217905550601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611a335750611a036115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611a6a576040517ffbc5dd9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f811480611a785750606481115b15611aaf576040517f1f3b85d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611ab930611328565b90505f8103611af4576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60648383611b039190613fac565b611b0d919061401a565b9050611b188161265f565b5f4790505f811115611bf0575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611b6b9061406d565b5f6040518083038185875af1925050503d805f8114611ba5576040519150601f19603f3d011682016040523d82523d5f602084013e611baa565b606091505b5050905080611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be5906140cb565b60405180910390fd5b505b5050505f600b5f6101000a81548160ff02191690831515021790555050565b611c1761234e565b6001600b60026101000a81548160ff021916908315150217905550565b611c3c61234e565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611d27576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b611dd961234e565b5f8103611e12576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6305f5e10081611e229190613fac565b600a8190555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f5f5f5f5f611eba610e0b565b611ec330611328565b600e54600a5460115f9054906101000a900460ff16945094509450945094509091929394565b600a5481565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611fa75750611f776115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611fde576040517ff537af8e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612043576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f810361207c576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62ed4e004261208c91906140e9565b905060405180604001604052808381526020018281525060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fefa959232c3dff47265ea6402bee01616fb5293e0908468a5ddb92ca4cd3e004838360405161213d929190613b82565b60405180910390a2505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f5f5f5f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050805f015181602001515f835f015111801561221c575082602001514210155b935093509350509193909250565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61225a61234e565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166122b96115d5565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6123076128e4565b905090565b6016602052805f5260405f205f915054906101000a900460ff1681565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6123566123d5565b73ffffffffffffffffffffffffffffffffffffffff166123746115d5565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576123976123d5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016123ca9190613c7b565b60405180910390fd5b565b5f33905090565b6123e98383836001612958565b505050565b5f60115f9054906101000a900460ff161561240d57600f54905061245f565b600a600e5411612420576019905061245f565b6014600e5411612433576014905061245f565b6019600e541161244657600f905061245f565b601e600e541161245957600a905061245f565b600f5490505b90565b5f61246d8484611e2b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156124ef57818110156124e0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016124d79392919061411c565b60405180910390fd5b6124ee84848484035f612958565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612565575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161255c9190613c7b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125d5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016125cc9190613c7b565b60405180910390fd5b6125e0838383612b27565b505050565b5f60115f9054906101000a900460ff1615612602575f905061262c565b600a600e541161261557600f905061262c565b601e600e541161262857600a905061262c565b5f90505b90565b60065f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561265c81613189565b50565b5f600267ffffffffffffffff81111561267b5761267a614151565b5b6040519080825280602002602001820160405280156126a95781602001602082028036833780820191505090505b50905030815f815181106126c0576126bf61417e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906141bf565b8160018151811061279b5761279a61417e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612800307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d611e2b565b101561285257612851307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6123dc565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016128b39594939291906142da565b5f604051808303815f87803b1580156128ca575f5ffd5b505af11580156128dc573d5f5f3e3d5ffd5b505050505050565b5f60115f9054906101000a900460ff1615612903576010549050612955565b600a600e54116129165760199050612955565b6014600e54116129295760149050612955565b6019600e541161293c57600f9050612955565b601e600e541161294f57600a9050612955565b60105490505b90565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129c8575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016129bf9190613c7b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a38575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612a2f9190613c7b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612b21578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b189190613a7a565b60405180910390a35b50505050565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bc2575060165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612bf9576040517fd9a60d2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8103612c1057612c0b83835f61324c565b613184565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c735750600b60029054906101000a900460ff16155b8015612cc6575060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612cfd576040517fe614db7800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d0730611328565b90505f600a548210159050808015612d66575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612d7e5750600b5f9054906101000a900460ff16155b8015612dd1575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612e24575060155f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612e3357612e3282613465565b5b5f60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612ed2575060155f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b905080612eec57612ee486868661324c565b505050613184565b600b60019054906101000a900460ff16612f32576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f90505f4290505f612f436125e5565b9050600e5f81546001019190508190555060145f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fab57505f600f54115b15612feb575f612fb96123ee565b90505f8183612fc891906140e9565b90506064818a612fd89190613fac565b612fe2919061401a565b94505050613150565b60145f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561304257505f601054115b1561312b575f60085f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f825f015411801561309e575081600101548410155b80156130ad5750815f01548911155b905080156130ed5788825f015f8282546130c79190614332565b925050819055506064838a6130dc9190613fac565b6130e6919061401a565b9450613124565b5f6130f66128e4565b90505f818561310591906140e9565b90506064818c6131159190613fac565b61311f919061401a565b965050505b505061314f565b5f81111561314e57606481886131419190613fac565b61314b919061401a565b92505b5b5b5f8311156131725761316389308561324c565b828761316f9190614332565b96505b61317d89898961324c565b5050505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361329c578060025f82825461329091906140e9565b9250508190555061336a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613325578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161331c9392919061411c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036133b1578060025f82825403925050819055506133fb565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134589190613a7a565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f601054600f5461349091906140e9565b90505f8103613581576134a28261265f565b5f4790505f81111561357a575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134f59061406d565b5f6040518083038185875af1925050503d805f811461352f576040519150601f19603f3d011682016040523d82523d5f602084013e613534565b606091505b5050905080613578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356f906143af565b60405180910390fd5b505b505061375f565b5f8183600d5f015f9054906101000a900461ffff16600c5f015f9054906101000a900461ffff166135b29190613df3565b61ffff166135c09190613fac565b6135ca919061401a565b90505f81846135d99190614332565b90505f6002826135e9919061401a565b90505f81866135f89190614332565b90505f4790506136078261265f565b5f81476136149190614332565b90505f8382866136249190613fac565b61362e919061401a565b90505f8111801561363e57505f85115b1561364e5761364d858261377b565b5b5f4790505f811115613726575f601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136a19061406d565b5f6040518083038185875af1925050503d805f81146136db576040519150601f19603f3d011682016040523d82523d5f602084013e6136e0565b606091505b5050905080613724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371b906143af565b60405180910390fd5b505b8086837ff8cfc1c15ead481ffc3a2df6126e88c84a6730799e332fcfe2dbc386373d517160405160405180910390a45050505050505050505b5f600b5f6101000a81548160ff02191690831515021790555050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f5f6137c46115d5565b426040518863ffffffff1660e01b81526004016137e6969594939291906143cd565b60606040518083038185885af1158015613802573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138279190614440565b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138578261382e565b9050919050565b6138678161384d565b82525050565b5f819050919050565b61387f8161386d565b82525050565b5f6040820190506138985f83018561385e565b6138a56020830184613876565b9392505050565b5f5ffd5b5f61ffff82169050919050565b6138c6816138b0565b81146138d0575f5ffd5b50565b5f813590506138e1816138bd565b92915050565b5f5f604083850312156138fd576138fc6138ac565b5b5f61390a858286016138d3565b925050602061391b858286016138d3565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61396782613925565b613971818561392f565b935061398181856020860161393f565b61398a8161394d565b840191505092915050565b5f6020820190508181035f8301526139ad818461395d565b905092915050565b6139be8161384d565b81146139c8575f5ffd5b50565b5f813590506139d9816139b5565b92915050565b6139e88161386d565b81146139f2575f5ffd5b50565b5f81359050613a03816139df565b92915050565b5f5f60408385031215613a1f57613a1e6138ac565b5b5f613a2c858286016139cb565b9250506020613a3d858286016139f5565b9150509250929050565b5f8115159050919050565b613a5b81613a47565b82525050565b5f602082019050613a745f830184613a52565b92915050565b5f602082019050613a8d5f830184613876565b92915050565b5f819050919050565b5f613ab6613ab1613aac8461382e565b613a93565b61382e565b9050919050565b5f613ac782613a9c565b9050919050565b5f613ad882613abd565b9050919050565b613ae881613ace565b82525050565b5f602082019050613b015f830184613adf565b92915050565b5f5f5f60608486031215613b1e57613b1d6138ac565b5b5f613b2b868287016139cb565b9350506020613b3c868287016139cb565b9250506040613b4d868287016139f5565b9150509250925092565b5f60208284031215613b6c57613b6b6138ac565b5b5f613b79848285016139cb565b91505092915050565b5f604082019050613b955f830185613876565b613ba26020830184613876565b9392505050565b613bb2816138b0565b82525050565b5f604082019050613bcb5f830185613ba9565b613bd86020830184613ba9565b9392505050565b5f60ff82169050919050565b613bf481613bdf565b82525050565b5f602082019050613c0d5f830184613beb565b92915050565b613c1c81613a47565b8114613c26575f5ffd5b50565b5f81359050613c3781613c13565b92915050565b5f5f60408385031215613c5357613c526138ac565b5b5f613c60858286016139cb565b9250506020613c7185828601613c29565b9150509250929050565b5f602082019050613c8e5f83018461385e565b92915050565b5f608082019050613ca75f830187613ba9565b613cb46020830186613ba9565b613cc16040830185613ba9565b613cce6060830184613ba9565b95945050505050565b5f60208284031215613cec57613ceb6138ac565b5b5f613cf9848285016139f5565b91505092915050565b5f5f60408385031215613d1857613d176138ac565b5b5f613d25858286016139cb565b9250506020613d36858286016139cb565b9150509250929050565b5f60a082019050613d535f830188613876565b613d606020830187613876565b613d6d6040830186613876565b613d7a6060830185613876565b613d876080830184613a52565b9695505050505050565b5f606082019050613da45f830186613876565b613db16020830185613876565b613dbe6040830184613a52565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613dfd826138b0565b9150613e08836138b0565b9250828201905061ffff811115613e2257613e21613dc6565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613e6c57607f821691505b602082108103613e7f57613e7e613e28565b5b50919050565b5f81519050919050565b5f81905092915050565b5f613ea382613e85565b613ead8185613e8f565b9350613ebd81856020860161393f565b80840191505092915050565b5f613ed48284613e99565b915081905092915050565b5f81519050613eed81613c13565b92915050565b5f60208284031215613f0857613f076138ac565b5b5f613f1584828501613edf565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a2074725f8201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b5f613f78602d8361392f565b9150613f8382613f1e565b604082019050919050565b5f6020820190508181035f830152613fa581613f6c565b9050919050565b5f613fb68261386d565b9150613fc18361386d565b9250828202613fcf8161386d565b91508282048414831517613fe657613fe5613dc6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6140248261386d565b915061402f8361386d565b92508261403f5761403e613fed565b5b828204905092915050565b50565b5f6140585f83613e8f565b91506140638261404a565b5f82019050919050565b5f6140778261404d565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6140b560138361392f565b91506140c082614081565b602082019050919050565b5f6020820190508181035f8301526140e2816140a9565b9050919050565b5f6140f38261386d565b91506140fe8361386d565b925082820190508082111561411657614115613dc6565b5b92915050565b5f60608201905061412f5f83018661385e565b61413c6020830185613876565b6141496040830184613876565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506141b9816139b5565b92915050565b5f602082840312156141d4576141d36138ac565b5b5f6141e1848285016141ab565b91505092915050565b5f819050919050565b5f61420d614208614203846141ea565b613a93565b61386d565b9050919050565b61421d816141f3565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142558161384d565b82525050565b5f614266838361424c565b60208301905092915050565b5f602082019050919050565b5f61428882614223565b614292818561422d565b935061429d8361423d565b805f5b838110156142cd5781516142b4888261425b565b97506142bf83614272565b9250506001810190506142a0565b5085935050505092915050565b5f60a0820190506142ed5f830188613876565b6142fa6020830187614214565b818103604083015261430c818661427e565b905061431b606083018561385e565b6143286080830184613876565b9695505050505050565b5f61433c8261386d565b91506143478361386d565b925082820390508181111561435f5761435e613dc6565b5b92915050565b7f4d61726b6574696e67207472616e73666572206661696c6564000000000000005f82015250565b5f61439960198361392f565b91506143a482614365565b602082019050919050565b5f6020820190508181035f8301526143c68161438d565b9050919050565b5f60c0820190506143e05f83018961385e565b6143ed6020830188613876565b6143fa6040830187614214565b6144076060830186614214565b614414608083018561385e565b61442160a0830184613876565b979650505050505050565b5f8151905061443a816139df565b92915050565b5f5f5f60608486031215614457576144566138ac565b5b5f6144648682870161442c565b93505060206144758682870161442c565b92505060406144868682870161442c565b915050925092509256fea2646970667358221220db06ff491e3596387f050b512310d24a9400c9a3a55a05c3a99eb801da20bfeb64736f6c634300081b0033
Loading...
Loading
Loading...
Loading
OVERVIEW
A computer use agent platfrom for training, launching and monetizing AI computer use agents.Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000046 | 100,902.4565 | $4.64 |
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.