MON Price: $0.01895 (+0.82%)

Contract

0xe4bbC756c874ebf9Df2E4a4600Ee735c432F878b

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KewiTokenFactory

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at monadscan.com on 2025-12-06
*/

/**

██╗░░██╗███████╗░██╗░░░░░░░██╗██╗  ██╗░░░░░░█████╗░██╗░░░██╗███╗░░██╗░█████╗░██╗░░██╗██████╗░░█████╗░██████╗░
██║░██╔╝██╔════╝░██║░░██╗░░██║██║  ██║░░░░░██╔══██╗██║░░░██║████╗░██║██╔══██╗██║░░██║██╔══██╗██╔══██╗██╔══██╗
█████═╝░█████╗░░░╚██╗████╗██╔╝██║  ██║░░░░░███████║██║░░░██║██╔██╗██║██║░░╚═╝███████║██████╔╝███████║██║░░██║
██╔═██╗░██╔══╝░░░░████╔═████║░██║  ██║░░░░░██╔══██║██║░░░██║██║╚████║██║░░██╗██╔══██║██╔═══╝░██╔══██║██║░░██║
██║░╚██╗███████╗░░╚██╔╝░╚██╔╝░██║  ███████╗██║░░██║╚██████╔╝██║░╚███║╚█████╔╝██║░░██║██║░░░░░██║░░██║██████╔╝
╚═╝░░╚═╝╚══════╝░░░╚═╝░░░╚═╝░░╚═╝  ╚══════╝╚═╝░░╚═╝░╚═════╝░╚═╝░░╚══╝░╚════╝░╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝╚═════╝░

// Website:  https://kewi.io
// Telegram: https://t.me/KewiLabs
// Twitter:  https://x.com/KewiLabs
*/

// SPDX-License-Identifier: MIT
// File: Token.sol


pragma solidity ^0.8.24;

/// @title Meme Token used by TokenFactory bonding curve + Uniswap launch
/// @notice Minimal ERC20 with controlled mint/burn by factory only and a hard maxSupply
contract Token {
    // --- ERC20 storage ---
    string public name;
    string public symbol;
    uint8 public constant decimals = 18;

    uint256 public immutable maxSupply;
    uint256 public totalSupply;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    // --- Access control ---
    address public factory;
    bool private factoryLocked; // once setFactory is called successfully, it locks

    // --- Events (ERC20 standard + extras) ---
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    event FactorySet(address indexed factory);
    event Minted(address indexed to, uint256 amount);
    event Burned(address indexed from, uint256 amount);

    // --- Modifiers ---
    modifier onlyFactory() {
        require(msg.sender == factory, "Not factory");
        _;
    }

    // --- Constructor ---
    /// @param _name ERC20 name
    /// @param _symbol ERC20 symbol
    /// @param _maxSupply Maximum supply in raw units (18 decimals)
    /// @param _initialLpSupply Amount to mint immediately to the factory (LP tokens)
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _maxSupply,
        uint256 _initialLpSupply
    ) {
        require(_maxSupply > 0, "maxSupply zero");
        require(_initialLpSupply <= _maxSupply, "init > max");

        name = _name;
        symbol = _symbol;
        maxSupply = _maxSupply;

        // Mint initial LP supply to deployer (TokenFactory)
        _mint(msg.sender, _initialLpSupply);
    }

    // ======================================================
    //                  ERC20 PUBLIC VIEW
    // ======================================================

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    // ======================================================
    //                  ERC20 MUTATING
    // ======================================================

    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        uint256 currentAllowance = _allowances[from][msg.sender];
        require(currentAllowance >= amount, "ERC20: insufficient allowance");

        unchecked {
            _approve(from, msg.sender, currentAllowance - amount);
        }

        _transfer(from, to, amount);
        return true;
    }

    // ======================================================
    //          FACTORY MANAGEMENT + BONDING CURVE API
    // ======================================================

    /// @notice One-time link between this token and its TokenFactory.
    function setFactory(address _factory) external {
        require(!factoryLocked, "Factory already set");
        require(_factory != address(0), "Zero factory");

        factory = _factory;
        factoryLocked = true;

        emit FactorySet(_factory);
    }

    /// @notice Mint new tokens to `to`.
    /// @dev Only callable by the bonded curve / TokenFactory.
    function mint(uint256 amount, address to) external onlyFactory {
        _mint(to, amount);
        emit Minted(to, amount);
    }

    /// @notice Burn tokens from `from`.
    /// @dev Only callable by the TokenFactory on user sell.
    function burn(uint256 amount, address from) external onlyFactory {
        _burn(from, amount);
        emit Burned(from, amount);
    }

    // ======================================================
    //                  INTERNAL CORE LOGIC
    // ======================================================

    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0), "ERC20: transfer from zero");
        require(to != address(0), "ERC20: transfer to zero");

        uint256 fromBal = _balances[from];
        require(fromBal >= amount, "ERC20: transfer > balance");

        unchecked {
            _balances[from] = fromBal - amount;
        }

        _balances[to] += amount;

        emit Transfer(from, to, amount);
    }

    function _mint(address to, uint256 amount) internal {
        require(to != address(0), "ERC20: mint to zero");
        require(totalSupply + amount <= maxSupply, "max supply exceeded");

        totalSupply += amount;
        _balances[to] += amount;

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

    function _burn(address from, uint256 amount) internal {
        require(from != address(0), "ERC20: burn from zero");

        uint256 fromBal = _balances[from];
        require(fromBal >= amount, "ERC20: burn > balance");

        unchecked {
            _balances[from] = fromBal - amount;
        }

        totalSupply -= amount;

        emit Transfer(from, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from zero");
        require(spender != address(0), "ERC20: approve to zero");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}


//https://chatgpt.com/c/691efff4-198c-8322-9edd-e38c0628d8c3
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

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

// File: BondingCurve.sol


pragma solidity ^0.8.24;





/// @title Meme Token Factory with Exponential Bonding Curve + Uniswap Launch
/// @notice Production-style version with 1% trading fee, listing fee, and safety hardening.
/// @dev IMPORTANT: For production, REMOVE withdrawFees() and only use withdrawProtocolFees().
contract KewiTokenFactory {
    // --- Events ---
    event MemeTokenCreated(
        address indexed tokenAddress,
        address indexed creator,
        uint256 timestamp
    );

    event TokenBought(
        address indexed tokenAddress,
        address indexed buyer,
        uint256 tokenQty,
        uint256 totalPaid, // includes fee
        uint256 timestamp
    );

    event TokenSold(
        address indexed tokenAddress,
        address indexed seller,
        uint256 tokenQty,
        uint256 netRefund, // after fee
        uint256 timestamp
    );

    event TokenLaunched(
        address indexed tokenAddress,
        uint256 ethForLP,
        uint256 listingFeeTaken,
        uint256 timestamp
    );

    event ListingFeeUpdated(uint256 newListingFee);

    // --- Structs ---
    struct MemeToken {
        string name;
        string symbol;
        string description;
        string tokenImageUrl;
        uint256 fundingRaised; // ETH reserved for LP (net of trading fees)
        address tokenAddress;
        address creatorAddress;
        bool isLaunched;
    }

    // --- State ---
    address public immutable owner;
    address public immutable uniswapFactory;
    address public immutable uniswapRouter;

    address[] public memeTokenAddresses;
    mapping(address => MemeToken) public addressToMemeToken;
    mapping(address => uint256) public curveSupply; // raw units sold via curve (1e18-based)

    // --- Fees ---
    uint256 public constant MEMETOKEN_CREATION_FEE = 100 ether;
    uint256 public constant FEE_BPS = 100; // 1% in basis points
    uint256 public constant BPS_DENOMINATOR = 10_000;

    /// @notice Listing fee charged at launch, taken from fundingRaised and added to protocolFeeBalance.
    uint256 public listingFee;

    /// @notice All protocol fees accumulated (creation + trading + listing) withdrawable by owner.
    uint256 public protocolFeeBalance;

    // --- Tokenomics Constants ---
    uint256 public constant DECIMALS = 10 ** 18;
    uint256 public constant MAX_SUPPLY = 1_000_000 * DECIMALS;
    uint256 public constant INIT_SUPPLY = (MAX_SUPPLY * 20) / 100; // 20% for LP, minted at token creation

    // Bonding curve parameters (must be calibrated off-chain for your target market cap)
    // uint256 public constant INITIAL_PRICE = 30_000 * 10 ** 9;
    // uint256 public constant K = 8 * 10 ** 15; // curvature (Q18). LOWER THIS IN PRODUCTION.
    // Bonding curve parameters (calibrated off-chain)
    uint256 public constant INITIAL_PRICE = 991_370_064; // wei per token at s = 0  (~9.9137e-10 ETH)
    uint256 public constant K = 4_900_862_993_591; // curvature, Q18-scaled

    /// @notice ETH goal at which token graduates to Uniswap.
    uint256 public constant MEMECOIN_FUNDING_GOAL = 0.01 ether;

    // --- Reentrancy Guard ---
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    // Uniswap Sepolia
    // address public constant UNISWAP_FACTORY = 0xF62c03E08ada871A0bEb309762E260a7a6a880E6;
    // address public constant UNISWAP_ROUTER  = 0xeE567Fe1712Faf6149d80dA1E6934E354124CfE3;
    // --- Constructor ---
    constructor(
        address _uniswapFactory,
        address _uniswapRouter,
        uint256 _listingFee
    ) {
        require(_uniswapFactory != address(0), "zero factory");
        require(_uniswapRouter != address(0), "zero router");
        owner = msg.sender;
        uniswapFactory = _uniswapFactory;
        uniswapRouter = _uniswapRouter;
        listingFee = _listingFee;
        _status = _NOT_ENTERED;
    }

    // --- Admin configuration ---
    function setListingFee(uint256 _listingFee) external onlyOwner {
        listingFee = _listingFee;
        emit ListingFeeUpdated(_listingFee);
    }

    // --- Token Creation ---
    function createMemeToken(
        string memory name,
        string memory symbol,
        string memory imageUrl,
        string memory description
    ) external payable nonReentrant returns (address) {
        require(msg.value >= MEMETOKEN_CREATION_FEE, "Creation fee required");

        // Creation fee is part of protocol fees
        protocolFeeBalance += msg.value;

        // Mint 20% LP supply to this factory; remaining 80% will be minted via bonding curve
        Token token = new Token(name, symbol, MAX_SUPPLY, INIT_SUPPLY);
        token.setFactory(address(this));
        address tokenAddr = address(token);

        memeTokenAddresses.push(tokenAddr);
        addressToMemeToken[tokenAddr] = MemeToken({
            name: name,
            symbol: symbol,
            description: description,
            tokenImageUrl: imageUrl,
            fundingRaised: 0,
            tokenAddress: tokenAddr,
            creatorAddress: msg.sender,
            isLaunched: false
        });

        emit MemeTokenCreated(tokenAddr, msg.sender, block.timestamp);
        return tokenAddr;
    }

    function getAllMemeTokens() external view returns (MemeToken[] memory) {
        uint256 len = memeTokenAddresses.length;
        MemeToken[] memory list = new MemeToken[](len);
        for (uint256 i = 0; i < len; i++) {
            list[i] = addressToMemeToken[memeTokenAddresses[i]];
        }
        return list;
    }

    // --- Bonding Curve Math ---
    function calculateCost(
        uint256 currentRaw,
        uint256 amountRaw
    ) public pure returns (uint256) {
        uint256 exponent1 = (K * (currentRaw + amountRaw)) / DECIMALS;
        uint256 exponent0 = (K * currentRaw) / DECIMALS;
        uint256 exp1 = exp(exponent1);
        uint256 exp0 = exp(exponent0);
        return (INITIAL_PRICE * (exp1 - exp0)) / K;
    }

    /// @notice Given `ethAmount` (total, including 1% fee) returns max whole tokens you can buy on the curve.
    /// @dev Uses binary search and never reverts even if calculateCost would overflow for too-large mid.
    function calculateTokenAmountFromEth(
        address tokenAddr,
        uint256 ethAmount
    ) external view returns (uint256) {
        MemeToken storage mt = addressToMemeToken[tokenAddr];
        require(
            mt.tokenAddress == tokenAddr && tokenAddr != address(0),
            "Unknown token"
        );
        require(!mt.isLaunched, "Already launched");

        uint256 currentRaw = curveSupply[tokenAddr];
        uint256 availRaw = MAX_SUPPLY - INIT_SUPPLY - currentRaw;
        uint256 maxTokens = availRaw / DECIMALS;

        if (maxTokens == 0 || ethAmount == 0) {
            return 0;
        }

        // Only (1 - fee%) of ethAmount actually goes to the curve
        uint256 effectiveEth = (ethAmount * (BPS_DENOMINATOR - FEE_BPS)) /
            BPS_DENOMINATOR;

        uint256 low = 0;
        uint256 high = maxTokens;

        while (low < high) {
            uint256 mid = (low + high + 1) / 2;
            uint256 amountRaw = mid * DECIMALS;

            (bool ok, bytes memory data) = address(this).staticcall(
                abi.encodeWithSelector(
                    this.calculateCost.selector,
                    currentRaw,
                    amountRaw
                )
            );

            if (ok) {
                uint256 cost = abi.decode(data, (uint256));
                if (cost <= effectiveEth) {
                    low = mid;
                    continue;
                }
            }
            high = mid - 1;
        }

        return low;
    }

    function calculateRefund(
        uint256 currentRaw,
        uint256 amountRaw
    ) public pure returns (uint256) {
        uint256 exponent1 = (K * currentRaw) / DECIMALS;
        uint256 exponent0 = (K * (currentRaw - amountRaw)) / DECIMALS;
        uint256 exp1 = exp(exponent1);
        uint256 exp0 = exp(exponent0);
        return (INITIAL_PRICE * (exp1 - exp0)) / K;
    }

    /// @dev Fixed-point exp with Q18 scaling: x is exponent * 1e18, result is e^(x/1e18) * 1e18.
    ///      MUST choose K and supply bounds so this does not overflow in practice.
    function exp(uint256 x) internal pure returns (uint256) {
        uint256 sum = DECIMALS; // 1.0
        uint256 term = DECIMALS;
        for (uint256 i = 1; i <= 20; i++) {
            term = (term * x) / (uint256(i) * DECIMALS);
            sum += term;
            if (term < 1) break;
        }
        return sum;
    }

    // --- Pre-launch Buy & Sell ---

    /// @notice Buy `tokenQty` whole tokens from the bonding curve for `tokenAddr`.
    /// @dev msg.value must equal curve cost + 1% fee. Reverts if token already launched.
    function buyMemeToken(
        address tokenAddr,
        uint256 tokenQty
    ) external payable nonReentrant returns (uint256) {
        MemeToken storage mt = addressToMemeToken[tokenAddr];
        require(
            mt.tokenAddress == tokenAddr && tokenAddr != address(0),
            "Unknown token"
        );
        require(!mt.isLaunched, "Launched: use Uniswap");

        Token token = Token(tokenAddr);
        uint256 qtyRaw = tokenQty * DECIMALS;

        uint256 currentRaw = curveSupply[tokenAddr];
        uint256 available = MAX_SUPPLY - INIT_SUPPLY - currentRaw;
        require(qtyRaw <= available, "Insufficient supply");

        uint256 curveCost = calculateCost(currentRaw, qtyRaw);
        uint256 fee = (curveCost * FEE_BPS) / BPS_DENOMINATOR;
        uint256 total = curveCost + fee;

        require(msg.value == total, "Incorrect ETH amount");

        protocolFeeBalance += fee;
        mt.fundingRaised += curveCost;
        curveSupply[tokenAddr] = currentRaw + qtyRaw;

        token.mint(qtyRaw, msg.sender);

        emit TokenBought(
            tokenAddr,
            msg.sender,
            tokenQty,
            total,
            block.timestamp
        );

        // Graduation condition (based on ETH earmarked for LP, not counting fees)
        if (!mt.isLaunched && mt.fundingRaised >= MEMECOIN_FUNDING_GOAL) {
            uint256 lpEth = mt.fundingRaised;
            uint256 takenListingFee = 0;

            if (listingFee > 0 && lpEth > listingFee) {
                lpEth -= listingFee;
                protocolFeeBalance += listingFee;
                takenListingFee = listingFee;
            }

            mt.isLaunched = true;
            mt.fundingRaised = 0;

            _launchOnUniswap(tokenAddr, lpEth);

            emit TokenLaunched(
                tokenAddr,
                lpEth,
                takenListingFee,
                block.timestamp
            );
        }

        return total;
    }

    /// @notice Sell `tokenQty` whole tokens back to the bonding curve.
    /// @dev Returns NET ETH refunded (after 1% fee). Reverts if already launched.
    function sellMemeToken(
        address tokenAddr,
        uint256 tokenQty
    ) external nonReentrant returns (uint256) {
        MemeToken storage mt = addressToMemeToken[tokenAddr];
        require(
            mt.tokenAddress == tokenAddr && tokenAddr != address(0),
            "Unknown token"
        );
        require(!mt.isLaunched, "Launched: use Uniswap");

        Token token = Token(tokenAddr);
        uint256 qtyRaw = tokenQty * DECIMALS;

        uint256 currentRaw = curveSupply[tokenAddr];

        require(token.balanceOf(msg.sender) >= qtyRaw, "Insufficient balance");
        require(currentRaw >= qtyRaw, "Curve supply too low");

        uint256 refund = calculateRefund(currentRaw, qtyRaw);
        require(mt.fundingRaised >= refund, "Insufficient curve ETH");

        uint256 fee = (refund * FEE_BPS) / BPS_DENOMINATOR;
        uint256 netRefund = refund - fee;

        protocolFeeBalance += fee;
        mt.fundingRaised -= refund;
        curveSupply[tokenAddr] = currentRaw - qtyRaw;

        token.burn(qtyRaw, msg.sender);

        (bool success, ) = msg.sender.call{value: netRefund}("");
        require(success, "ETH transfer failed");

        emit TokenSold(
            tokenAddr,
            msg.sender,
            tokenQty,
            netRefund,
            block.timestamp
        );
        return netRefund;
    }

    // --- Uniswap Launch Helpers ---
    function _launchOnUniswap(address tokenAddr, uint256 ethAmount) internal {
        require(ethAmount > 0, "No ETH for LP");

        IUniswapV2Factory factory = IUniswapV2Factory(uniswapFactory);
        IUniswapV2Router01 router = IUniswapV2Router01(uniswapRouter);

        address weth = router.WETH();
        address pair = factory.getPair(tokenAddr, weth);
        if (pair == address(0)) {
            pair = factory.createPair(tokenAddr, weth);
        }

        // Ensure we actually have INIT_SUPPLY tokens available for LP
        require(
            Token(tokenAddr).balanceOf(address(this)) >= INIT_SUPPLY,
            "Insufficient LP tokens"
        );

        Token(tokenAddr).approve(address(router), INIT_SUPPLY);

        (, , uint256 liquidity) = router.addLiquidityETH{value: ethAmount}(
            tokenAddr,
            INIT_SUPPLY,
            INIT_SUPPLY, // min tokens
            ethAmount, // min ETH
            address(this),
            block.timestamp
        );

        require(liquidity > 0, "No liquidity minted");

        // Burn LP to lock liquidity
        IUniswapV2Pair(pair).transfer(address(0), liquidity);
    }

    // --- Admin helpers ---

    /// @notice Withdraw only accumulated protocol fees (creation, trading, listing).
    function withdrawProtocolFees(
        address payable to
    ) external onlyOwner nonReentrant {
        require(to != address(0), "zero");
        uint256 amount = protocolFeeBalance;
        require(amount > 0, "no fees");
        protocolFeeBalance = 0;

        (bool success, ) = to.call{value: amount}("");
        require(success, "ETH transfer failed");
    }

    /// @notice TESTING ONLY: withdraw ALL ETH from the contract (including LP ETH).
    /// @dev DO NOT SHIP THIS IN PRODUCTION.
    function withdrawFees(address payable to) external onlyOwner nonReentrant {
        require(to != address(0), "zero");
        uint256 bal = address(this).balance;
        require(bal > 0, "no balance");

        (bool success, ) = to.call{value: bal}("");
        require(success, "ETH transfer failed");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_uniswapFactory","type":"address"},{"internalType":"address","name":"_uniswapRouter","type":"address"},{"internalType":"uint256","name":"_listingFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newListingFee","type":"uint256"}],"name":"ListingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MemeTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenQty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethForLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"listingFeeTaken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenLaunched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenQty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"netRefund","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenSold","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INIT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"K","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEMECOIN_FUNDING_GOAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEMETOKEN_CREATION_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMemeToken","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"tokenImageUrl","type":"string"},{"internalType":"uint256","name":"fundingRaised","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"creatorAddress","type":"address"},{"internalType":"bool","name":"isLaunched","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"tokenQty","type":"uint256"}],"name":"buyMemeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentRaw","type":"uint256"},{"internalType":"uint256","name":"amountRaw","type":"uint256"}],"name":"calculateCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentRaw","type":"uint256"},{"internalType":"uint256","name":"amountRaw","type":"uint256"}],"name":"calculateRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"calculateTokenAmountFromEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"string","name":"description","type":"string"}],"name":"createMemeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"curveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllMemeTokens","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"tokenImageUrl","type":"string"},{"internalType":"uint256","name":"fundingRaised","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"creatorAddress","type":"address"},{"internalType":"bool","name":"isLaunched","type":"bool"}],"internalType":"struct KewiTokenFactory.MemeToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"memeTokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"tokenQty","type":"uint256"}],"name":"sellMemeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_listingFee","type":"uint256"}],"name":"setListingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawProtocolFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405234801562000010575f80fd5b5060405162003f7738038062003f77833981016040819052620000339162000105565b6001600160a01b0383166200007e5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f20666163746f727960a01b60448201526064015b60405180910390fd5b6001600160a01b038216620000c45760405162461bcd60e51b815260206004820152600b60248201526a3d32b937903937baba32b960a91b604482015260640162000075565b336080526001600160a01b0392831660a052911660c052600355600160055562000143565b80516001600160a01b038116811462000100575f80fd5b919050565b5f805f6060848603121562000118575f80fd5b6200012384620000e9565b92506200013360208501620000e9565b9150604084015190509250925092565b60805160a05160c051613de6620001915f395f81816103340152611fb501525f81816103820152611f9101525f81816103b70152818161089f0152818161094d0152610ae40152613de65ff3fe608060405260043610620001b7575f3560e01c80638da5cb5b11620000fa578063d65f284e1162000092578063e1a45218116200006a578063e1a452181462000503578063e38abd0f146200051a578063e823bfd5146200053e578063fb08d6c01462000555575f80fd5b8063d65f284e14620004a5578063d9972d5314620004c3578063dd5988cd14620004df575f80fd5b8063a932492f11620000d2578063a932492f146200042a578063bcfeed9a1462000445578063bf333f2c146200046b578063ce3946961462000481575f80fd5b80638da5cb5b14620003a4578063956cc85914620003d9578063977ccd5b14620003f0575f80fd5b80632d80caa5116200016e5780636a1b7ecc11620001465780636a1b7ecc146200030a578063735de9f714620003215780637c5e279514620003565780638bdb2afa146200036f575f80fd5b80632d80caa514620002b25780632e0f262514620002d657806332cb6b0c14620002f3575f80fd5b8063075bb17d14620001bb5780630a22d68c14620001ef578063131dbd09146200021557806313cb5ad6146200023b578063164e68de146200025f5780631eecf7881462000283575b5f80fd5b620001d2620001cc3660046200254a565b62000579565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001fb575f80fd5b506200020660045481565b604051908152602001620001e6565b34801562000221575f80fd5b506200023962000233366004620025fd565b62000894565b005b34801562000247575f80fd5b50620001d262000259366004620025fd565b6200091a565b3480156200026b575f80fd5b50620002396200027d3660046200262d565b62000942565b3480156200028f575f80fd5b5062000206620002a13660046200262d565b60026020525f908152604090205481565b348015620002be575f80fd5b5062000239620002d03660046200262d565b62000ad9565b348015620002e2575f80fd5b5062000206670de0b6b3a764000081565b348015620002ff575f80fd5b506200020662000be7565b34801562000316575f80fd5b506200020660035481565b3480156200032d575f80fd5b50620001d27f000000000000000000000000000000000000000000000000000000000000000081565b34801562000362575f80fd5b5062000206633b171b5081565b3480156200037b575f80fd5b50620001d27f000000000000000000000000000000000000000000000000000000000000000081565b348015620003b0575f80fd5b50620001d27f000000000000000000000000000000000000000000000000000000000000000081565b348015620003e5575f80fd5b506200020662000c01565b348015620003fc575f80fd5b50620004146200040e3660046200262d565b62000c33565b604051620001e6989796959493929190620026a3565b34801562000436575f80fd5b50620002066504751232a4b781565b34801562000451575f80fd5b506200045c62000ebe565b604051620001e691906200272e565b34801562000477575f80fd5b5062000206606481565b3480156200048d575f80fd5b50620002066200049f3660046200283a565b62001292565b348015620004b1575f80fd5b506200020668056bc75e2d6310000081565b348015620004cf575f80fd5b5062000206662386f26fc1000081565b348015620004eb575f80fd5b5062000206620004fd3660046200285b565b6200134b565b3480156200050f575f80fd5b506200020661271081565b34801562000526575f80fd5b5062000206620005383660046200283a565b62001777565b620002066200054f3660046200285b565b620017ca565b34801562000561575f80fd5b5062000206620005733660046200285b565b62001c0a565b5f600260055403620005a85760405162461bcd60e51b81526004016200059f9062002888565b60405180910390fd5b600260055568056bc75e2d63100000341015620006005760405162461bcd60e51b815260206004820152601560248201527410dc99585d1a5bdb88199959481c995c5d5a5c9959605a1b60448201526064016200059f565b3460045f828254620006139190620028d3565b909155505f9050858562000633670de0b6b3a7640000620f4240620028e9565b60646200064c670de0b6b3a7640000620f4240620028e9565b62000659906014620028e9565b62000665919062002903565b604051620006739062002497565b62000682949392919062002923565b604051809103905ff0801580156200069c573d5f803e3d5ffd5b50604051630b768f0160e31b81523060048201529091506001600160a01b03821690635bb47808906024015f604051808303815f87803b158015620006df575f80fd5b505af1158015620006f2573d5f803e3d5ffd5b50505f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b03871690811790915560408051610100810182528c815260208082018d90528183018b9052606082018c90526080820186905260a082018490523360c083015260e082018690529285529290915290912081518594509192509081906200079d9082620029e9565b5060208201516001820190620007b49082620029e9565b5060408201516002820190620007cb9082620029e9565b5060608201516003820190620007e29082620029e9565b506080820151600482015560a08201516005820180546001600160a01b039283166001600160a01b031990911617905560c08301516006909201805460e0909401511515600160a01b026001600160a81b03199094169282169290921792909217905560405133918316907f096627c8a73b9cd80e060634e86d64ccb00710637ab5b294c82d1ce416a23c8d906200087d9042815260200190565b60405180910390a360016005559695505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614620008df5760405162461bcd60e51b81526004016200059f9062002ab6565b60038190556040518181527f5fb4654f1efe30c6141eaa6855ffcb27e0b361d899b05e21b1a4d0b3e71e14db9060200160405180910390a150565b5f818154811062000929575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146200098d5760405162461bcd60e51b81526004016200059f9062002ab6565b600260055403620009b25760405162461bcd60e51b81526004016200059f9062002888565b60026005556001600160a01b038116620009f85760405162461bcd60e51b81526004016200059f906020808252600490820152637a65726f60e01b604082015260600190565b478062000a355760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b60448201526064016200059f565b5f826001600160a01b0316826040515b5f6040518083038185875af1925050503d805f811462000a81576040519150601f19603f3d011682016040523d82523d5f602084013e62000a86565b606091505b505090508062000acf5760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016200059f565b5050600160055550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161462000b245760405162461bcd60e51b81526004016200059f9062002ab6565b60026005540362000b495760405162461bcd60e51b81526004016200059f9062002888565b60026005556001600160a01b03811662000b8f5760405162461bcd60e51b81526004016200059f906020808252600490820152637a65726f60e01b604082015260600190565b6004548062000bcb5760405162461bcd60e51b81526020600482015260076024820152666e6f206665657360c81b60448201526064016200059f565b5f6004819055505f826001600160a01b03168260405162000a45565b62000bfe670de0b6b3a7640000620f4240620028e9565b81565b606462000c1a670de0b6b3a7640000620f4240620028e9565b62000c27906014620028e9565b62000bfe919062002903565b60016020525f908152604090208054819062000c4f906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000c7d906200295f565b801562000ccc5780601f1062000ca25761010080835404028352916020019162000ccc565b820191905f5260205f20905b81548152906001019060200180831162000cae57829003601f168201915b50505050509080600101805462000ce3906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000d11906200295f565b801562000d605780601f1062000d365761010080835404028352916020019162000d60565b820191905f5260205f20905b81548152906001019060200180831162000d4257829003601f168201915b50505050509080600201805462000d77906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000da5906200295f565b801562000df45780601f1062000dca5761010080835404028352916020019162000df4565b820191905f5260205f20905b81548152906001019060200180831162000dd657829003601f168201915b50505050509080600301805462000e0b906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000e39906200295f565b801562000e885780601f1062000e5e5761010080835404028352916020019162000e88565b820191905f5260205f20905b81548152906001019060200180831162000e6a57829003601f168201915b5050505060048301546005840154600690940154929390926001600160a01b03918216925090811690600160a01b900460ff1688565b5f80546060918167ffffffffffffffff81111562000ee05762000ee0620024a5565b60405190808252806020026020018201604052801562000f6c57816020015b62000f58604051806101000160405280606081526020016060815260200160608152602001606081526020015f81526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f151581525090565b81526020019060019003908162000eff5790505b5090505f5b828110156200128b5760015f80838154811062000f925762000f9262002ad9565b5f9182526020808320909101546001600160a01b0316835282019290925260409081019091208151610100810190925280548290829062000fd3906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001001906200295f565b8015620010505780601f10620010265761010080835404028352916020019162001050565b820191905f5260205f20905b8154815290600101906020018083116200103257829003601f168201915b505050505081526020016001820180546200106b906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001099906200295f565b8015620010e85780601f10620010be57610100808354040283529160200191620010e8565b820191905f5260205f20905b815481529060010190602001808311620010ca57829003601f168201915b5050505050815260200160028201805462001103906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001131906200295f565b8015620011805780601f10620011565761010080835404028352916020019162001180565b820191905f5260205f20905b8154815290600101906020018083116200116257829003601f168201915b505050505081526020016003820180546200119b906200295f565b80601f0160208091040260200160405190810160405280929190818152602001828054620011c9906200295f565b8015620012185780601f10620011ee5761010080835404028352916020019162001218565b820191905f5260205f20905b815481529060010190602001808311620011fa57829003601f168201915b50505091835250506004820154602082015260058201546001600160a01b0390811660408301526006909201549182166060820152600160a01b90910460ff161515608090910152825183908390811062001277576200127762002ad9565b602090810291909101015260010162000f71565b5092915050565b5f80670de0b6b3a7640000620012a98486620028d3565b620012bb906504751232a4b7620028e9565b620012c7919062002903565b90505f670de0b6b3a7640000620012e5866504751232a4b7620028e9565b620012f1919062002903565b90505f620012ff8362001ed3565b90505f6200130d8362001ed3565b90506504751232a4b762001322828462002aed565b6200133290633b171b50620028e9565b6200133e919062002903565b9450505050505b92915050565b5f600260055403620013715760405162461bcd60e51b81526004016200059f9062002888565b600260059081556001600160a01b038085165f81815260016020526040902092830154909116148015620013ad57506001600160a01b03841615155b620013cc5760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff1615620014225760405162461bcd60e51b815260206004820152601560248201527404c61756e636865643a2075736520556e697377617605c1b60448201526064016200059f565b835f62001438670de0b6b3a764000086620028e9565b6001600160a01b038781165f90815260026020526040908190205490516370a0823160e01b81523360048201529293509183918516906370a0823190602401602060405180830381865afa15801562001493573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620014b9919062002b2a565b1015620015005760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016200059f565b81811015620015495760405162461bcd60e51b8152602060048201526014602482015273437572766520737570706c7920746f6f206c6f7760601b60448201526064016200059f565b5f62001556828462001777565b90508085600401541015620015a75760405162461bcd60e51b8152602060048201526016602482015275092dce6eaccccd2c6d2cadce840c6eae4ecca408aa8960531b60448201526064016200059f565b5f612710620015b8606484620028e9565b620015c4919062002903565b90505f620015d3828462002aed565b90508160045f828254620015e89190620028d3565b9250508190555082876004015f82825462001604919062002aed565b90915550620016169050858562002aed565b6001600160a01b038b81165f9081526002602052604090819020929092559051633f34d4cf60e21b8152600481018790523360248201529087169063fcd3533c906044015f604051808303815f87803b15801562001672575f80fd5b505af115801562001685573d5f803e3d5ffd5b50506040515f925033915083908381818185875af1925050503d805f8114620016ca576040519150601f19603f3d011682016040523d82523d5f602084013e620016cf565b606091505b5050905080620017185760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016200059f565b604080518b8152602081018490524281830152905133916001600160a01b038e16917f9387a595ac4be9038bbb9751abad8baa3dcf219dd9e19abb81552bd521fe35469181900360600190a35060016005559998505050505050505050565b5f80670de0b6b3a764000062001794856504751232a4b7620028e9565b620017a0919062002903565b90505f670de0b6b3a7640000620017b8858762002aed565b620012e5906504751232a4b7620028e9565b5f600260055403620017f05760405162461bcd60e51b81526004016200059f9062002888565b600260059081556001600160a01b038085165f818152600160205260409020928301549091161480156200182c57506001600160a01b03841615155b6200184b5760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff1615620018a15760405162461bcd60e51b815260206004820152601560248201527404c61756e636865643a2075736520556e697377617605c1b60448201526064016200059f565b835f620018b7670de0b6b3a764000086620028e9565b6001600160a01b0387165f90815260026020526040812054919250816064620018ec670de0b6b3a7640000620f4240620028e9565b620018f9906014620028e9565b62001905919062002903565b6200191c670de0b6b3a7640000620f4240620028e9565b62001928919062002aed565b62001934919062002aed565b9050808311156200197e5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e7420737570706c7960681b60448201526064016200059f565b5f6200198b838562001292565b90505f6127106200199e606484620028e9565b620019aa919062002903565b90505f620019b98284620028d3565b905080341462001a035760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b60448201526064016200059f565b8160045f82825462001a169190620028d3565b9250508190555082886004015f82825462001a329190620028d3565b9091555062001a4490508686620028d3565b6001600160a01b038c81165f90815260026020526040908190209290925590516394bf804d60e01b815260048101889052336024820152908816906394bf804d906044015f604051808303815f87803b15801562001aa0575f80fd5b505af115801562001ab3573d5f803e3d5ffd5b5050604080518d815260208101859052428183015290513393506001600160a01b038f1692507f8692cf5ba66abd64f88cdc1ffa0ee9d9c21ee2d999322a20445ae32393394e3e9181900360600190a36006880154600160a01b900460ff1615801562001b2b5750662386f26fc10000886004015410155b1562001bf75760048801546003545f901580159062001b4b575060035482115b1562001b825760035462001b60908362002aed565b915060035460045f82825462001b779190620028d3565b909155505060035490505b60068a01805460ff60a01b1916600160a01b1790555f60048b015562001ba98d8362001f4d565b6040805183815260208101839052428183015290516001600160a01b038f16917fc5f40890b27f261001f50fb37aefc207cb219df4346046729dd64b33f6be95cf919081900360600190a250505b60016005559a9950505050505050505050565b6001600160a01b038083165f818152600160205260408120600581015491939092911614801562001c4357506001600160a01b03841615155b62001c625760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff161562001cb35760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b60448201526064016200059f565b6001600160a01b0384165f908152600260205260408120549081606462001ce6670de0b6b3a7640000620f4240620028e9565b62001cf3906014620028e9565b62001cff919062002903565b62001d16670de0b6b3a7640000620f4240620028e9565b62001d22919062002aed565b62001d2e919062002aed565b90505f62001d45670de0b6b3a76400008362002903565b905080158062001d53575085155b1562001d66575f94505050505062001345565b5f61271062001d7760648262002aed565b62001d839089620028e9565b62001d8f919062002903565b90505f825b8082101562001ec6575f600262001dac8385620028d3565b62001db9906001620028d3565b62001dc5919062002903565b90505f62001ddc670de0b6b3a764000083620028e9565b60408051602481018b9052604480820184905282518083039091018152606490910182526020810180516001600160e01b031663671ca34b60e11b17905290519192505f918291309162001e31919062002b42565b5f60405180830381855afa9150503d805f811462001e6b576040519150601f19603f3d011682016040523d82523d5f602084013e62001e70565b606091505b5091509150811562001ead575f8180602001905181019062001e93919062002b2a565b905087811162001eab57849650505050505062001d94565b505b62001eba60018562002aed565b94505050505062001d94565b5098975050505050505050565b5f670de0b6b3a76400008060015b6014811162001f445762001efe670de0b6b3a764000082620028e9565b62001f0a8684620028e9565b62001f16919062002903565b915062001f248284620028d3565b92506001821062001f44578062001f3b8162002b5f565b91505062001ee1565b50909392505050565b5f811162001f8e5760405162461bcd60e51b815260206004820152600d60248201526c04e6f2045544820666f72204c5609c1b60448201526064016200059f565b5f7f000000000000000000000000000000000000000000000000000000000000000090505f7f000000000000000000000000000000000000000000000000000000000000000090505f816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002014573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200203a919062002b7a565b60405163e6a4390560e01b81526001600160a01b03878116600483015280831660248301529192505f9185169063e6a4390590604401602060405180830381865afa1580156200208c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620020b2919062002b7a565b90506001600160a01b0381166200213a576040516364e329cb60e11b81526001600160a01b038781166004830152838116602483015285169063c9c65396906044016020604051808303815f875af115801562002111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002137919062002b7a565b90505b606462002153670de0b6b3a7640000620f4240620028e9565b62002160906014620028e9565b6200216c919062002903565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015620021af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620021d5919062002b2a565b10156200221e5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e74204c5020746f6b656e7360501b60448201526064016200059f565b6001600160a01b03861663095ea7b384606462002247670de0b6b3a7640000620f4240620028e9565b62002254906014620028e9565b62002260919062002903565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015620022a9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620022cf919062002b98565b505f6001600160a01b03841663f305d71987896064620022fb670de0b6b3a7640000620f4240620028e9565b62002308906014620028e9565b62002314919062002903565b60646200232d670de0b6b3a7640000620f4240620028e9565b6200233a906014620028e9565b62002346919062002903565b6040516001600160e01b031960e087901b1681526001600160a01b03909316600484015260248301919091526044820152606481018a90523060848201524260a482015260c40160606040518083038185885af1158015620023aa573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190620023d1919062002bb9565b925050505f81116200241c5760405162461bcd60e51b8152602060048201526013602482015272139bc81b1a5c5d5a591a5d1e481b5a5b9d1959606a1b60448201526064016200059f565b60405163a9059cbb60e01b81525f6004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af115801562002467573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200248d919062002b98565b5050505050505050565b6111cb8062002be683390190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620024c9575f80fd5b813567ffffffffffffffff80821115620024e757620024e7620024a5565b604051601f8301601f19908116603f01168101908282118183101715620025125762002512620024a5565b816040528381528660208588010111156200252b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f80608085870312156200255e575f80fd5b843567ffffffffffffffff8082111562002576575f80fd5b6200258488838901620024b9565b955060208701359150808211156200259a575f80fd5b620025a888838901620024b9565b94506040870135915080821115620025be575f80fd5b620025cc88838901620024b9565b93506060870135915080821115620025e2575f80fd5b50620025f187828801620024b9565b91505092959194509250565b5f602082840312156200260e575f80fd5b5035919050565b6001600160a01b03811681146200262a575f80fd5b50565b5f602082840312156200263e575f80fd5b81356200264b8162002615565b9392505050565b5f5b838110156200266e57818101518382015260200162002654565b50505f910152565b5f81518084526200268f81602086016020860162002652565b601f01601f19169290920160200192915050565b5f610100808352620026b88184018c62002676565b90508281036020840152620026ce818b62002676565b90508281036040840152620026e4818a62002676565b90508281036060840152620026fa818962002676565b608084019790975250506001600160a01b0393841660a08201529190921660c082015290151560e090910152949350505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200282c57603f19898403018552815161010081518186526200277f8287018262002676565b915050888201518582038a87015262002799828262002676565b9150508782015185820389870152620027b3828262002676565b91505060608083015186830382880152620027cf838262002676565b92505050608080830151818701525060a080830151620027f9828801826001600160a01b03169052565b505060c0828101516001600160a01b03169086015260e09182015115159190940152938601939086019060010162002755565b509098975050505050505050565b5f80604083850312156200284c575f80fd5b50508035926020909101359150565b5f80604083850312156200286d575f80fd5b82356200287a8162002615565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115620013455762001345620028bf565b8082028115828204841417620013455762001345620028bf565b5f826200291e57634e487b7160e01b5f52601260045260245ffd5b500490565b608081525f62002937608083018762002676565b82810360208401526200294b818762002676565b604084019590955250506060015292915050565b600181811c908216806200297457607f821691505b6020821081036200299357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620029e457805f5260205f20601f840160051c81016020851015620029c05750805b601f840160051c820191505b81811015620029e1575f8155600101620029cc565b50505b505050565b815167ffffffffffffffff81111562002a065762002a06620024a5565b62002a1e8162002a1784546200295f565b8462002999565b602080601f83116001811462002a54575f841562002a3c5750858301515b5f19600386901b1c1916600185901b17855562002aae565b5f85815260208120601f198616915b8281101562002a845788860151825594840194600190910190840162002a63565b508582101562002aa257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115620013455762001345620028bf565b6020808252600d908201526c2ab735b737bbb7103a37b5b2b760991b604082015260600190565b5f6020828403121562002b3b575f80fd5b5051919050565b5f825162002b5581846020870162002652565b9190910192915050565b5f6001820162002b735762002b73620028bf565b5060010190565b5f6020828403121562002b8b575f80fd5b81516200264b8162002615565b5f6020828403121562002ba9575f80fd5b815180151581146200264b575f80fd5b5f805f6060848603121562002bcc575f80fd5b835192506020840151915060408401519050925092509256fe60a060405234801562000010575f80fd5b50604051620011cb380380620011cb8339810160408190526200003391620002f6565b5f8211620000795760405162461bcd60e51b815260206004820152600e60248201526d6d6178537570706c79207a65726f60901b60448201526064015b60405180910390fd5b81811115620000b85760405162461bcd60e51b815260206004820152600a6024820152690d2dcd2e8407c40dac2f60b31b604482015260640162000070565b5f620000c58582620003f5565b506001620000d48482620003f5565b506080829052620000e63382620000f0565b50505050620004e7565b6001600160a01b038216620001485760405162461bcd60e51b815260206004820152601360248201527f45524332303a206d696e7420746f207a65726f00000000000000000000000000604482015260640162000070565b608051816002546200015b9190620004c1565b1115620001ab5760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c7920657863656564656400000000000000000000000000604482015260640162000070565b8060025f828254620001be9190620004c1565b90915550506001600160a01b0382165f9081526003602052604081208054839290620001ec908490620004c1565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000259575f80fd5b81516001600160401b038082111562000276576200027662000235565b604051601f8301601f19908116603f01168101908282118183101715620002a157620002a162000235565b8160405283815260209250866020858801011115620002be575f80fd5b5f91505b83821015620002e15785820183015181830184015290820190620002c2565b5f602085830101528094505050505092915050565b5f805f80608085870312156200030a575f80fd5b84516001600160401b038082111562000321575f80fd5b6200032f8883890162000249565b9550602087015191508082111562000345575f80fd5b50620003548782880162000249565b604087015160609097015195989097509350505050565b600181811c908216806200038057607f821691505b6020821081036200039f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620003f057805f5260205f20601f840160051c81016020851015620003cc5750805b601f840160051c820191505b81811015620003ed575f8155600101620003d8565b50505b505050565b81516001600160401b0381111562000411576200041162000235565b62000429816200042284546200036b565b84620003a5565b602080601f8311600181146200045f575f8415620004475750858301515b5f19600386901b1c1916600185901b178555620004b9565b5f85815260208120601f198616915b828110156200048f578886015182559484019460019091019084016200046e565b5085821015620004ad57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80820180821115620004e157634e487b7160e01b5f52601160045260245ffd5b92915050565b608051610cc4620005075f395f818161020901526108cd0152610cc45ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806394bf804d11610088578063c45a015511610063578063c45a0155146101d9578063d5abeb0114610204578063dd62ed3e1461022b578063fcd3533c14610263575f80fd5b806394bf804d146101ab57806395d89b41146101be578063a9059cbb146101c6575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780635bb478081461016e57806370a0823114610183575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610276565b6040516100fe9190610ae2565b60405180910390f35b61011a610115366004610b49565b610301565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b71565b610317565b61015c601281565b60405160ff90911681526020016100fe565b61018161017c366004610baa565b6103b2565b005b610133610191366004610baa565b6001600160a01b03165f9081526003602052604090205490565b6101816101b9366004610bca565b610496565b6100f161052f565b61011a6101d4366004610b49565b61053c565b6005546101ec906001600160a01b031681565b6040516001600160a01b0390911681526020016100fe565b6101337f000000000000000000000000000000000000000000000000000000000000000081565b610133610239366004610bf4565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b610181610271366004610bca565b610548565b5f805461028290610c1c565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae90610c1c565b80156102f95780601f106102d0576101008083540402835291602001916102f9565b820191905f5260205f20905b8154815290600101906020018083116102dc57829003601f168201915b505050505081565b5f61030d3384846105d5565b5060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120548281101561038f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064015b60405180910390fd5b61039c85338584036105d5565b6103a78585856106db565b506001949350505050565b600554600160a01b900460ff16156104025760405162461bcd60e51b8152602060048201526013602482015272119858dd1bdc9e48185b1c9958591e481cd95d606a1b6044820152606401610386565b6001600160a01b0381166104475760405162461bcd60e51b815260206004820152600c60248201526b5a65726f20666163746f727960a01b6044820152606401610386565b600580546001600160a81b0319166001600160a01b038316908117600160a01b179091556040517f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b1905f90a250565b6005546001600160a01b031633146104de5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610386565b6104e8818361087f565b806001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8360405161052391815260200190565b60405180910390a25050565b6001805461028290610c1c565b5f61030d3384846106db565b6005546001600160a01b031633146105905760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610386565b61059a81836109c4565b806001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df78360405161052391815260200190565b6001600160a01b03831661062b5760405162461bcd60e51b815260206004820152601860248201527f45524332303a20617070726f76652066726f6d207a65726f00000000000000006044820152606401610386565b6001600160a01b03821661067a5760405162461bcd60e51b815260206004820152601660248201527545524332303a20617070726f766520746f207a65726f60501b6044820152606401610386565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166107315760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e736665722066726f6d207a65726f000000000000006044820152606401610386565b6001600160a01b0382166107875760405162461bcd60e51b815260206004820152601760248201527f45524332303a207472616e7366657220746f207a65726f0000000000000000006044820152606401610386565b6001600160a01b0383165f90815260036020526040902054818110156107ef5760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e73666572203e2062616c616e6365000000000000006044820152606401610386565b6001600160a01b038085165f90815260036020526040808220858503905591851681529081208054849290610825908490610c68565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161087191815260200190565b60405180910390a350505050565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152601360248201527245524332303a206d696e7420746f207a65726f60681b6044820152606401610386565b7f0000000000000000000000000000000000000000000000000000000000000000816002546108fa9190610c68565b111561093e5760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610386565b8060025f82825461094f9190610c68565b90915550506001600160a01b0382165f908152600360205260408120805483929061097b908490610c68565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610a125760405162461bcd60e51b815260206004820152601560248201527445524332303a206275726e2066726f6d207a65726f60581b6044820152606401610386565b6001600160a01b0382165f9081526003602052604090205481811015610a725760405162461bcd60e51b815260206004820152601560248201527445524332303a206275726e203e2062616c616e636560581b6044820152606401610386565b6001600160a01b0383165f908152600360205260408120838303905560028054849290610aa0908490610c7b565b90915550506040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016106ce565b5f602080835283518060208501525f5b81811015610b0e57858101830151858201604001528201610af2565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b44575f80fd5b919050565b5f8060408385031215610b5a575f80fd5b610b6383610b2e565b946020939093013593505050565b5f805f60608486031215610b83575f80fd5b610b8c84610b2e565b9250610b9a60208501610b2e565b9150604084013590509250925092565b5f60208284031215610bba575f80fd5b610bc382610b2e565b9392505050565b5f8060408385031215610bdb575f80fd5b82359150610beb60208401610b2e565b90509250929050565b5f8060408385031215610c05575f80fd5b610c0e83610b2e565b9150610beb60208401610b2e565b600181811c90821680610c3057607f821691505b602082108103610c4e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561031157610311610c54565b8181038181111561031157610311610c5456fea2646970667358221220feff3907868f71dddc68930ac67fe608751269ab2fbf9f6c08da0c41ae1f88db64736f6c63430008180033a264697066735822122029156ae512a301067255d9bf673ac5dca48f136043023e4fc5eaaed557762f8a64736f6c63430008180033000000000000000000000000d7be65a26f4279cccd7c7be1bbd2253f293b9c69000000000000000000000000c6558c1699230e1f1f39abc40f2d9b56182ffb4c0000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x608060405260043610620001b7575f3560e01c80638da5cb5b11620000fa578063d65f284e1162000092578063e1a45218116200006a578063e1a452181462000503578063e38abd0f146200051a578063e823bfd5146200053e578063fb08d6c01462000555575f80fd5b8063d65f284e14620004a5578063d9972d5314620004c3578063dd5988cd14620004df575f80fd5b8063a932492f11620000d2578063a932492f146200042a578063bcfeed9a1462000445578063bf333f2c146200046b578063ce3946961462000481575f80fd5b80638da5cb5b14620003a4578063956cc85914620003d9578063977ccd5b14620003f0575f80fd5b80632d80caa5116200016e5780636a1b7ecc11620001465780636a1b7ecc146200030a578063735de9f714620003215780637c5e279514620003565780638bdb2afa146200036f575f80fd5b80632d80caa514620002b25780632e0f262514620002d657806332cb6b0c14620002f3575f80fd5b8063075bb17d14620001bb5780630a22d68c14620001ef578063131dbd09146200021557806313cb5ad6146200023b578063164e68de146200025f5780631eecf7881462000283575b5f80fd5b620001d2620001cc3660046200254a565b62000579565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001fb575f80fd5b506200020660045481565b604051908152602001620001e6565b34801562000221575f80fd5b506200023962000233366004620025fd565b62000894565b005b34801562000247575f80fd5b50620001d262000259366004620025fd565b6200091a565b3480156200026b575f80fd5b50620002396200027d3660046200262d565b62000942565b3480156200028f575f80fd5b5062000206620002a13660046200262d565b60026020525f908152604090205481565b348015620002be575f80fd5b5062000239620002d03660046200262d565b62000ad9565b348015620002e2575f80fd5b5062000206670de0b6b3a764000081565b348015620002ff575f80fd5b506200020662000be7565b34801562000316575f80fd5b506200020660035481565b3480156200032d575f80fd5b50620001d27f000000000000000000000000c6558c1699230e1f1f39abc40f2d9b56182ffb4c81565b34801562000362575f80fd5b5062000206633b171b5081565b3480156200037b575f80fd5b50620001d27f000000000000000000000000d7be65a26f4279cccd7c7be1bbd2253f293b9c6981565b348015620003b0575f80fd5b50620001d27f000000000000000000000000ab973dba7e466ad1dde704ee16bfe4d36d0a597b81565b348015620003e5575f80fd5b506200020662000c01565b348015620003fc575f80fd5b50620004146200040e3660046200262d565b62000c33565b604051620001e6989796959493929190620026a3565b34801562000436575f80fd5b50620002066504751232a4b781565b34801562000451575f80fd5b506200045c62000ebe565b604051620001e691906200272e565b34801562000477575f80fd5b5062000206606481565b3480156200048d575f80fd5b50620002066200049f3660046200283a565b62001292565b348015620004b1575f80fd5b506200020668056bc75e2d6310000081565b348015620004cf575f80fd5b5062000206662386f26fc1000081565b348015620004eb575f80fd5b5062000206620004fd3660046200285b565b6200134b565b3480156200050f575f80fd5b506200020661271081565b34801562000526575f80fd5b5062000206620005383660046200283a565b62001777565b620002066200054f3660046200285b565b620017ca565b34801562000561575f80fd5b5062000206620005733660046200285b565b62001c0a565b5f600260055403620005a85760405162461bcd60e51b81526004016200059f9062002888565b60405180910390fd5b600260055568056bc75e2d63100000341015620006005760405162461bcd60e51b815260206004820152601560248201527410dc99585d1a5bdb88199959481c995c5d5a5c9959605a1b60448201526064016200059f565b3460045f828254620006139190620028d3565b909155505f9050858562000633670de0b6b3a7640000620f4240620028e9565b60646200064c670de0b6b3a7640000620f4240620028e9565b62000659906014620028e9565b62000665919062002903565b604051620006739062002497565b62000682949392919062002923565b604051809103905ff0801580156200069c573d5f803e3d5ffd5b50604051630b768f0160e31b81523060048201529091506001600160a01b03821690635bb47808906024015f604051808303815f87803b158015620006df575f80fd5b505af1158015620006f2573d5f803e3d5ffd5b50505f8054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b03871690811790915560408051610100810182528c815260208082018d90528183018b9052606082018c90526080820186905260a082018490523360c083015260e082018690529285529290915290912081518594509192509081906200079d9082620029e9565b5060208201516001820190620007b49082620029e9565b5060408201516002820190620007cb9082620029e9565b5060608201516003820190620007e29082620029e9565b506080820151600482015560a08201516005820180546001600160a01b039283166001600160a01b031990911617905560c08301516006909201805460e0909401511515600160a01b026001600160a81b03199094169282169290921792909217905560405133918316907f096627c8a73b9cd80e060634e86d64ccb00710637ab5b294c82d1ce416a23c8d906200087d9042815260200190565b60405180910390a360016005559695505050505050565b336001600160a01b037f000000000000000000000000ab973dba7e466ad1dde704ee16bfe4d36d0a597b1614620008df5760405162461bcd60e51b81526004016200059f9062002ab6565b60038190556040518181527f5fb4654f1efe30c6141eaa6855ffcb27e0b361d899b05e21b1a4d0b3e71e14db9060200160405180910390a150565b5f818154811062000929575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f000000000000000000000000ab973dba7e466ad1dde704ee16bfe4d36d0a597b16146200098d5760405162461bcd60e51b81526004016200059f9062002ab6565b600260055403620009b25760405162461bcd60e51b81526004016200059f9062002888565b60026005556001600160a01b038116620009f85760405162461bcd60e51b81526004016200059f906020808252600490820152637a65726f60e01b604082015260600190565b478062000a355760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b60448201526064016200059f565b5f826001600160a01b0316826040515b5f6040518083038185875af1925050503d805f811462000a81576040519150601f19603f3d011682016040523d82523d5f602084013e62000a86565b606091505b505090508062000acf5760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016200059f565b5050600160055550565b336001600160a01b037f000000000000000000000000ab973dba7e466ad1dde704ee16bfe4d36d0a597b161462000b245760405162461bcd60e51b81526004016200059f9062002ab6565b60026005540362000b495760405162461bcd60e51b81526004016200059f9062002888565b60026005556001600160a01b03811662000b8f5760405162461bcd60e51b81526004016200059f906020808252600490820152637a65726f60e01b604082015260600190565b6004548062000bcb5760405162461bcd60e51b81526020600482015260076024820152666e6f206665657360c81b60448201526064016200059f565b5f6004819055505f826001600160a01b03168260405162000a45565b62000bfe670de0b6b3a7640000620f4240620028e9565b81565b606462000c1a670de0b6b3a7640000620f4240620028e9565b62000c27906014620028e9565b62000bfe919062002903565b60016020525f908152604090208054819062000c4f906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000c7d906200295f565b801562000ccc5780601f1062000ca25761010080835404028352916020019162000ccc565b820191905f5260205f20905b81548152906001019060200180831162000cae57829003601f168201915b50505050509080600101805462000ce3906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000d11906200295f565b801562000d605780601f1062000d365761010080835404028352916020019162000d60565b820191905f5260205f20905b81548152906001019060200180831162000d4257829003601f168201915b50505050509080600201805462000d77906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000da5906200295f565b801562000df45780601f1062000dca5761010080835404028352916020019162000df4565b820191905f5260205f20905b81548152906001019060200180831162000dd657829003601f168201915b50505050509080600301805462000e0b906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462000e39906200295f565b801562000e885780601f1062000e5e5761010080835404028352916020019162000e88565b820191905f5260205f20905b81548152906001019060200180831162000e6a57829003601f168201915b5050505060048301546005840154600690940154929390926001600160a01b03918216925090811690600160a01b900460ff1688565b5f80546060918167ffffffffffffffff81111562000ee05762000ee0620024a5565b60405190808252806020026020018201604052801562000f6c57816020015b62000f58604051806101000160405280606081526020016060815260200160608152602001606081526020015f81526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f151581525090565b81526020019060019003908162000eff5790505b5090505f5b828110156200128b5760015f80838154811062000f925762000f9262002ad9565b5f9182526020808320909101546001600160a01b0316835282019290925260409081019091208151610100810190925280548290829062000fd3906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001001906200295f565b8015620010505780601f10620010265761010080835404028352916020019162001050565b820191905f5260205f20905b8154815290600101906020018083116200103257829003601f168201915b505050505081526020016001820180546200106b906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001099906200295f565b8015620010e85780601f10620010be57610100808354040283529160200191620010e8565b820191905f5260205f20905b815481529060010190602001808311620010ca57829003601f168201915b5050505050815260200160028201805462001103906200295f565b80601f016020809104026020016040519081016040528092919081815260200182805462001131906200295f565b8015620011805780601f10620011565761010080835404028352916020019162001180565b820191905f5260205f20905b8154815290600101906020018083116200116257829003601f168201915b505050505081526020016003820180546200119b906200295f565b80601f0160208091040260200160405190810160405280929190818152602001828054620011c9906200295f565b8015620012185780601f10620011ee5761010080835404028352916020019162001218565b820191905f5260205f20905b815481529060010190602001808311620011fa57829003601f168201915b50505091835250506004820154602082015260058201546001600160a01b0390811660408301526006909201549182166060820152600160a01b90910460ff161515608090910152825183908390811062001277576200127762002ad9565b602090810291909101015260010162000f71565b5092915050565b5f80670de0b6b3a7640000620012a98486620028d3565b620012bb906504751232a4b7620028e9565b620012c7919062002903565b90505f670de0b6b3a7640000620012e5866504751232a4b7620028e9565b620012f1919062002903565b90505f620012ff8362001ed3565b90505f6200130d8362001ed3565b90506504751232a4b762001322828462002aed565b6200133290633b171b50620028e9565b6200133e919062002903565b9450505050505b92915050565b5f600260055403620013715760405162461bcd60e51b81526004016200059f9062002888565b600260059081556001600160a01b038085165f81815260016020526040902092830154909116148015620013ad57506001600160a01b03841615155b620013cc5760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff1615620014225760405162461bcd60e51b815260206004820152601560248201527404c61756e636865643a2075736520556e697377617605c1b60448201526064016200059f565b835f62001438670de0b6b3a764000086620028e9565b6001600160a01b038781165f90815260026020526040908190205490516370a0823160e01b81523360048201529293509183918516906370a0823190602401602060405180830381865afa15801562001493573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620014b9919062002b2a565b1015620015005760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016200059f565b81811015620015495760405162461bcd60e51b8152602060048201526014602482015273437572766520737570706c7920746f6f206c6f7760601b60448201526064016200059f565b5f62001556828462001777565b90508085600401541015620015a75760405162461bcd60e51b8152602060048201526016602482015275092dce6eaccccd2c6d2cadce840c6eae4ecca408aa8960531b60448201526064016200059f565b5f612710620015b8606484620028e9565b620015c4919062002903565b90505f620015d3828462002aed565b90508160045f828254620015e89190620028d3565b9250508190555082876004015f82825462001604919062002aed565b90915550620016169050858562002aed565b6001600160a01b038b81165f9081526002602052604090819020929092559051633f34d4cf60e21b8152600481018790523360248201529087169063fcd3533c906044015f604051808303815f87803b15801562001672575f80fd5b505af115801562001685573d5f803e3d5ffd5b50506040515f925033915083908381818185875af1925050503d805f8114620016ca576040519150601f19603f3d011682016040523d82523d5f602084013e620016cf565b606091505b5050905080620017185760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b60448201526064016200059f565b604080518b8152602081018490524281830152905133916001600160a01b038e16917f9387a595ac4be9038bbb9751abad8baa3dcf219dd9e19abb81552bd521fe35469181900360600190a35060016005559998505050505050505050565b5f80670de0b6b3a764000062001794856504751232a4b7620028e9565b620017a0919062002903565b90505f670de0b6b3a7640000620017b8858762002aed565b620012e5906504751232a4b7620028e9565b5f600260055403620017f05760405162461bcd60e51b81526004016200059f9062002888565b600260059081556001600160a01b038085165f818152600160205260409020928301549091161480156200182c57506001600160a01b03841615155b6200184b5760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff1615620018a15760405162461bcd60e51b815260206004820152601560248201527404c61756e636865643a2075736520556e697377617605c1b60448201526064016200059f565b835f620018b7670de0b6b3a764000086620028e9565b6001600160a01b0387165f90815260026020526040812054919250816064620018ec670de0b6b3a7640000620f4240620028e9565b620018f9906014620028e9565b62001905919062002903565b6200191c670de0b6b3a7640000620f4240620028e9565b62001928919062002aed565b62001934919062002aed565b9050808311156200197e5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e7420737570706c7960681b60448201526064016200059f565b5f6200198b838562001292565b90505f6127106200199e606484620028e9565b620019aa919062002903565b90505f620019b98284620028d3565b905080341462001a035760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b60448201526064016200059f565b8160045f82825462001a169190620028d3565b9250508190555082886004015f82825462001a329190620028d3565b9091555062001a4490508686620028d3565b6001600160a01b038c81165f90815260026020526040908190209290925590516394bf804d60e01b815260048101889052336024820152908816906394bf804d906044015f604051808303815f87803b15801562001aa0575f80fd5b505af115801562001ab3573d5f803e3d5ffd5b5050604080518d815260208101859052428183015290513393506001600160a01b038f1692507f8692cf5ba66abd64f88cdc1ffa0ee9d9c21ee2d999322a20445ae32393394e3e9181900360600190a36006880154600160a01b900460ff1615801562001b2b5750662386f26fc10000886004015410155b1562001bf75760048801546003545f901580159062001b4b575060035482115b1562001b825760035462001b60908362002aed565b915060035460045f82825462001b779190620028d3565b909155505060035490505b60068a01805460ff60a01b1916600160a01b1790555f60048b015562001ba98d8362001f4d565b6040805183815260208101839052428183015290516001600160a01b038f16917fc5f40890b27f261001f50fb37aefc207cb219df4346046729dd64b33f6be95cf919081900360600190a250505b60016005559a9950505050505050505050565b6001600160a01b038083165f818152600160205260408120600581015491939092911614801562001c4357506001600160a01b03841615155b62001c625760405162461bcd60e51b81526004016200059f9062002b03565b6006810154600160a01b900460ff161562001cb35760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b60448201526064016200059f565b6001600160a01b0384165f908152600260205260408120549081606462001ce6670de0b6b3a7640000620f4240620028e9565b62001cf3906014620028e9565b62001cff919062002903565b62001d16670de0b6b3a7640000620f4240620028e9565b62001d22919062002aed565b62001d2e919062002aed565b90505f62001d45670de0b6b3a76400008362002903565b905080158062001d53575085155b1562001d66575f94505050505062001345565b5f61271062001d7760648262002aed565b62001d839089620028e9565b62001d8f919062002903565b90505f825b8082101562001ec6575f600262001dac8385620028d3565b62001db9906001620028d3565b62001dc5919062002903565b90505f62001ddc670de0b6b3a764000083620028e9565b60408051602481018b9052604480820184905282518083039091018152606490910182526020810180516001600160e01b031663671ca34b60e11b17905290519192505f918291309162001e31919062002b42565b5f60405180830381855afa9150503d805f811462001e6b576040519150601f19603f3d011682016040523d82523d5f602084013e62001e70565b606091505b5091509150811562001ead575f8180602001905181019062001e93919062002b2a565b905087811162001eab57849650505050505062001d94565b505b62001eba60018562002aed565b94505050505062001d94565b5098975050505050505050565b5f670de0b6b3a76400008060015b6014811162001f445762001efe670de0b6b3a764000082620028e9565b62001f0a8684620028e9565b62001f16919062002903565b915062001f248284620028d3565b92506001821062001f44578062001f3b8162002b5f565b91505062001ee1565b50909392505050565b5f811162001f8e5760405162461bcd60e51b815260206004820152600d60248201526c04e6f2045544820666f72204c5609c1b60448201526064016200059f565b5f7f000000000000000000000000d7be65a26f4279cccd7c7be1bbd2253f293b9c6990505f7f000000000000000000000000c6558c1699230e1f1f39abc40f2d9b56182ffb4c90505f816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002014573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200203a919062002b7a565b60405163e6a4390560e01b81526001600160a01b03878116600483015280831660248301529192505f9185169063e6a4390590604401602060405180830381865afa1580156200208c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620020b2919062002b7a565b90506001600160a01b0381166200213a576040516364e329cb60e11b81526001600160a01b038781166004830152838116602483015285169063c9c65396906044016020604051808303815f875af115801562002111573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002137919062002b7a565b90505b606462002153670de0b6b3a7640000620f4240620028e9565b62002160906014620028e9565b6200216c919062002903565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015620021af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620021d5919062002b2a565b10156200221e5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e74204c5020746f6b656e7360501b60448201526064016200059f565b6001600160a01b03861663095ea7b384606462002247670de0b6b3a7640000620f4240620028e9565b62002254906014620028e9565b62002260919062002903565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015620022a9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620022cf919062002b98565b505f6001600160a01b03841663f305d71987896064620022fb670de0b6b3a7640000620f4240620028e9565b62002308906014620028e9565b62002314919062002903565b60646200232d670de0b6b3a7640000620f4240620028e9565b6200233a906014620028e9565b62002346919062002903565b6040516001600160e01b031960e087901b1681526001600160a01b03909316600484015260248301919091526044820152606481018a90523060848201524260a482015260c40160606040518083038185885af1158015620023aa573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190620023d1919062002bb9565b925050505f81116200241c5760405162461bcd60e51b8152602060048201526013602482015272139bc81b1a5c5d5a591a5d1e481b5a5b9d1959606a1b60448201526064016200059f565b60405163a9059cbb60e01b81525f6004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af115801562002467573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200248d919062002b98565b5050505050505050565b6111cb8062002be683390190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620024c9575f80fd5b813567ffffffffffffffff80821115620024e757620024e7620024a5565b604051601f8301601f19908116603f01168101908282118183101715620025125762002512620024a5565b816040528381528660208588010111156200252b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f80608085870312156200255e575f80fd5b843567ffffffffffffffff8082111562002576575f80fd5b6200258488838901620024b9565b955060208701359150808211156200259a575f80fd5b620025a888838901620024b9565b94506040870135915080821115620025be575f80fd5b620025cc88838901620024b9565b93506060870135915080821115620025e2575f80fd5b50620025f187828801620024b9565b91505092959194509250565b5f602082840312156200260e575f80fd5b5035919050565b6001600160a01b03811681146200262a575f80fd5b50565b5f602082840312156200263e575f80fd5b81356200264b8162002615565b9392505050565b5f5b838110156200266e57818101518382015260200162002654565b50505f910152565b5f81518084526200268f81602086016020860162002652565b601f01601f19169290920160200192915050565b5f610100808352620026b88184018c62002676565b90508281036020840152620026ce818b62002676565b90508281036040840152620026e4818a62002676565b90508281036060840152620026fa818962002676565b608084019790975250506001600160a01b0393841660a08201529190921660c082015290151560e090910152949350505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156200282c57603f19898403018552815161010081518186526200277f8287018262002676565b915050888201518582038a87015262002799828262002676565b9150508782015185820389870152620027b3828262002676565b91505060608083015186830382880152620027cf838262002676565b92505050608080830151818701525060a080830151620027f9828801826001600160a01b03169052565b505060c0828101516001600160a01b03169086015260e09182015115159190940152938601939086019060010162002755565b509098975050505050505050565b5f80604083850312156200284c575f80fd5b50508035926020909101359150565b5f80604083850312156200286d575f80fd5b82356200287a8162002615565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115620013455762001345620028bf565b8082028115828204841417620013455762001345620028bf565b5f826200291e57634e487b7160e01b5f52601260045260245ffd5b500490565b608081525f62002937608083018762002676565b82810360208401526200294b818762002676565b604084019590955250506060015292915050565b600181811c908216806200297457607f821691505b6020821081036200299357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620029e457805f5260205f20601f840160051c81016020851015620029c05750805b601f840160051c820191505b81811015620029e1575f8155600101620029cc565b50505b505050565b815167ffffffffffffffff81111562002a065762002a06620024a5565b62002a1e8162002a1784546200295f565b8462002999565b602080601f83116001811462002a54575f841562002a3c5750858301515b5f19600386901b1c1916600185901b17855562002aae565b5f85815260208120601f198616915b8281101562002a845788860151825594840194600190910190840162002a63565b508582101562002aa257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115620013455762001345620028bf565b6020808252600d908201526c2ab735b737bbb7103a37b5b2b760991b604082015260600190565b5f6020828403121562002b3b575f80fd5b5051919050565b5f825162002b5581846020870162002652565b9190910192915050565b5f6001820162002b735762002b73620028bf565b5060010190565b5f6020828403121562002b8b575f80fd5b81516200264b8162002615565b5f6020828403121562002ba9575f80fd5b815180151581146200264b575f80fd5b5f805f6060848603121562002bcc575f80fd5b835192506020840151915060408401519050925092509256fe60a060405234801562000010575f80fd5b50604051620011cb380380620011cb8339810160408190526200003391620002f6565b5f8211620000795760405162461bcd60e51b815260206004820152600e60248201526d6d6178537570706c79207a65726f60901b60448201526064015b60405180910390fd5b81811115620000b85760405162461bcd60e51b815260206004820152600a6024820152690d2dcd2e8407c40dac2f60b31b604482015260640162000070565b5f620000c58582620003f5565b506001620000d48482620003f5565b506080829052620000e63382620000f0565b50505050620004e7565b6001600160a01b038216620001485760405162461bcd60e51b815260206004820152601360248201527f45524332303a206d696e7420746f207a65726f00000000000000000000000000604482015260640162000070565b608051816002546200015b9190620004c1565b1115620001ab5760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c7920657863656564656400000000000000000000000000604482015260640162000070565b8060025f828254620001be9190620004c1565b90915550506001600160a01b0382165f9081526003602052604081208054839290620001ec908490620004c1565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000259575f80fd5b81516001600160401b038082111562000276576200027662000235565b604051601f8301601f19908116603f01168101908282118183101715620002a157620002a162000235565b8160405283815260209250866020858801011115620002be575f80fd5b5f91505b83821015620002e15785820183015181830184015290820190620002c2565b5f602085830101528094505050505092915050565b5f805f80608085870312156200030a575f80fd5b84516001600160401b038082111562000321575f80fd5b6200032f8883890162000249565b9550602087015191508082111562000345575f80fd5b50620003548782880162000249565b604087015160609097015195989097509350505050565b600181811c908216806200038057607f821691505b6020821081036200039f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620003f057805f5260205f20601f840160051c81016020851015620003cc5750805b601f840160051c820191505b81811015620003ed575f8155600101620003d8565b50505b505050565b81516001600160401b0381111562000411576200041162000235565b62000429816200042284546200036b565b84620003a5565b602080601f8311600181146200045f575f8415620004475750858301515b5f19600386901b1c1916600185901b178555620004b9565b5f85815260208120601f198616915b828110156200048f578886015182559484019460019091019084016200046e565b5085821015620004ad57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80820180821115620004e157634e487b7160e01b5f52601160045260245ffd5b92915050565b608051610cc4620005075f395f818161020901526108cd0152610cc45ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806394bf804d11610088578063c45a015511610063578063c45a0155146101d9578063d5abeb0114610204578063dd62ed3e1461022b578063fcd3533c14610263575f80fd5b806394bf804d146101ab57806395d89b41146101be578063a9059cbb146101c6575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780635bb478081461016e57806370a0823114610183575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610276565b6040516100fe9190610ae2565b60405180910390f35b61011a610115366004610b49565b610301565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b71565b610317565b61015c601281565b60405160ff90911681526020016100fe565b61018161017c366004610baa565b6103b2565b005b610133610191366004610baa565b6001600160a01b03165f9081526003602052604090205490565b6101816101b9366004610bca565b610496565b6100f161052f565b61011a6101d4366004610b49565b61053c565b6005546101ec906001600160a01b031681565b6040516001600160a01b0390911681526020016100fe565b6101337f000000000000000000000000000000000000000000000000000000000000000081565b610133610239366004610bf4565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b610181610271366004610bca565b610548565b5f805461028290610c1c565b80601f01602080910402602001604051908101604052809291908181526020018280546102ae90610c1c565b80156102f95780601f106102d0576101008083540402835291602001916102f9565b820191905f5260205f20905b8154815290600101906020018083116102dc57829003601f168201915b505050505081565b5f61030d3384846105d5565b5060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120548281101561038f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064015b60405180910390fd5b61039c85338584036105d5565b6103a78585856106db565b506001949350505050565b600554600160a01b900460ff16156104025760405162461bcd60e51b8152602060048201526013602482015272119858dd1bdc9e48185b1c9958591e481cd95d606a1b6044820152606401610386565b6001600160a01b0381166104475760405162461bcd60e51b815260206004820152600c60248201526b5a65726f20666163746f727960a01b6044820152606401610386565b600580546001600160a81b0319166001600160a01b038316908117600160a01b179091556040517f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b1905f90a250565b6005546001600160a01b031633146104de5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610386565b6104e8818361087f565b806001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe8360405161052391815260200190565b60405180910390a25050565b6001805461028290610c1c565b5f61030d3384846106db565b6005546001600160a01b031633146105905760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610386565b61059a81836109c4565b806001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df78360405161052391815260200190565b6001600160a01b03831661062b5760405162461bcd60e51b815260206004820152601860248201527f45524332303a20617070726f76652066726f6d207a65726f00000000000000006044820152606401610386565b6001600160a01b03821661067a5760405162461bcd60e51b815260206004820152601660248201527545524332303a20617070726f766520746f207a65726f60501b6044820152606401610386565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166107315760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e736665722066726f6d207a65726f000000000000006044820152606401610386565b6001600160a01b0382166107875760405162461bcd60e51b815260206004820152601760248201527f45524332303a207472616e7366657220746f207a65726f0000000000000000006044820152606401610386565b6001600160a01b0383165f90815260036020526040902054818110156107ef5760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e73666572203e2062616c616e6365000000000000006044820152606401610386565b6001600160a01b038085165f90815260036020526040808220858503905591851681529081208054849290610825908490610c68565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161087191815260200190565b60405180910390a350505050565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152601360248201527245524332303a206d696e7420746f207a65726f60681b6044820152606401610386565b7f0000000000000000000000000000000000000000000000000000000000000000816002546108fa9190610c68565b111561093e5760405162461bcd60e51b81526020600482015260136024820152721b585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610386565b8060025f82825461094f9190610c68565b90915550506001600160a01b0382165f908152600360205260408120805483929061097b908490610c68565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610a125760405162461bcd60e51b815260206004820152601560248201527445524332303a206275726e2066726f6d207a65726f60581b6044820152606401610386565b6001600160a01b0382165f9081526003602052604090205481811015610a725760405162461bcd60e51b815260206004820152601560248201527445524332303a206275726e203e2062616c616e636560581b6044820152606401610386565b6001600160a01b0383165f908152600360205260408120838303905560028054849290610aa0908490610c7b565b90915550506040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016106ce565b5f602080835283518060208501525f5b81811015610b0e57858101830151858201604001528201610af2565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b44575f80fd5b919050565b5f8060408385031215610b5a575f80fd5b610b6383610b2e565b946020939093013593505050565b5f805f60608486031215610b83575f80fd5b610b8c84610b2e565b9250610b9a60208501610b2e565b9150604084013590509250925092565b5f60208284031215610bba575f80fd5b610bc382610b2e565b9392505050565b5f8060408385031215610bdb575f80fd5b82359150610beb60208401610b2e565b90509250929050565b5f8060408385031215610c05575f80fd5b610c0e83610b2e565b9150610beb60208401610b2e565b600181811c90821680610c3057607f821691505b602082108103610c4e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561031157610311610c54565b8181038181111561031157610311610c5456fea2646970667358221220feff3907868f71dddc68930ac67fe608751269ab2fbf9f6c08da0c41ae1f88db64736f6c63430008180033a264697066735822122029156ae512a301067255d9bf673ac5dca48f136043023e4fc5eaaed557762f8a64736f6c63430008180033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d7be65a26f4279cccd7c7be1bbd2253f293b9c69000000000000000000000000c6558c1699230e1f1f39abc40f2d9b56182ffb4c0000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0xd7Be65A26f4279CCcD7c7be1bBd2253f293B9C69
Arg [1] : _uniswapRouter (address): 0xC6558C1699230e1f1f39abC40F2d9b56182FfB4C
Arg [2] : _listingFee (uint256): 100

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7be65a26f4279cccd7c7be1bbd2253f293b9c69
Arg [1] : 000000000000000000000000c6558c1699230e1f1f39abc40f2d9b56182ffb4c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064


Deployed Bytecode Sourcemap

15542:14873:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19767:1134;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2092:32:1;;;2074:51;;2062:2;2047:18;19767:1134:0;;;;;;;;17489:33;;;;;;;;;;;;;;;;;;;2282:25:1;;;2270:2;2255:18;17489:33:0;2136:177:1;19576:152:0;;;;;;;;;;-1:-1:-1;19576:152:0;;;;;:::i;:::-;;:::i;:::-;;16839:35;;;;;;;;;;-1:-1:-1;16839:35:0;;;;;:::i;:::-;;:::i;30094:318::-;;;;;;;;;;-1:-1:-1;30094:318:0;;;;;:::i;:::-;;:::i;16943:46::-;;;;;;;;;;-1:-1:-1;16943:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;29576:378;;;;;;;;;;-1:-1:-1;29576:378:0;;;;;:::i;:::-;;:::i;17568:43::-;;;;;;;;;;;;17603:8;17568:43;;17618:57;;;;;;;;;;;;;:::i;17354:25::-;;;;;;;;;;;;;;;;16792:38;;;;;;;;;;;;;;;18101:51;;;;;;;;;;;;18141:11;18101:51;;16746:39;;;;;;;;;;;;;;;16709:30;;;;;;;;;;;;;;;17682:61;;;;;;;;;;;;;:::i;16881:55::-;;;;;;;;;;-1:-1:-1;16881:55:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;18204:45::-;;;;;;;;;;;;18232:17;18204:45;;20909:330;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17125:37::-;;;;;;;;;;;;17159:3;17125:37;;21282:388;;;;;;;;;;-1:-1:-1;21282:388:0;;;;;:::i;:::-;;:::i;17060:58::-;;;;;;;;;;;;17109:9;17060:58;;18346;;;;;;;;;;;;18394:10;18346:58;;26806:1403;;;;;;;;;;-1:-1:-1;26806:1403:0;;;;;:::i;:::-;;:::i;17191:48::-;;;;;;;;;;;;17233:6;17191:48;;23471:390;;;;;;;;;;-1:-1:-1;23471:390:0;;;;;:::i;:::-;;:::i;24610:2031::-;;;;;;:::i;:::-;;:::i;21897:1566::-;;;;;;;;;;-1:-1:-1;21897:1566:0;;;;;:::i;:::-;;:::i;19767:1134::-;19967:7;18530:1;18613:7;;:19;18605:63;;;;-1:-1:-1;;;18605:63:0;;;;;;;:::i;:::-;;;;;;;;;18530:1;18679:7;:18;17109:9:::1;19995;:35;;19987:69;;;::::0;-1:-1:-1;;;19987:69:0;;8150:2:1;19987:69:0::1;::::0;::::1;8132:21:1::0;8189:2;8169:18;;;8162:30;-1:-1:-1;;;8208:18:1;;;8201:51;8269:18;;19987:69:0::1;7948:345:1::0;19987:69:0::1;20141:9;20119:18;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;20258:11:0::1;::::0;-1:-1:-1;20282:4:0;20288:6;17655:20:::1;17603:8;17655:9;:20;:::i;:::-;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;::::0;17734:2:::1;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;20272:48;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;20331:31:0::1;::::0;-1:-1:-1;;;20331:31:0;;20356:4:::1;20331:31;::::0;::::1;2074:51:1::0;20258:62:0;;-1:-1:-1;;;;;;20331:16:0;::::1;::::0;::::1;::::0;2047:18:1;;20331:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20373:17:0::1;20420:34:::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;20420:34:0::1;-1:-1:-1::0;;;;;20420:34:0;::::1;::::0;;::::1;::::0;;;20497:295:::1;::::0;;20420:34:::1;20497:295:::0;::::1;::::0;;;;;20420:34:::1;20497:295:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;20738:10:::1;20497:295:::0;;;;;;;;;;20465:29;;;;;;;;;;:327;;20420:34;;-1:-1:-1;20497:295:0;;-1:-1:-1;20465:29:0;;;:327:::1;::::0;:29;:327:::1;:::i;:::-;-1:-1:-1::0;20465:327:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;20465:327:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;20465:327:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;20465:327:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;20465:327:0;;::::1;-1:-1:-1::0;;;;;;20465:327:0;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;20465:327:0::1;-1:-1:-1::0;;;;;;20465:327:0;;;;;::::1;::::0;;;;;;;::::1;::::0;;20810:56:::1;::::0;20838:10:::1;::::0;20810:56;::::1;::::0;::::1;::::0;::::1;::::0;20850:15:::1;2282:25:1::0;;2270:2;2255:18;;2136:177;20810:56:0::1;;;;;;;;18486:1:::0;18720:7;:22;20884:9;19767:1134;-1:-1:-1;;;;;;19767:1134:0:o;19576:152::-;18798:10;-1:-1:-1;;;;;18812:5:0;18798:19;;18790:41;;;;-1:-1:-1;;;18790:41:0;;;;;;;:::i;:::-;19650:10:::1;:24:::0;;;19690:30:::1;::::0;2282:25:1;;;19690:30:0::1;::::0;2270:2:1;2255:18;19690:30:0::1;;;;;;;19576:152:::0;:::o;16839:35::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16839:35:0;;-1:-1:-1;16839:35:0;:::o;30094:318::-;18798:10;-1:-1:-1;;;;;18812:5:0;18798:19;;18790:41;;;;-1:-1:-1;;;18790:41:0;;;;;;;:::i;:::-;18530:1:::1;18613:7;;:19:::0;18605:63:::1;;;;-1:-1:-1::0;;;18605:63:0::1;;;;;;;:::i;:::-;18530:1;18679:7;:18:::0;-1:-1:-1;;;;;30187:16:0;::::2;30179:33;;;;-1:-1:-1::0;;;30179:33:0::2;;;;;;12581:2:1::0;12563:21;;;12620:1;12600:18;;;12593:29;-1:-1:-1;;;12653:2:1;12638:18;;12631:34;12697:2;12682:18;;12379:327;30179:33:0::2;30237:21;30277:7:::0;30269:30:::2;;;::::0;-1:-1:-1;;;30269:30:0;;12913:2:1;30269:30:0::2;::::0;::::2;12895:21:1::0;12952:2;12932:18;;;12925:30;-1:-1:-1;;;12971:18:1;;;12964:40;13021:18;;30269:30:0::2;12711:334:1::0;30269:30:0::2;30313:12;30331:2;-1:-1:-1::0;;;;;30331:7:0::2;30346:3;30331:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30312:42;;;30373:7;30365:39;;;::::0;-1:-1:-1;;;30365:39:0;;13462:2:1;30365:39:0::2;::::0;::::2;13444:21:1::0;13501:2;13481:18;;;13474:30;-1:-1:-1;;;13520:18:1;;;13513:49;13579:18;;30365:39:0::2;13260:343:1::0;30365:39:0::2;-1:-1:-1::0;;18486:1:0::1;18720:7;:22:::0;-1:-1:-1;30094:318:0:o;29576:378::-;18798:10;-1:-1:-1;;;;;18812:5:0;18798:19;;18790:41;;;;-1:-1:-1;;;18790:41:0;;;;;;;:::i;:::-;18530:1:::1;18613:7;;:19:::0;18605:63:::1;;;;-1:-1:-1::0;;;18605:63:0::1;;;;;;;:::i;:::-;18530:1;18679:7;:18:::0;-1:-1:-1;;;;;29693:16:0;::::2;29685:33;;;;-1:-1:-1::0;;;29685:33:0::2;;;;;;12581:2:1::0;12563:21;;;12620:1;12600:18;;;12593:29;-1:-1:-1;;;12653:2:1;12638:18;;12631:34;12697:2;12682:18;;12379:327;29685:33:0::2;29746:18;::::0;29783:10;29775:30:::2;;;::::0;-1:-1:-1;;;29775:30:0;;13810:2:1;29775:30:0::2;::::0;::::2;13792:21:1::0;13849:1;13829:18;;;13822:29;-1:-1:-1;;;13867:18:1;;;13860:37;13914:18;;29775:30:0::2;13608:330:1::0;29775:30:0::2;29837:1;29816:18;:22;;;;29852:12;29870:2;-1:-1:-1::0;;;;;29870:7:0::2;29885:6;29870:26;;;13050:205:1::0;17618:57:0;17655:20;17603:8;17655:9;:20;:::i;:::-;17618:57;:::o;17682:61::-;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;16881:55::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;16881:55:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16881:55:0;;;;-1:-1:-1;16881:55:0;;;;-1:-1:-1;;;16881:55:0;;;;;:::o;20909:330::-;20991:11;21005:25;;20960:18;;21005:25;21067:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21067:20:0;;;;;;;;;;;;;;;;;21041:46;;21103:9;21098:112;21122:3;21118:1;:7;21098:112;;;21157:18;:41;21176:18;21195:1;21176:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;21176:21:0;21157:41;;;;;;;;;;;;;;;21147:51;;21176:21;21147:51;;;;;;;;;21157:41;;21147:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21147:51:0;;;-1:-1:-1;;21147:51:0;;;;;;;;;;;;-1:-1:-1;;;;;21147:51:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21147:51:0;;;;;;;;;;;;:7;;;;21152:1;;21147:7;;;;;;:::i;:::-;;;;;;;;;;:51;21127:3;;21098:112;;;-1:-1:-1;21227:4:0;20909:330;-1:-1:-1;;20909:330:0:o;21282:388::-;21390:7;;17603:8;21436:22;21449:9;21436:10;:22;:::i;:::-;21431:28;;18232:17;21431:28;:::i;:::-;21430:41;;;;:::i;:::-;21410:61;-1:-1:-1;21482:17:0;17603:8;21503:14;21507:10;18232:17;21503:14;:::i;:::-;21502:27;;;;:::i;:::-;21482:47;;21540:12;21555:14;21559:9;21555:3;:14::i;:::-;21540:29;;21580:12;21595:14;21599:9;21595:3;:14::i;:::-;21580:29;-1:-1:-1;18232:17:0;21645:11;21580:29;21645:4;:11;:::i;:::-;21628:29;;18141:11;21628:29;:::i;:::-;21627:35;;;;:::i;:::-;21620:42;;;;;;21282:388;;;;;:::o;26806:1403::-;26922:7;18530:1;18613:7;;:19;18605:63;;;;-1:-1:-1;;;18605:63:0;;;;;;;:::i;:::-;18530:1;18679:7;:18;;;-1:-1:-1;;;;;26965:29:0;;::::1;26942:20;26965:29:::0;;;:18:::1;:29;::::0;;;;27027:15;;::::1;::::0;;;::::1;:28;:55:::0;::::1;;;-1:-1:-1::0;;;;;;27059:23:0;::::1;::::0;::::1;27027:55;27005:118;;;;-1:-1:-1::0;;;27005:118:0::1;;;;;;;:::i;:::-;27143:13;::::0;::::1;::::0;-1:-1:-1;;;27143:13:0;::::1;;;27142:14;27134:48;;;::::0;-1:-1:-1;;;27134:48:0;;14752:2:1;27134:48:0::1;::::0;::::1;14734:21:1::0;14791:2;14771:18;;;14764:30;-1:-1:-1;;;14810:18:1;;;14803:51;14871:18;;27134:48:0::1;14550:345:1::0;27134:48:0::1;27215:9:::0;27195:11:::1;27253:19;17603:8;27253::::0;:19:::1;:::i;:::-;-1:-1:-1::0;;;;;27306:22:0;;::::1;27285:18;27306:22:::0;;;:11:::1;:22;::::0;;;;;;;27349:27;;-1:-1:-1;;;27349:27:0;;27365:10:::1;27349:27;::::0;::::1;2074:51:1::0;27236:36:0;;-1:-1:-1;27306:22:0;27236:36;;27349:15;::::1;::::0;::::1;::::0;2047:18:1;;27349:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;27341:70;;;::::0;-1:-1:-1;;;27341:70:0;;15291:2:1;27341:70:0::1;::::0;::::1;15273:21:1::0;15330:2;15310:18;;;15303:30;-1:-1:-1;;;15349:18:1;;;15342:50;15409:18;;27341:70:0::1;15089:344:1::0;27341:70:0::1;27444:6;27430:10;:20;;27422:53;;;::::0;-1:-1:-1;;;27422:53:0;;15640:2:1;27422:53:0::1;::::0;::::1;15622:21:1::0;15679:2;15659:18;;;15652:30;-1:-1:-1;;;15698:18:1;;;15691:50;15758:18;;27422:53:0::1;15438:344:1::0;27422:53:0::1;27488:14;27505:35;27521:10;27533:6;27505:15;:35::i;:::-;27488:52;;27579:6;27559:2;:16;;;:26;;27551:61;;;::::0;-1:-1:-1;;;27551:61:0;;15989:2:1;27551:61:0::1;::::0;::::1;15971:21:1::0;16028:2;16008:18;;;16001:30;-1:-1:-1;;;16047:18:1;;;16040:52;16109:18;;27551:61:0::1;15787:346:1::0;27551:61:0::1;27625:11;17233:6;27640:16;17159:3;27640:6:::0;:16:::1;:::i;:::-;27639:36;;;;:::i;:::-;27625:50:::0;-1:-1:-1;27686:17:0::1;27706:12;27625:50:::0;27706:6;:12:::1;:::i;:::-;27686:32;;27753:3;27731:18;;:25;;;;;;;:::i;:::-;;;;;;;;27787:6;27767:2;:16;;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;27829:19:0::1;::::0;-1:-1:-1;27842:6:0;27829:10;:19:::1;:::i;:::-;-1:-1:-1::0;;;;;27804:22:0;;::::1;;::::0;;;:11:::1;:22;::::0;;;;;;:44;;;;27861:30;;-1:-1:-1;;;27861:30:0;;::::1;::::0;::::1;16312:25:1::0;;;27880:10:0::1;16353:18:1::0;;;16346:60;27861:10:0;;::::1;::::0;::::1;::::0;16285:18:1;;27861:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27923:37:0::1;::::0;27905:12:::1;::::0;-1:-1:-1;27923:10:0::1;::::0;-1:-1:-1;27946:9:0;;27905:12;27923:37;27905:12;27923:37;27946:9;27923:10;:37:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27904:56;;;27979:7;27971:39;;;::::0;-1:-1:-1;;;27971:39:0;;13462:2:1;27971:39:0::1;::::0;::::1;13444:21:1::0;13501:2;13481:18;;;13474:30;-1:-1:-1;;;13520:18:1;;;13513:49;13579:18;;27971:39:0::1;13260:343:1::0;27971:39:0::1;28028:146;::::0;;16619:25:1;;;16675:2;16660:18;;16653:34;;;28148:15:0::1;16703:18:1::0;;;16696:34;28028:146:0;;28076:10:::1;::::0;-1:-1:-1;;;;;28028:146:0;::::1;::::0;::::1;::::0;;;;16607:2:1;28028:146:0;;::::1;-1:-1:-1::0;18486:1:0;18720:7;:22;28192:9;26806:1403;-1:-1:-1;;;;;;;;;26806:1403:0:o;23471:390::-;23581:7;;17603:8;23622:14;23626:10;18232:17;23622:14;:::i;:::-;23621:27;;;;:::i;:::-;23601:47;-1:-1:-1;23659:17:0;17603:8;23685:22;23698:9;23685:10;:22;:::i;:::-;23680:28;;18232:17;23680:28;:::i;24610:2031::-;24733:7;18530:1;18613:7;;:19;18605:63;;;;-1:-1:-1;;;18605:63:0;;;;;;;:::i;:::-;18530:1;18679:7;:18;;;-1:-1:-1;;;;;24776:29:0;;::::1;24753:20;24776:29:::0;;;:18:::1;:29;::::0;;;;24838:15;;::::1;::::0;;;::::1;:28;:55:::0;::::1;;;-1:-1:-1::0;;;;;;24870:23:0;::::1;::::0;::::1;24838:55;24816:118;;;;-1:-1:-1::0;;;24816:118:0::1;;;;;;;:::i;:::-;24954:13;::::0;::::1;::::0;-1:-1:-1;;;24954:13:0;::::1;;;24953:14;24945:48;;;::::0;-1:-1:-1;;;24945:48:0;;14752:2:1;24945:48:0::1;::::0;::::1;14734:21:1::0;14791:2;14771:18;;;14764:30;-1:-1:-1;;;14810:18:1;;;14803:51;14871:18;;24945:48:0::1;14550:345:1::0;24945:48:0::1;25026:9:::0;25006:11:::1;25064:19;17603:8;25064::::0;:19:::1;:::i;:::-;-1:-1:-1::0;;;;;25117:22:0;::::1;25096:18;25117:22:::0;;;:11:::1;:22;::::0;;;;;25047:36;;-1:-1:-1;25117:22:0;17740:3:::1;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;::::0;17734:2:::1;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;17655:20;17603:8;17655:9;:20;:::i;:::-;25170:24;;;;:::i;:::-;:37;;;;:::i;:::-;25150:57;;25236:9;25226:6;:19;;25218:51;;;::::0;-1:-1:-1;;;25218:51:0;;16943:2:1;25218:51:0::1;::::0;::::1;16925:21:1::0;16982:2;16962:18;;;16955:30;-1:-1:-1;;;17001:18:1;;;16994:49;17060:18;;25218:51:0::1;16741:343:1::0;25218:51:0::1;25282:17;25302:33;25316:10;25328:6;25302:13;:33::i;:::-;25282:53:::0;-1:-1:-1;25346:11:0::1;17233:6;25361:19;17159:3;25282:53:::0;25361:19:::1;:::i;:::-;25360:39;;;;:::i;:::-;25346:53:::0;-1:-1:-1;25410:13:0::1;25426:15;25346:53:::0;25426:9;:15:::1;:::i;:::-;25410:31;;25475:5;25462:9;:18;25454:51;;;::::0;-1:-1:-1;;;25454:51:0;;17291:2:1;25454:51:0::1;::::0;::::1;17273:21:1::0;17330:2;17310:18;;;17303:30;-1:-1:-1;;;17349:18:1;;;17342:50;17409:18;;25454:51:0::1;17089:344:1::0;25454:51:0::1;25540:3;25518:18;;:25;;;;;;;:::i;:::-;;;;;;;;25574:9;25554:2;:16;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;25619:19:0::1;::::0;-1:-1:-1;25632:6:0;25619:10;:19:::1;:::i;:::-;-1:-1:-1::0;;;;;25594:22:0;;::::1;;::::0;;;:11:::1;:22;::::0;;;;;;:44;;;;25651:30;;-1:-1:-1;;;25651:30:0;;::::1;::::0;::::1;16312:25:1::0;;;25670:10:0::1;16353:18:1::0;;;16346:60;25651:10:0;;::::1;::::0;::::1;::::0;16285:18:1;;25651:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25699:144:0::1;::::0;;16619:25:1;;;16675:2;16660:18;;16653:34;;;25817:15:0::1;16703:18:1::0;;;16696:34;25699:144:0;;25749:10:::1;::::0;-1:-1:-1;;;;;;25699:144:0;::::1;::::0;-1:-1:-1;25699:144:0::1;::::0;;;;16607:2:1;25699:144:0;;::::1;25945:13;::::0;::::1;::::0;-1:-1:-1;;;25945:13:0;::::1;;;25944:14;:59:::0;::::1;;;;18394:10;25962:2;:16;;;:41;;25944:59;25940:669;;;26036:16;::::0;::::1;::::0;26115:10:::1;::::0;26020:13:::1;::::0;26115:14;;;;:36:::1;;;26141:10;;26133:5;:18;26115:36;26111:194;;;26181:10;::::0;26172:19:::1;::::0;;::::1;:::i;:::-;;;26232:10;;26210:18;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26279:10:0::1;::::0;;-1:-1:-1;26111:194:0::1;26321:13;::::0;::::1;:20:::0;;-1:-1:-1;;;;26321:20:0::1;-1:-1:-1::0;;;26321:20:0::1;::::0;;;26356:16:::1;::::0;::::1;:20:::0;26393:34:::1;26410:9:::0;26421:5;26393:16:::1;:34::i;:::-;26449:148;::::0;;16619:25:1;;;16675:2;16660:18;;16653:34;;;26567:15:0::1;16703:18:1::0;;;16696:34;26449:148:0;;-1:-1:-1;;;;;26449:148:0;::::1;::::0;::::1;::::0;;;;;16607:2:1;26449:148:0;;::::1;26005:604;;25940:669;18486:1:::0;18720:7;:22;26628:5;24610:2031;-1:-1:-1;;;;;;;;;;24610:2031:0:o;21897:1566::-;-1:-1:-1;;;;;22063:29:0;;;22020:7;22063:29;;;:18;:29;;;;;22125:15;;;;22020:7;;22063:29;;22125:15;;:28;:55;;;;-1:-1:-1;;;;;;22157:23:0;;;;22125:55;22103:118;;;;-1:-1:-1;;;22103:118:0;;;;;;;:::i;:::-;22241:13;;;;-1:-1:-1;;;22241:13:0;;;;22240:14;22232:43;;;;-1:-1:-1;;;22232:43:0;;17640:2:1;22232:43:0;;;17622:21:1;17679:2;17659:18;;;17652:30;-1:-1:-1;;;17698:18:1;;;17691:46;17754:18;;22232:43:0;17438:340:1;22232:43:0;-1:-1:-1;;;;;22309:22:0;;22288:18;22309:22;;;:11;:22;;;;;;;;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;17655:20;17603:8;17655:9;:20;:::i;:::-;22361:24;;;;:::i;:::-;:37;;;;:::i;:::-;22342:56;-1:-1:-1;22409:17:0;22429:19;17603:8;22342:56;22429:19;:::i;:::-;22409:39;-1:-1:-1;22465:14:0;;;:32;;-1:-1:-1;22483:14:0;;22465:32;22461:73;;;22521:1;22514:8;;;;;;;;22461:73;22614:20;17233:6;22651:25;17159:3;17233:6;22651:25;:::i;:::-;22638:39;;:9;:39;:::i;:::-;22637:72;;;;:::i;:::-;22614:95;-1:-1:-1;22722:11:0;22763:9;22785:648;22798:4;22792:3;:10;22785:648;;;22819:11;22852:1;22834:10;22840:4;22834:3;:10;:::i;:::-;:14;;22847:1;22834:14;:::i;:::-;22833:20;;;;:::i;:::-;22819:34;-1:-1:-1;22868:17:0;22888:14;17603:8;22819:34;22888:14;:::i;:::-;22993:156;;;;;;17957:25:1;;;17998:18;;;;17991:34;;;22993:156:0;;;;;;;;;;17930:18:1;;;;22993:156:0;;;;;;;-1:-1:-1;;;;;22993:156:0;-1:-1:-1;;;22993:156:0;;;22950:214;;17991:34:1;;-1:-1:-1;;;;;22958:4:0;;22950:214;;22993:156;22950:214;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22919:245;;;;23185:2;23181:212;;;23208:12;23234:4;23223:27;;;;;;;;;;;;:::i;:::-;23208:42;;23281:12;23273:4;:20;23269:109;;23324:3;23318:9;;23350:8;;;;;;;23269:109;23189:204;23181:212;23414:7;23420:1;23414:3;:7;:::i;:::-;23407:14;;22804:629;;;;22785:648;;;-1:-1:-1;23452:3:0;21897:1566;-1:-1:-1;;;;;;;;21897:1566:0:o;24053:333::-;24100:7;17603:8;;24211:1;24194:164;24219:2;24214:1;:7;24194:164;;24264:21;17603:8;24272:1;24264:21;:::i;:::-;24251:8;24258:1;24251:4;:8;:::i;:::-;24250:36;;;;:::i;:::-;24243:43;-1:-1:-1;24301:11:0;24243:43;24301:11;;:::i;:::-;;;24338:1;24331:4;:8;24341:5;24327:19;24223:3;;;;:::i;:::-;;;;24194:164;;;-1:-1:-1;24375:3:0;;24053:333;-1:-1:-1;;;24053:333:0:o;28256:1193::-;28360:1;28348:9;:13;28340:39;;;;-1:-1:-1;;;28340:39:0;;18670:2:1;28340:39:0;;;18652:21:1;18709:2;18689:18;;;18682:30;-1:-1:-1;;;18728:18:1;;;18721:43;18781:18;;28340:39:0;18468:337:1;28340:39:0;28392:25;28438:14;28392:61;;28464:25;28511:13;28464:61;;28538:12;28553:6;-1:-1:-1;;;;;28553:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28592:32;;-1:-1:-1;;;28592:32:0;;-1:-1:-1;;;;;19304:15:1;;;28592:32:0;;;19286:34:1;19356:15;;;19336:18;;;19329:43;28538:28:0;;-1:-1:-1;28577:12:0;;28592:15;;;;;19221:18:1;;28592:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28577:47;-1:-1:-1;;;;;;28639:18:0;;28635:93;;28681:35;;-1:-1:-1;;;28681:35:0;;-1:-1:-1;;;;;19304:15:1;;;28681:35:0;;;19286:34:1;19356:15;;;19336:18;;;19329:43;28681:18:0;;;;;19221::1;;28681:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28674:42;;28635:93;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;28834:41;;-1:-1:-1;;;28834:41:0;;28869:4;28834:41;;;2074:51:1;-1:-1:-1;;;;;28834:26:0;;;;;2047:18:1;;28834:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;28812:128;;;;-1:-1:-1;;;28812:128:0;;19585:2:1;28812:128:0;;;19567:21:1;19624:2;19604:18;;;19597:30;-1:-1:-1;;;19643:18:1;;;19636:52;19705:18;;28812:128:0;19383:346:1;28812:128:0;-1:-1:-1;;;;;28953:24:0;;;28986:6;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;28953:54;;-1:-1:-1;;;;;;28953:54:0;;;;;;;-1:-1:-1;;;;;19926:32:1;;;28953:54:0;;;19908:51:1;19975:18;;;19968:34;19881:18;;28953:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29025:17:0;-1:-1:-1;;;;;29046:22:0;;;29076:9;29101;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;17740:3;17655:20;17603:8;17655:9;:20;:::i;:::-;17721:15;;17734:2;17721:15;:::i;:::-;17720:23;;;;:::i;:::-;29046:234;;-1:-1:-1;;;;;;29046:234:0;;;;;;;-1:-1:-1;;;;;20638:15:1;;;29046:234:0;;;20620:34:1;20670:18;;;20663:34;;;;20713:18;;;20706:34;20756:18;;;20749:34;;;29234:4:0;20799:19:1;;;20792:44;29254:15:0;20852:19:1;;;20845:35;20554:19;;29046:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29020:260;;;;29313:1;29301:9;:13;29293:45;;;;-1:-1:-1;;;29293:45:0;;21404:2:1;29293:45:0;;;21386:21:1;21443:2;21423:18;;;21416:30;-1:-1:-1;;;21462:18:1;;;21455:49;21521:18;;29293:45:0;21202:343:1;29293:45:0;29389:52;;-1:-1:-1;;;29389:52:0;;29427:1;29389:52;;;19908:51:1;19975:18;;;19968:34;;;-1:-1:-1;;;;;29389:29:0;;;;;19881:18:1;;29389:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28329:1120;;;;;28256:1193;;:::o;-1:-1:-1:-;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:719;189:5;242:3;235:4;227:6;223:17;219:27;209:55;;260:1;257;250:12;209:55;296:6;283:20;322:18;359:2;355;352:10;349:36;;;365:18;;:::i;:::-;440:2;434:9;408:2;494:13;;-1:-1:-1;;490:22:1;;;514:2;486:31;482:40;470:53;;;538:18;;;558:22;;;535:46;532:72;;;584:18;;:::i;:::-;624:10;620:2;613:22;659:2;651:6;644:18;705:3;698:4;693:2;685:6;681:15;677:26;674:35;671:55;;;722:1;719;712:12;671:55;786:2;779:4;771:6;767:17;760:4;752:6;748:17;735:54;833:1;826:4;821:2;813:6;809:15;805:26;798:37;853:6;844:15;;;;;;146:719;;;;:::o;870:944::-;996:6;1004;1012;1020;1073:3;1061:9;1052:7;1048:23;1044:33;1041:53;;;1090:1;1087;1080:12;1041:53;1130:9;1117:23;1159:18;1200:2;1192:6;1189:14;1186:34;;;1216:1;1213;1206:12;1186:34;1239:50;1281:7;1272:6;1261:9;1257:22;1239:50;:::i;:::-;1229:60;;1342:2;1331:9;1327:18;1314:32;1298:48;;1371:2;1361:8;1358:16;1355:36;;;1387:1;1384;1377:12;1355:36;1410:52;1454:7;1443:8;1432:9;1428:24;1410:52;:::i;:::-;1400:62;;1515:2;1504:9;1500:18;1487:32;1471:48;;1544:2;1534:8;1531:16;1528:36;;;1560:1;1557;1550:12;1528:36;1583:52;1627:7;1616:8;1605:9;1601:24;1583:52;:::i;:::-;1573:62;;1688:2;1677:9;1673:18;1660:32;1644:48;;1717:2;1707:8;1704:16;1701:36;;;1733:1;1730;1723:12;1701:36;;1756:52;1800:7;1789:8;1778:9;1774:24;1756:52;:::i;:::-;1746:62;;;870:944;;;;;;;:::o;2318:180::-;2377:6;2430:2;2418:9;2409:7;2405:23;2401:32;2398:52;;;2446:1;2443;2436:12;2398:52;-1:-1:-1;2469:23:1;;2318:180;-1:-1:-1;2318:180:1:o;2503:139::-;-1:-1:-1;;;;;2586:31:1;;2576:42;;2566:70;;2632:1;2629;2622:12;2566:70;2503:139;:::o;2647:263::-;2714:6;2767:2;2755:9;2746:7;2742:23;2738:32;2735:52;;;2783:1;2780;2773:12;2735:52;2822:9;2809:23;2841:39;2874:5;2841:39;:::i;:::-;2899:5;2647:263;-1:-1:-1;;;2647:263:1:o;3175:250::-;3260:1;3270:113;3284:6;3281:1;3278:13;3270:113;;;3360:11;;;3354:18;3341:11;;;3334:39;3306:2;3299:10;3270:113;;;-1:-1:-1;;3417:1:1;3399:16;;3392:27;3175:250::o;3430:271::-;3472:3;3510:5;3504:12;3537:6;3532:3;3525:19;3553:76;3622:6;3615:4;3610:3;3606:14;3599:4;3592:5;3588:16;3553:76;:::i;:::-;3683:2;3662:15;-1:-1:-1;;3658:29:1;3649:39;;;;3690:4;3645:50;;3430:271;-1:-1:-1;;3430:271:1:o;3802:1085::-;4164:4;4193:3;4223:2;4212:9;4205:21;4249:45;4290:2;4279:9;4275:18;4267:6;4249:45;:::i;:::-;4235:59;;4342:9;4334:6;4330:22;4325:2;4314:9;4310:18;4303:50;4376:33;4402:6;4394;4376:33;:::i;:::-;4362:47;;4457:9;4449:6;4445:22;4440:2;4429:9;4425:18;4418:50;4491:33;4517:6;4509;4491:33;:::i;:::-;4477:47;;4572:9;4564:6;4560:22;4555:2;4544:9;4540:18;4533:50;4600:33;4626:6;4618;4600:33;:::i;:::-;4664:3;4649:19;;4642:35;;;;-1:-1:-1;;;;;;;4752:15:1;;;4704:3;4731:19;;4724:44;4805:15;;;;4799:3;4784:19;;4777:44;4865:14;;4858:22;4852:3;4837:19;;;4830:51;4592:41;3802:1085;-1:-1:-1;;;;3802:1085:1:o;4892:2110::-;5088:4;5117:2;5157;5146:9;5142:18;5187:2;5176:9;5169:21;5210:6;5245;5239:13;5276:6;5268;5261:22;5302:2;5292:12;;5335:2;5324:9;5320:18;5313:25;;5397:2;5387:6;5384:1;5380:14;5369:9;5365:30;5361:39;5435:2;5427:6;5423:15;5456:1;5466:1507;5480:6;5477:1;5474:13;5466:1507;;;5573:2;5569:7;5557:9;5549:6;5545:22;5541:36;5536:3;5529:49;5607:6;5601:13;5637:6;5682:2;5676:9;5713:2;5705:6;5698:18;5743:48;5787:2;5779:6;5775:15;5761:12;5743:48;:::i;:::-;5729:62;;;5840:2;5836;5832:11;5826:18;5893:6;5885;5881:19;5876:2;5868:6;5864:15;5857:44;5928:41;5962:6;5946:14;5928:41;:::i;:::-;5914:55;;;6018:2;6014;6010:11;6004:18;6071:6;6063;6059:19;6054:2;6046:6;6042:15;6035:44;6106:41;6140:6;6124:14;6106:41;:::i;:::-;6092:55;;;6170:4;6223:2;6219;6215:11;6209:18;6276:6;6268;6264:19;6259:2;6251:6;6247:15;6240:44;6311:41;6345:6;6329:14;6311:41;:::i;:::-;6297:55;;;;6375:4;6430:2;6426;6422:11;6416:18;6411:2;6403:6;6399:15;6392:43;;6458:4;6511:2;6507;6503:11;6497:18;6528:51;6575:2;6567:6;6563:15;6547:14;-1:-1:-1;;;;;1885:31:1;1873:44;;1819:104;6528:51;-1:-1:-1;;6602:4:1;6647:11;;;6641:18;-1:-1:-1;;;;;1885:31:1;6707:15;;;1873:44;6746:4;6791:11;;;6785:18;3776:13;3769:21;6848:15;;;;3757:34;6951:12;;;;6916:15;;;;5502:1;5495:9;5466:1507;;;-1:-1:-1;6990:6:1;;4892:2110;-1:-1:-1;;;;;;;;4892:2110:1:o;7007:248::-;7075:6;7083;7136:2;7124:9;7115:7;7111:23;7107:32;7104:52;;;7152:1;7149;7142:12;7104:52;-1:-1:-1;;7175:23:1;;;7245:2;7230:18;;;7217:32;;-1:-1:-1;7007:248:1:o;7260:323::-;7328:6;7336;7389:2;7377:9;7368:7;7364:23;7360:32;7357:52;;;7405:1;7402;7395:12;7357:52;7444:9;7431:23;7463:39;7496:5;7463:39;:::i;:::-;7521:5;7573:2;7558:18;;;;7545:32;;-1:-1:-1;;;7260:323:1:o;7588:355::-;7790:2;7772:21;;;7829:2;7809:18;;;7802:30;7868:33;7863:2;7848:18;;7841:61;7934:2;7919:18;;7588:355::o;8298:127::-;8359:10;8354:3;8350:20;8347:1;8340:31;8390:4;8387:1;8380:15;8414:4;8411:1;8404:15;8430:125;8495:9;;;8516:10;;;8513:36;;;8529:18;;:::i;8560:168::-;8633:9;;;8664;;8681:15;;;8675:22;;8661:37;8651:71;;8702:18;;:::i;8733:217::-;8773:1;8799;8789:132;;8843:10;8838:3;8834:20;8831:1;8824:31;8878:4;8875:1;8868:15;8906:4;8903:1;8896:15;8789:132;-1:-1:-1;8935:9:1;;8733:217::o;8955:527::-;9208:3;9197:9;9190:22;9171:4;9235:46;9276:3;9265:9;9261:19;9253:6;9235:46;:::i;:::-;9329:9;9321:6;9317:22;9312:2;9301:9;9297:18;9290:50;9357:33;9383:6;9375;9357:33;:::i;:::-;9421:2;9406:18;;9399:34;;;;-1:-1:-1;;9464:2:1;9449:18;9442:34;9349:41;8955:527;-1:-1:-1;;8955:527:1:o;9487:380::-;9566:1;9562:12;;;;9609;;;9630:61;;9684:4;9676:6;9672:17;9662:27;;9630:61;9737:2;9729:6;9726:14;9706:18;9703:38;9700:161;;9783:10;9778:3;9774:20;9771:1;9764:31;9818:4;9815:1;9808:15;9846:4;9843:1;9836:15;9700:161;;9487:380;;;:::o;9998:518::-;10100:2;10095:3;10092:11;10089:421;;;10136:5;10133:1;10126:16;10180:4;10177:1;10167:18;10250:2;10238:10;10234:19;10231:1;10227:27;10221:4;10217:38;10286:4;10274:10;10271:20;10268:47;;;-1:-1:-1;10309:4:1;10268:47;10364:2;10359:3;10355:12;10352:1;10348:20;10342:4;10338:31;10328:41;;10419:81;10437:2;10430:5;10427:13;10419:81;;;10496:1;10482:16;;10463:1;10452:13;10419:81;;;10423:3;;10089:421;9998:518;;;:::o;10692:1345::-;10818:3;10812:10;10845:18;10837:6;10834:30;10831:56;;;10867:18;;:::i;:::-;10896:97;10986:6;10946:38;10978:4;10972:11;10946:38;:::i;:::-;10940:4;10896:97;:::i;:::-;11048:4;;11105:2;11094:14;;11122:1;11117:663;;;;11824:1;11841:6;11838:89;;;-1:-1:-1;11893:19:1;;;11887:26;11838:89;-1:-1:-1;;10649:1:1;10645:11;;;10641:24;10637:29;10627:40;10673:1;10669:11;;;10624:57;11940:81;;11087:944;;11117:663;9945:1;9938:14;;;9982:4;9969:18;;-1:-1:-1;;11153:20:1;;;11271:236;11285:7;11282:1;11279:14;11271:236;;;11374:19;;;11368:26;11353:42;;11466:27;;;;11434:1;11422:14;;;;11301:19;;11271:236;;;11275:3;11535:6;11526:7;11523:19;11520:201;;;11596:19;;;11590:26;-1:-1:-1;;11679:1:1;11675:14;;;11691:3;11671:24;11667:37;11663:42;11648:58;11633:74;;11520:201;;;11767:1;11758:6;11755:1;11751:14;11747:22;11741:4;11734:36;11087:944;;;;;10692:1345;;:::o;12042:332::-;12244:2;12226:21;;;12283:1;12263:18;;;12256:29;-1:-1:-1;;;12316:2:1;12301:18;;12294:39;12365:2;12350:18;;12042:332::o;13943:127::-;14004:10;13999:3;13995:20;13992:1;13985:31;14035:4;14032:1;14025:15;14059:4;14056:1;14049:15;14075:128;14142:9;;;14163:11;;;14160:37;;;14177:18;;:::i;14208:337::-;14410:2;14392:21;;;14449:2;14429:18;;;14422:30;-1:-1:-1;;;14483:2:1;14468:18;;14461:43;14536:2;14521:18;;14208:337::o;14900:184::-;14970:6;15023:2;15011:9;15002:7;14998:23;14994:32;14991:52;;;15039:1;15036;15029:12;14991:52;-1:-1:-1;15062:16:1;;14900:184;-1:-1:-1;14900:184:1:o;18036:287::-;18165:3;18203:6;18197:13;18219:66;18278:6;18273:3;18266:4;18258:6;18254:17;18219:66;:::i;:::-;18301:16;;;;;18036:287;-1:-1:-1;;18036:287:1:o;18328:135::-;18367:3;18388:17;;;18385:43;;18408:18;;:::i;:::-;-1:-1:-1;18455:1:1;18444:13;;18328:135::o;18810:259::-;18880:6;18933:2;18921:9;18912:7;18908:23;18904:32;18901:52;;;18949:1;18946;18939:12;18901:52;18981:9;18975:16;19000:39;19033:5;19000:39;:::i;20013:277::-;20080:6;20133:2;20121:9;20112:7;20108:23;20104:32;20101:52;;;20149:1;20146;20139:12;20101:52;20181:9;20175:16;20234:5;20227:13;20220:21;20213:5;20210:32;20200:60;;20256:1;20253;20246:12;20891:306;20979:6;20987;20995;21048:2;21036:9;21027:7;21023:23;21019:32;21016:52;;;21064:1;21061;21054:12;21016:52;21093:9;21087:16;21077:26;;21143:2;21132:9;21128:18;21122:25;21112:35;;21187:2;21176:9;21172:18;21166:25;21156:35;;20891:306;;;;;:::o

Swarm Source

ipfs://29156ae512a301067255d9bf673ac5dca48f136043023e4fc5eaaed557762f8a

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.