Contract 0x7a3909c7996efe42d425cd932fc44e3840fcab71 1

DeFi  

Contract Overview

Zenlink: Router
Balance:
0 GLMR

GLMR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x74828454b837a61e9cf3cdf4ed2104a032c513752fb8402613f700dfffe82f8cSwap Exact Token...20079962022-10-04 18:13:4712 hrs 7 mins ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.02016004032
0x900cb030cf77821f1e711ef4c5517552d47b88a32c56d0a85c5483c1e3b7c3d5Swap Exact ETH F...18648982022-09-14 9:14:0020 days 21 hrs ago0xeae788491e8f72942b7d92c00218ed5f3ea6666a IN  Zenlink: Router100 GLMR0.0034554
0x836478ed3d117a95265eee2795bf0154e311ec81a366b3563e20dcd07218c5e5Swap Exact Token...18324562022-09-09 16:41:3025 days 13 hrs ago0x65bab4f268286b9005d6053a177948dddc29bad3 IN  Zenlink: Router0 GLMR0.011928023856
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5efRemove Liquidity...17738112022-09-01 5:05:4834 days 1 hr ago0xe3dff97e14f3a55228ed2f614114bf6b27a7677b IN  Zenlink: Router0 GLMR0.022535676
0x1cc0e1a5f34895bd6a67215ace8cb585c44a88bca23a175f9bee351bc54827d5Add Liquidity Na...17533052022-08-29 6:28:4836 days 23 hrs ago0x4756c4d5aaefcb4f52f54d20f6b17376c9efe62f IN  Zenlink: Router0.000089653285373 GLMR0.018281154
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f1Add Liquidity Na...17520432022-08-29 2:09:0637 days 4 hrs ago0x4756c4d5aaefcb4f52f54d20f6b17376c9efe62f IN  Zenlink: Router0.1 GLMR0.019602054
0xc6a876fbfe91cf91419ad42c2ae6cc5abe202067a19e937317d9c3409a16f823Remove Liquidity17421132022-08-27 15:59:5438 days 14 hrs ago0xbf92620478dd964cac8e0d8d98bf3336727f4982 IN  Zenlink: Router0 GLMR0.024110513
0xfacfd8f90821e8647732586ceb03721e092e7797e964725a8e3f89d77615fd4bRemove Liquidity17421052022-08-27 15:58:1838 days 14 hrs ago0xbf92620478dd964cac8e0d8d98bf3336727f4982 IN  Zenlink: Router0 GLMR0.024229284
0x9ba9d49d27b3cbaebb5a36938d64fd315ff68a5b8e04ce36c4098df90336a6f1Swap Exact Nativ...17228632022-08-24 21:37:1841 days 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router234 GLMR0.19892873
0x80486d20ecd3ca286af430db738fef61e55a43be6aebc3448d2b336bbdbf6a2cSwap Exact Nativ...17228572022-08-24 21:36:0641 days 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router240 GLMR0.19892873
0xd5c796ceb3ae35feec33f7339387e396d3c623d47fda4d96698f6324659c6017Swap Exact Nativ...17228572022-08-24 21:36:0641 days 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router120 GLMR0.19892873
0x667fffecf38eb2cfa4aad17d77ece12fe45305bff355efd6b57d92bcdfb3556dSwap Exact Nativ...17228562022-08-24 21:35:5441 days 8 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router117 GLMR0.19892873
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8aSwap Exact Token...17166652022-08-24 0:25:1842 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4bSwap Exact Token...17166632022-08-24 0:24:4842 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xce09a86da48ee3ddef67a4d1e90d9df3e0f17cac716a38e7f9d69e6e487c37ecSwap Exact Token...17166632022-08-24 0:24:4842 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0x5e65690709e0414dae804e67510f7a0f5214585745a02bb7ddeabc752ad0325fSwap Exact Token...17166602022-08-24 0:24:0642 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0x79a0768cd50a838d6a2afb54dbde25ab0b6942a893d48a3aab5e7982ddadfcfcSwap Exact Token...17166582022-08-24 0:23:4242 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xf6e89c25b7e26cd9695ca9a833d99fda030c6ff4cba75674591342a051cfb290Swap Exact Token...17166572022-08-24 0:23:3042 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xbd988915f544acf27a9e4fd2cf83ac12ef3f0f9659c6e8f51a548f2b0dde9439Swap Exact Token...17166552022-08-24 0:23:0042 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xe94fbcf0ec2f724e0f1c1f84f12e19355d53e902014fd73ac37574a16c756bf2Swap Exact Token...17166522022-08-24 0:22:2442 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xcdd66117c339b0fa0349a77617ce246027735d6b3bef6b01af091235fd8ba898Swap Exact Token...17166522022-08-24 0:22:2442 days 5 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xa586398d0eea4b8f03bc2adcb8e48c7e4b80ada886298b5422fa6f63f0ad77d7Swap Exact Token...17162462022-08-23 22:57:3642 days 7 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218250998
0x53295f680f9a37bfdbd573daaa7c509c0d226292e4cd334dc517d4583c4d2576Swap Exact Token...17162442022-08-23 22:57:1242 days 7 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.218234338
0xcb08d5645703cc9f877cfda18647558423cf212defd355806a768f5c5d4100a8Swap Exact Token...17162442022-08-23 22:57:1242 days 7 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router0 GLMR0.071316462
0x6a7f126ef08908bcd292e232296aade0221d47654b919c689983129099de4c10Swap Exact Nativ...17124262022-08-23 9:53:3642 days 20 hrs ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Router153 GLMR0.19892873
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:244 days 11 hrs ago Zenlink: Router0xe73b6f11b3afdbf5d1a1c91ceb8af9e544ca114b14.336890666785039732 GLMR
0xfa23e14e8ad00b244a3d644486ee735c502f85ed7193ed9089cc41cc52da689719800192022-09-30 19:13:244 days 11 hrs ago Moonbeam: WGLMR Token Zenlink: Router14.336890666785039732 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:4834 days 1 hr ago Zenlink: Router0xe3dff97e14f3a55228ed2f614114bf6b27a7677b3.720644933623444225 GLMR
0x7c386e31771f5b9e2d5762dcfc065057a888fae3ad570756287b71598655e5ef17738112022-09-01 5:05:4834 days 1 hr ago Moonbeam: WGLMR Token Zenlink: Router3.720644933623444225 GLMR
0x1cc0e1a5f34895bd6a67215ace8cb585c44a88bca23a175f9bee351bc54827d517533052022-08-29 6:28:4836 days 23 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:0637 days 4 hrs ago Zenlink: Router0x4756c4d5aaefcb4f52f54d20f6b17376c9efe62f0.099910346714626494 GLMR
0xb7372b8c671c55ade324af1757466e9d7b31d696f6c1c2ad39fb3d51c054c8f117520432022-08-29 2:09:0637 days 4 hrs ago Zenlink: Router Moonbeam: WGLMR Token0.000089653285373506 GLMR
0x9ba9d49d27b3cbaebb5a36938d64fd315ff68a5b8e04ce36c4098df90336a6f117228632022-08-24 21:37:1841 days 8 hrs ago Zenlink: Router Moonbeam: WGLMR Token234 GLMR
0x80486d20ecd3ca286af430db738fef61e55a43be6aebc3448d2b336bbdbf6a2c17228572022-08-24 21:36:0641 days 8 hrs ago Zenlink: Router Moonbeam: WGLMR Token240 GLMR
0xd5c796ceb3ae35feec33f7339387e396d3c623d47fda4d96698f6324659c601717228572022-08-24 21:36:0641 days 8 hrs ago Zenlink: Router Moonbeam: WGLMR Token120 GLMR
0x667fffecf38eb2cfa4aad17d77ece12fe45305bff355efd6b57d92bcdfb3556d17228562022-08-24 21:35:5441 days 8 hrs ago Zenlink: Router Moonbeam: WGLMR Token117 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:1842 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.642335377462389711 GLMR
0xc343052a6063dddb1a1805e95fb9836fc5db7215ec503b983f8831f41fda3a8a17166652022-08-24 0:25:1842 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router130.642335377462389711 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:4842 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a130.90692433616006858 GLMR
0x3dce461f9e3e231e400b6491c73c893c788ccf107b808d2688f0792be1127f4b17166632022-08-24 0:24:4842 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router130.90692433616006858 GLMR
0xce09a86da48ee3ddef67a4d1e90d9df3e0f17cac716a38e7f9d69e6e487c37ec17166632022-08-24 0:24:4842 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a131.57683310213217163 GLMR
0xce09a86da48ee3ddef67a4d1e90d9df3e0f17cac716a38e7f9d69e6e487c37ec17166632022-08-24 0:24:4842 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router131.57683310213217163 GLMR
0x5e65690709e0414dae804e67510f7a0f5214585745a02bb7ddeabc752ad0325f17166602022-08-24 0:24:0642 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a131.030830668330506229 GLMR
0x5e65690709e0414dae804e67510f7a0f5214585745a02bb7ddeabc752ad0325f17166602022-08-24 0:24:0642 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router131.030830668330506229 GLMR
0x79a0768cd50a838d6a2afb54dbde25ab0b6942a893d48a3aab5e7982ddadfcfc17166582022-08-24 0:23:4242 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a131.614769828714455213 GLMR
0x79a0768cd50a838d6a2afb54dbde25ab0b6942a893d48a3aab5e7982ddadfcfc17166582022-08-24 0:23:4242 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router131.614769828714455213 GLMR
0xf6e89c25b7e26cd9695ca9a833d99fda030c6ff4cba75674591342a051cfb29017166572022-08-24 0:23:3042 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a132.511171882244685867 GLMR
0xf6e89c25b7e26cd9695ca9a833d99fda030c6ff4cba75674591342a051cfb29017166572022-08-24 0:23:3042 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router132.511171882244685867 GLMR
0xbd988915f544acf27a9e4fd2cf83ac12ef3f0f9659c6e8f51a548f2b0dde943917166552022-08-24 0:23:0042 days 5 hrs ago Zenlink: Router0xe1fa699860444be91d366c21de8fef56e3dec77a132.003688946838383541 GLMR
0xbd988915f544acf27a9e4fd2cf83ac12ef3f0f9659c6e8f51a548f2b0dde943917166552022-08-24 0:23:0042 days 5 hrs ago Moonbeam: WGLMR Token Zenlink: Router132.003688946838383541 GLMR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-02-04
*/

// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function initialize(address, address) external;
}

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
}

// File: contracts/libraries/Helper.sol



pragma solidity >=0.8.0;




library Helper {
    using Math for uint256;

    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "Helper: ZERO_ADDRESS");
    }

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return IFactory(factory).getPair(tokenA, tokenB);
    }

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1) = IPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper::transferFrom: transferFrom failed"
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper::safeTransfer: transfer failed"
        );
    }

    function safeTransferNativeCurrency(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
        );
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i],
                path[i + 1]
            );
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/periphery/interfaces/IWNativeCurrency.sol



pragma solidity >=0.8.0;

interface IWNativeCurrency {
    function deposit() external payable;

    function withdraw(uint256) external;
}

// File: contracts/periphery/interfaces/IRouter.sol



pragma solidity >=0.8.0;

interface IRouter {
    function factory() external view returns (address);

    function WNativeCurrency() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapIn,
        uint256 amountSwapOutMin,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 liquidity
        );

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function addLiquiditySingleNativeCurrency(
        address[] calldata path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountNativeCurrency);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/periphery/Router.sol



pragma solidity >=0.8.0;






contract Router is IRouter {
    using Math for uint256;

    address public override factory;
    address public override WNativeCurrency;

    constructor(address _factory, address _WNativeCurrency) {
        factory = _factory;
        WNativeCurrency = _WNativeCurrency;
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "Router: EXPIRED");
        _;
    }

    receive() external payable {
        require(msg.sender == WNativeCurrency); // only accept Native Currency via fallback from the WNativeCurrency contract
    }

    function addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (
            uint256 amount0,
            uint256 amount1,
            uint256 liquidity
        )
    {
        (amount0, amount1) = _addLiquidity(
            token0,
            token1,
            amount0Desired,
            amount1Desired,
            amount0Min,
            amount1Min
        );
        address pair = Helper.pairFor(factory, token0, token1);
        Helper.safeTransferFrom(token0, msg.sender, pair, amount0);
        Helper.safeTransferFrom(token1, msg.sender, pair, amount1);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapOut,
        uint256 amountSwapInMax,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 liquidity) {
        address token0 = path[0];
        address token1 = path[path.length - 1];

        uint256[] memory amounts = swapTokensForExactTokens(
            amountSwapOut,
            amountSwapInMax,
            path,
            to,
            deadline
        );

        uint256 amountInReserve = amountIn - amounts[0];
        (, , liquidity) = addLiquidity(
            token1,
            token0,
            amounts[amounts.length - 1],
            amountInReserve,
            amounts[amounts.length - 1],
            amountInReserveMin,
            to,
            deadline
        );
    }

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountNativeCurrencyMin
        );
        address pair = Helper.pairFor(factory, token, WNativeCurrency);
        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();
        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));
        liquidity = IPair(pair).mint(to);
        if (msg.value > amountNativeCurrency)
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amountNativeCurrency
            ); // refund dust native currency, if any
    }

    function addLiquiditySingleNativeCurrency(
        address[] memory path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        // Swap
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        uint256[] memory amounts = Helper.getAmountsIn(
            factory,
            amountSwapOut,
            path
        );

        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();

        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );

        _swap(amounts, path, to);

        require(
            amounts[0] <= nativeCurrencySwapInMax,
            "not allow bigger than nativeCurrencySwapInMax"
        );

        // Addliquidity
        address token = path[path.length - 1];
        uint256 nativeCurrencyReserve = msg.value - amounts[0];
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amounts[amounts.length - 1],
            nativeCurrencyReserve,
            amounts[amounts.length - 1],
            nativeCurrencyReserveMin
        );

        address pair = Helper.pairFor(factory, token, WNativeCurrency);

        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);

        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();

        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));

        liquidity = IPair(pair).mint(to);

        if (msg.value > (amountNativeCurrency + amounts[0]))
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - (amountNativeCurrency + amounts[0])
            ); // refund dust native currency, if any
    }

    function _addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min
    ) private returns (uint256 amount0, uint256 amount1) {
        if (IFactory(factory).getPair(token0, token1) == address(0)) {
            IFactory(factory).createPair(token0, token1);
        }
        (uint256 reserve0, uint256 reserve1) = Helper.getReserves(
            factory,
            token0,
            token1
        );
        if (reserve0 == 0 && reserve1 == 0) {
            (amount0, amount1) = (amount0Desired, amount1Desired);
        } else {
            uint256 amount1Optimal = Helper.quote(
                amount0Desired,
                reserve0,
                reserve1
            );
            if (amount1Optimal <= amount1Desired) {
                require(
                    amount1Optimal >= amount1Min,
                    "Router: INSUFFICIENT_1_AMOUNT"
                );
                (amount0, amount1) = (amount0Desired, amount1Optimal);
            } else {
                uint256 amount0Optimal = Helper.quote(
                    amount1Desired,
                    reserve1,
                    reserve0
                );
                require(amount0Optimal <= amount0Desired);
                require(
                    amount0Optimal >= amount0Min,
                    "Router: INSUFFICIENT_0_AMOUNT"
                );
                (amount0, amount1) = (amount0Optimal, amount1Desired);
            }
        }
    }

    function removeLiquidity(
        address token0,
        address token1,
        uint256 liquidity,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amount0, uint256 amount1)
    {
        address pair = Helper.pairFor(factory, token0, token1);
        IERC20(pair).transferFrom(msg.sender, pair, liquidity);
        (uint256 amountA, uint256 amountB) = IPair(pair).burn(to);
        (address tokenA, ) = Helper.sortTokens(token0, token1);
        (amount0, amount1) = tokenA == token0
            ? (amountA, amountB)
            : (amountB, amountA);
        require(amount0 >= amount0Min, "Router: INSUFFICIENT_0_AMOUNT");
        require(amount1 >= amount1Min, "Router: INSUFFICIENT_1_AMOUNT");
    }

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountNativeCurrency)
    {
        (amountToken, amountNativeCurrency) = removeLiquidity(
            token,
            WNativeCurrency,
            liquidity,
            amountTokenMin,
            amountNativeCurrencyMin,
            address(this),
            deadline
        );
        Helper.safeTransfer(token, to, amountToken);
        IWNativeCurrency(WNativeCurrency).withdraw(amountNativeCurrency);
        Helper.safeTransferNativeCurrency(to, amountNativeCurrency);
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) private {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = Helper.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2
                ? Helper.pairFor(factory, output, path[i + 2])
                : _to;
            IPair(Helper.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "Router: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        if (msg.value > amounts[0])
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amounts[0]
            ); // refund dust eth, if any
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountOut) {
        return Helper.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure override returns (uint256 amountIn) {
        return Helper.getAmountOut(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path)
        public
        view
        override
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path)
        public
        view
        override
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsIn(factory, amountOut, path);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencySwapInMax","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencyReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"amountSwapInMax","type":"uint256"},{"internalType":"uint256","name":"amountInReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleToken","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200353138038062003531833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61346680620000cb6000396000f3fe60806040526004361061010d5760003560e01c80639be7614d11610095578063cd1bd0d911610064578063cd1bd0d9146102f1578063d06ca61f14610304578063dcff1b9414610324578063e8e3370014610344578063f85b7c8b1461036457600080fd5b80639be7614d1461027e578063b1ea829214610291578063baa2abde146102b1578063c45a0155146102d157600080fd5b8063419591ed116100dc578063419591ed146101e5578063686589671461021d57806385f8c259146101305780638803dbee1461024b578063937ca0da1461026b57600080fd5b8063054d50d4146101305780631f00ca741461016357806338ed173914610190578063403bf1f2146101b057600080fd5b3661012b576001546001600160a01b0316331461012957600080fd5b005b600080fd5b34801561013c57600080fd5b5061015061014b3660046131b9565b610384565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061018361017e3660046130db565b610399565b60405161015a9190613220565b34801561019c57600080fd5b506101836101ab366004613146565b6103bc565b3480156101bc57600080fd5b506101d06101cb366004612ebf565b610576565b6040805192835260208301919091520161015a565b3480156101f157600080fd5b50600154610205906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b61023061022b366004612fa4565b61063a565b6040805193845260208401929092529082015260600161015a565b34801561025757600080fd5b50610183610266366004613146565b610c05565b610230610279366004612ebf565b610cae565b61018361028c366004613074565b610ebd565b34801561029d57600080fd5b506101506102ac366004612f1d565b6111c8565b3480156102bd57600080fd5b506101d06102cc366004612dd1565b6112fe565b3480156102dd57600080fd5b50600054610205906001600160a01b031681565b6101836102ff366004613074565b61152f565b34801561031057600080fd5b5061018361031f3660046130db565b6117c8565b34801561033057600080fd5b5061018361033f366004613146565b6117e2565b34801561035057600080fd5b5061023061035f366004612e43565b611a0d565b34801561037057600080fd5b5061018361037f366004613146565b611b07565b6000610391848484611c16565b949350505050565b6000546060906103b3906001600160a01b03168484611d1a565b90505b92915050565b606081428110156103e85760405162461bcd60e51b81526004016103df906132c9565b60405180910390fd5b6000546040805160208089028281018201909352888252610432936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451610444919061338d565b81518110610454576104546133ec565b6020026020010151101561047a5760405162461bcd60e51b81526004016103df906132f2565b61052c86866000818110610490576104906133ec565b90506020020160208101906104a59190612d90565b60008054339161050c916001600160a01b0316908b908b90816104ca576104ca6133ec565b90506020020160208101906104df9190612d90565b8b8b60018181106104f2576104f26133ec565b90506020020160208101906105079190612d90565b612014565b8560008151811061051f5761051f6133ec565b6020026020010151612099565b61056b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b509695505050505050565b600080824281101561059a5760405162461bcd60e51b81526004016103df906132c9565b6001546105b6908a906001600160a01b03168a8a8a308a6112fe565b90935091506105c6898685612387565b600154604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561060c57600080fd5b505af1158015610620573d6000803e3d6000fd5b5050505061062e85836124b8565b50965096945050505050565b600080600083428110156106605760405162461bcd60e51b81526004016103df906132c9565b6001548a516001600160a01b03909116908b90600090610682576106826133ec565b60200260200101516001600160a01b0316146106b05760405162461bcd60e51b81526004016103df90613264565b600080546106c8906001600160a01b03168b8d611d1a565b905034816000815181106106de576106de6133ec565b602002602001015111156107045760405162461bcd60e51b81526004016103df90613292565b60015481516001600160a01b039091169063d0e30db090839060009061072c5761072c6133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b5050505050600160009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb6107ee60008054906101000a90046001600160a01b03168e6000815181106107c6576107c66133ec565b60200260200101518f6001815181106107e1576107e16133ec565b6020026020010151612014565b83600081518110610801576108016133ec565b60200260200101516040518363ffffffff1660e01b815260040161083a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190613006565b61089557600080fd5b6108a0818c896121d7565b88816000815181106108b4576108b46133ec565b602002602001015111156109205760405162461bcd60e51b815260206004820152602d60248201527f6e6f7420616c6c6f7720626967676572207468616e206e61746976654375727260448201526c0cadcc6f2a6eec2e092dc9ac2f609b1b60648201526084016103df565b60008b60018d51610931919061338d565b81518110610941576109416133ec565b60200260200101519050600082600081518110610960576109606133ec565b602002602001015134610973919061338d565b90506109e482600160009054906101000a90046001600160a01b0316856001875161099e919061338d565b815181106109ae576109ae6133ec565b60200260200101518487600189516109c6919061338d565b815181106109d6576109d66133ec565b60200260200101518f6125b3565b60008054600154939a5091985091610a0a916001600160a01b0390811691869116612014565b9050610a188333838b612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018d9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190613006565b610b1157600080fd5b6040516335313c2160e11b81526001600160a01b038b81166004830152821690636a62784290602401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c919061305b565b955083600081518110610ba157610ba16133ec565b602002602001015187610bb49190613334565b341115610bf457610bf43385600081518110610bd257610bd26133ec565b602002602001015189610be59190613334565b610bef903461338d565b6124b8565b505050505096509650969350505050565b60608142811015610c285760405162461bcd60e51b81526004016103df906132c9565b6000546040805160208089028281018201909352888252610c72936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110610c8857610c886133ec565b6020026020010151111561047a5760405162461bcd60e51b81526004016103df90613292565b60008060008342811015610cd45760405162461bcd60e51b81526004016103df906132c9565b600154610cef908b906001600160a01b03168b348c8c6125b3565b6000805460015493975091955091610d15916001600160a01b03908116918e9116612014565b9050610d238b338388612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190613006565b610e1c57600080fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e97919061305b565b925083341115610eaf57610eaf33610bef863461338d565b505096509650969350505050565b60608142811015610ee05760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b03168686600081610efd57610efd6133ec565b9050602002016020810190610f129190612d90565b6001600160a01b031614610f385760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252610f82936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91503482600081518110610f9857610f986133ec565b60200260200101511115610fbe5760405162461bcd60e51b81526004016103df90613292565b60015482516001600160a01b039091169063d0e30db0908490600090610fe657610fe66133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb945061108c9350909116908a908a9081611064576110646133ec565b90506020020160208101906110799190612d90565b8a8a60018181106104f2576104f26133ec565b8460008151811061109f5761109f6133ec565b60200260200101516040518363ffffffff1660e01b81526004016110d89291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110f257600080fd5b505af1158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a9190613006565b61113357600080fd5b611172828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b81600081518110611185576111856133ec565b60200260200101513411156111be576111be33836000815181106111ab576111ab6133ec565b602002602001015134610bef919061338d565b5095945050505050565b600081428110156111eb5760405162461bcd60e51b81526004016103df906132c9565b60008a8a6000818110611200576112006133ec565b90506020020160208101906112159190612d90565b905060008b8b61122660018261338d565b818110611235576112356133ec565b905060200201602081019061124a9190612d90565b9050600061125c8a8a8f8f8b8b610c05565b9050600081600081518110611273576112736133ec565b60200260200101518c611286919061338d565b90506112e48385846001865161129c919061338d565b815181106112ac576112ac6133ec565b60200260200101518486600188516112c4919061338d565b815181106112d4576112d46133ec565b60200260200101518e8e8e611a0d565b909150905080965050505050505098975050505050505050565b60008082428110156113225760405162461bcd60e51b81526004016103df906132c9565b6000805461133a906001600160a01b03168c8c612014565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613006565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190613122565b9150915060006114538e8e612802565b5090508d6001600160a01b0316816001600160a01b031614611476578183611479565b82825b90975095508a8710156114ce5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b8986101561151e5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b505050505097509795505050505050565b606081428110156115525760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b0316868660008161156f5761156f6133ec565b90506020020160208101906115849190612d90565b6001600160a01b0316146115aa5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526115f4936001600160a01b0316923492918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451611606919061338d565b81518110611616576116166133ec565b6020026020010151101561163c5760405162461bcd60e51b81526004016103df906132f2565b60015482516001600160a01b039091169063d0e30db0908490600090611664576116646133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506116e29350909116908a908a9081611064576110646133ec565b846000815181106116f5576116f56133ec565b60200260200101516040518363ffffffff1660e01b815260040161172e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190613006565b61178957600080fd5b6111be828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b6000546060906103b3906001600160a01b03168484611ea7565b606081428110156118055760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611821908261338d565b818110611830576118306133ec565b90506020020160208101906118459190612d90565b6001600160a01b03161461186b5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526118b5936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b91508682600184516118c7919061338d565b815181106118d7576118d76133ec565b602002602001015110156118fd5760405162461bcd60e51b81526004016103df906132f2565b61191386866000818110610490576104906133ec565b611952828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506121d7915050565b6001805483516001600160a01b0390911691632e1a7d4d9185916119759161338d565b81518110611985576119856133ec565b60200260200101516040518263ffffffff1660e01b81526004016119ab91815260200190565b600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b5050505061056b8483600185516119f0919061338d565b81518110611a0057611a006133ec565b60200260200101516124b8565b60008060008342811015611a335760405162461bcd60e51b81526004016103df906132c9565b611a418c8c8c8c8c8c6125b3565b6000805492965090945090611a60906001600160a01b03168e8e612014565b9050611a6e8d338388612099565b611a7a8c338387612099565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061305b565b92505050985098509895505050505050565b60608142811015611b2a5760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611b46908261338d565b818110611b5557611b556133ec565b9050602002016020810190611b6a9190612d90565b6001600160a01b031614611b905760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252611bda936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110611bf057611bf06133ec565b602002602001015111156118fd5760405162461bcd60e51b81526004016103df90613292565b6000808411611c715760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b60648201526084016103df565b600083118015611c815750600082115b611ccd5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000611cdb856103e56128e3565b90506000611ce982856128e3565b90506000611d0383611cfd886103e86128e3565b9061294a565b9050611d0f818361334c565b979650505050505050565b6060600282511015611d655760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611d7f57611d7f613402565b604051908082528060200260200182016040528015611da8578160200160208202803683370190505b509050828160018351611dbb919061338d565b81518110611dcb57611dcb6133ec565b602002602001018181525050600060018351611de7919061338d565b90505b8015611e9f57600080611e3a8786611e0360018761338d565b81518110611e1357611e136133ec565b6020026020010151878681518110611e2d57611e2d6133ec565b602002602001015161299f565b91509150611e62848481518110611e5357611e536133ec565b60200260200101518383612a76565b84611e6e60018661338d565b81518110611e7e57611e7e6133ec565b60200260200101818152505050508080611e97906133a4565b915050611dea565b509392505050565b6060600282511015611ef25760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611f0c57611f0c613402565b604051908082528060200260200182016040528015611f35578160200160208202803683370190505b5090508281600081518110611f4c57611f4c6133ec565b60200260200101818152505060005b60018351611f69919061338d565b811015611e9f57600080611faf87868581518110611f8957611f896133ec565b602002602001015187866001611f9f9190613334565b81518110611e2d57611e2d6133ec565b91509150611fd7848481518110611fc857611fc86133ec565b60200260200101518383611c16565b84611fe3856001613334565b81518110611ff357611ff36133ec565b6020026020010181815250505050808061200c906133bb565b915050611f5b565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190612db4565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916120fd91906131e5565b6000604051808303816000865af19150503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b50915091508180156121695750805115806121695750808060200190518101906121699190613006565b6121cf5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016103df565b505050505050565b60005b600183516121e8919061338d565b81101561238157600080848381518110612204576122046133ec565b60200260200101518584600161221a9190613334565b8151811061222a5761222a6133ec565b60200260200101519150915060006122428383612802565b509050600087612253866001613334565b81518110612263576122636133ec565b60200260200101519050600080836001600160a01b0316866001600160a01b03161461229157826000612295565b6000835b91509150600060028a516122a9919061338d565b88106122b557886122e2565b6000546122e2906001600160a01b0316878c6122d28c6002613334565b815181106107e1576107e16133ec565b6000549091506122fc906001600160a01b03168888612014565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b50505050505050505050508080612379906133bb565b9150506121da565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123e391906131e5565b6000604051808303816000865af19150503d8060008114612420576040519150601f19603f3d011682016040523d82523d6000602084013e612425565b606091505b509150915081801561244f57508051158061244f57508080602001905181019061244f9190613006565b6124b15760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016103df565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516124e291906131e5565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b50509050806125ae5760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a4016103df565b505050565b6000805460405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301528392839291169063e6a439059060440160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612db4565b6001600160a01b031614156126d4576000546040516364e329cb60e11b81526001600160a01b038a8116600483015289811660248301529091169063c9c6539690604401602060405180830381600087803b15801561269a57600080fd5b505af11580156126ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d29190612db4565b505b6000805481906126ee906001600160a01b03168b8b61299f565b91509150816000148015612700575080155b15612710578793508692506127f5565b600061271d898484612b75565b905087811161278157858110156127765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b8894509250826127f3565b600061278e898486612b75565b90508981111561279d57600080fd5b878110156127ed5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b94508793505b505b5050965096945050505050565b600080826001600160a01b0316846001600160a01b031614156128675760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f414444524553534553000000000060448201526064016103df565b826001600160a01b0316846001600160a01b03161061288757828461288a565b83835b90925090506001600160a01b0382166128dc5760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b60448201526064016103df565b9250929050565b6000811580612907575082826128f9818361336e565b9250612905908361334c565b145b6103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b60448201526064016103df565b6000826129578382613334565b91508110156103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b60448201526064016103df565b60008060006129ae8585612802565b5090506000806129bf888888612014565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b1580156129f657600080fd5b505afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e9190613028565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614612a64578082612a67565b81815b90999098509650505050505050565b6000808411612ad25760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b60648201526084016103df565b600083118015612ae25750600082115b612b2e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000612b466103e8612b4086886128e3565b906128e3565b90506000612b5a6103e5612b408689612c26565b9050612b6b6001611cfd838561334c565b9695505050505050565b6000808411612bbc5760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b60448201526064016103df565b600083118015612bcc5750600082115b612c115760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b60448201526064016103df565b82612c1c85846128e3565b610391919061334c565b600082612c33838261338d565b91508111156103b65760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b60448201526064016103df565b8035612c8781613418565b919050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b85010111156128dc57600080fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff613402565b8260051b604051601f19603f83011681018181108482111715612d2457612d24613402565b60405284815283810192508684018288018501891015612d4357600080fd5b600092505b85831015612d6d57612d5981612c7c565b845292840192600192909201918401612d48565b50979650505050505050565b80516001600160701b0381168114612c8757600080fd5b600060208284031215612da257600080fd5b8135612dad81613418565b9392505050565b600060208284031215612dc657600080fd5b8151612dad81613418565b600080600080600080600060e0888a031215612dec57600080fd5b8735612df781613418565b96506020880135612e0781613418565b955060408801359450606088013593506080880135925060a0880135612e2c81613418565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612e6057600080fd5b8835612e6b81613418565b97506020890135612e7b81613418565b965060408901359550606089013594506080890135935060a0890135925060c0890135612ea781613418565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215612ed857600080fd5b8635612ee381613418565b95506020870135945060408701359350606087013592506080870135612f0881613418565b8092505060a087013590509295509295509295565b60008060008060008060008060e0898b031215612f3957600080fd5b883567ffffffffffffffff811115612f5057600080fd5b612f5c8b828c01612c8c565b9099509750506020890135955060408901359450606089013593506080890135925060a0890135612f8c81613418565b8092505060c089013590509295985092959890939650565b60008060008060008060c08789031215612fbd57600080fd5b863567ffffffffffffffff811115612fd457600080fd5b612fe089828a01612cd1565b9650506020870135945060408701359350606087013592506080870135612f0881613418565b60006020828403121561301857600080fd5b81518015158114612dad57600080fd5b6000806040838503121561303b57600080fd5b61304483612d79565b915061305260208401612d79565b90509250929050565b60006020828403121561306d57600080fd5b5051919050565b60008060008060006080868803121561308c57600080fd5b85359450602086013567ffffffffffffffff8111156130aa57600080fd5b6130b688828901612c8c565b90955093505060408601356130ca81613418565b949793965091946060013592915050565b600080604083850312156130ee57600080fd5b82359150602083013567ffffffffffffffff81111561310c57600080fd5b61311885828601612cd1565b9150509250929050565b6000806040838503121561313557600080fd5b505080516020909101519092909150565b60008060008060008060a0878903121561315f57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561318457600080fd5b61319089828a01612c8c565b90955093505060608701356131a481613418565b80925050608087013590509295509295509295565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b6000825160005b8181101561320657602081860181015185830152016131ec565b81811115613215576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156132585783518352928401929184019160010161323c565b50909695505050505050565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b60008219821115613347576133476133d6565b500190565b60008261336957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613388576133886133d6565b500290565b60008282101561339f5761339f6133d6565b500390565b6000816133b3576133b36133d6565b506000190190565b60006000198214156133cf576133cf6133d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461342d57600080fd5b5056fea26469706673582212209e009d451135d8f7785354bbd0067448d7f55ac869805336dbb4ecd29444fdc464736f6c63430008070033000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

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

000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

-----Decoded View---------------
Arg [0] : _factory (address): 0xf49255205dfd7933c4d0f25a57d40b1511f92fef
Arg [1] : _WNativeCurrency (address): 0xacc15dc74880c9944775448304b263d191c6077f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f49255205dfd7933c4d0f25a57d40b1511f92fef
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f


Deployed ByteCode Sourcemap

16894:16263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17379:15;;-1:-1:-1;;;;;17379:15:0;17365:10;:29;17357:38;;;;;;16894:16263;;;;;32186:240;;;;;;;;;;-1:-1:-1;32186:240:0;;;;;:::i;:::-;;:::i;:::-;;;19704:25:1;;;19692:2;19677:18;32186:240:0;;;;;;;;32922:232;;;;;;;;;;-1:-1:-1;32922:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27124:669::-;;;;;;;;;;-1:-1:-1;27124:669:0;;;;;:::i;:::-;;:::i;25448:829::-;;;;;;;;;;-1:-1:-1;25448:829:0;;;;;:::i;:::-;;:::i;:::-;;;;19914:25:1;;;19970:2;19955:18;;19948:34;;;;19887:18;25448:829:0;19740:248:1;16997:39:0;;;;;;;;;;-1:-1:-1;16997:39:0;;;;-1:-1:-1;;;;;16997:39:0;;;;;;-1:-1:-1;;;;;10044:32:1;;;10026:51;;10014:2;9999:18;16997:39:0;9880:203:1;20658:2284:0;;;;;;:::i;:::-;;:::i;:::-;;;;20545:25:1;;;20601:2;20586:18;;20579:34;;;;20629:18;;;20622:34;20533:2;20518:18;20658:2284:0;20343:319:1;27801:610:0;;;;;;;;;;-1:-1:-1;27801:610:0;;;;;:::i;:::-;;:::i;19342:1308::-;;;;;;:::i;:::-;;:::i;31185:993::-;;;;;;:::i;:::-;;:::i;18394:940::-;;;;;;;;;;-1:-1:-1;18394:940:0;;;;;:::i;:::-;;:::i;24572:868::-;;;;;;;;;;-1:-1:-1;24572:868:0;;;;;:::i;:::-;;:::i;16959:31::-;;;;;;;;;;-1:-1:-1;16959:31:0;;;;-1:-1:-1;;;;;16959:31:0;;;28419:861;;;;;;:::i;:::-;;:::i;32682:232::-;;;;;;;;;;-1:-1:-1;32682:232:0;;;;;:::i;:::-;;:::i;30207:970::-;;;;;;;;;;-1:-1:-1;30207:970:0;;;;;:::i;:::-;;:::i;17489:897::-;;;;;;;;;;-1:-1:-1;17489:897:0;;;;;:::i;:::-;;:::i;29288:911::-;;;;;;;;;;-1:-1:-1;29288:911:0;;;;;:::i;:::-;;:::i;32186:240::-;32329:17;32366:52;32386:8;32396:9;32407:10;32366:19;:52::i;:::-;32359:59;32186:240;-1:-1:-1;;;;32186:240:0:o;32922:232::-;33121:7;;33052:24;;33101:45;;-1:-1:-1;;;;;33121:7:0;33130:9;33141:4;33101:19;:45::i;:::-;33094:52;;32922:232;;;;;:::o;27124:669::-;27347:24;27328:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;;;;;;;;;27415:7:::1;::::0;27394:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;27415:7:0::1;::::0;27424:8;;27394:45;27434:4;;;;;;27394:45;;::::1;::::0;27434:4;;27394:45;27434:4;27394:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27394:20:0::1;::::0;-1:-1:-1;;;27394:45:0:i:1;:::-;27384:55;;27503:12;27472:7;27497:1;27480:7;:14;:18;;;;:::i;:::-;27472:27;;;;;;;;:::i;:::-;;;;;;;:43;;27450:127;;;;-1:-1:-1::0;;;27450:127:0::1;;;;;;;:::i;:::-;27588:162;27626:4;;27631:1;27626:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27688;::::0;;27648:10:::1;::::0;27673:41:::1;::::0;-1:-1:-1;;;;;27688:7:0::1;::::0;27697:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27706:4;;27711:1;27706:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27673:14;:41::i;:::-;27729:7;27737:1;27729:10;;;;;;;;:::i;:::-;;;;;;;27588:23;:162::i;:::-;27761:24;27767:7;27776:4;;27761:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27782:2:0;;-1:-1:-1;27761:5:0::1;::::0;-1:-1:-1;;27761:24:0:i:1;:::-;27124:669:::0;;;;;;;;;:::o;25448:829::-;25747:19;25768:28;25719:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;25902:15:::1;::::0;25852:218:::1;::::0;25882:5;;-1:-1:-1;;;;;25902:15:0::1;25932:9:::0;25956:14;25985:23;26031:4:::1;26051:8:::0;25852:15:::1;:218::i;:::-;25814:256:::0;;-1:-1:-1;25814:256:0;-1:-1:-1;26081:43:0::1;26101:5:::0;26108:2;25814:256;26081:19:::1;:43::i;:::-;26152:15;::::0;26135:64:::1;::::0;-1:-1:-1;;;26135:64:0;;::::1;::::0;::::1;19704:25:1::0;;;-1:-1:-1;;;;;26152:15:0;;::::1;::::0;26135:42:::1;::::0;19677:18:1;;26135:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26210:59;26244:2;26248:20;26210:33;:59::i;:::-;25448:829:::0;;;;;;;;;;:::o;20658:2284::-;21015:19;21049:28;21092:17;20973:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;21173:15:::1;::::0;21162:7;;-1:-1:-1;;;;;21173:15:0;;::::1;::::0;21162:4;;21173:15:::1;::::0;21162:7:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;21162:26:0::1;;21154:59;;;;-1:-1:-1::0;;;21154:59:0::1;;;;;;;:::i;:::-;21224:24;21285:7:::0;;21251:99:::1;::::0;-1:-1:-1;;;;;21285:7:0::1;21307:13:::0;21335:4;21251:19:::1;:99::i;:::-;21224:126;;21385:9;21371:7;21379:1;21371:10;;;;;;;;:::i;:::-;;;;;;;:23;;21363:66;;;;-1:-1:-1::0;;;21363:66:0::1;;;;;;;:::i;:::-;21457:15;::::0;21489:10;;-1:-1:-1;;;;;21457:15:0;;::::1;::::0;21440:41:::1;::::0;21489:7;;21457:15:::1;::::0;21489:10:::1;;;;:::i;:::-;;;;;;;21440:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21544:15;;;;;;;;;-1:-1:-1::0;;;;;21544:15:0::1;-1:-1:-1::0;;;;;21537:32:0::1;;21588:41;21603:7;::::0;::::1;;;;;;-1:-1:-1::0;;;;;21603:7:0::1;21612:4;21617:1;21612:7;;;;;;;;:::i;:::-;;;;;;;21621:4;21626:1;21621:7;;;;;;;;:::i;:::-;;;;;;;21588:14;:41::i;:::-;21648:7;21656:1;21648:10;;;;;;;;:::i;:::-;;;;;;;21537:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;21537:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21515:169;;;::::0;::::1;;21697:24;21703:7;21712:4;21718:2;21697:5;:24::i;:::-;21770:23;21756:7;21764:1;21756:10;;;;;;;;:::i;:::-;;;;;;;:37;;21734:132;;;::::0;-1:-1:-1;;;21734:132:0;;16362:2:1;21734:132:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:43;16544:19;;21734:132:0::1;16160:409:1::0;21734:132:0::1;21904:13;21920:4;21939:1;21925:4;:11;:15;;;;:::i;:::-;21920:21;;;;;;;;:::i;:::-;;;;;;;21904:37;;21952:29;21996:7;22004:1;21996:10;;;;;;;;:::i;:::-;;;;;;;21984:9;:22;;;;:::i;:::-;21952:54;;22055:233;22083:5;22103:15;;;;;;;;;-1:-1:-1::0;;;;;22103:15:0::1;22133:7;22158:1;22141:7;:14;:18;;;;:::i;:::-;22133:27;;;;;;;;:::i;:::-;;;;;;;22175:21;22211:7;22236:1;22219:7;:14;:18;;;;:::i;:::-;22211:27;;;;;;;;:::i;:::-;;;;;;;22253:24;22055:13;:233::i;:::-;22301:12;22331:7:::0;;;22347:15;22017:271;;-1:-1:-1;22017:271:0;;-1:-1:-1;22301:12:0;22316:47:::1;::::0;-1:-1:-1;;;;;22331:7:0;;::::1;::::0;22340:5;;22347:15:::1;22316:14;:47::i;:::-;22301:62;;22376:61;22400:5;22407:10;22419:4;22425:11;22376:23;:61::i;:::-;22467:15;;;;;;;;;-1:-1:-1::0;;;;;22467:15:0::1;-1:-1:-1::0;;;;;22450:41:0::1;;22513:20;22450:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;22574:15:0::1;::::0;22567:60:::1;::::0;-1:-1:-1;;;22567:60:0;;-1:-1:-1;;;;;10969:32:1;;;22567:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;22574:15:0;;::::1;::::0;-1:-1:-1;22567:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;22567:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22559:69;;;::::0;::::1;;22653:20;::::0;-1:-1:-1;;;22653:20:0;;-1:-1:-1;;;;;10044:32:1;;;22653:20:0::1;::::0;::::1;10026:51:1::0;22653:16:0;::::1;::::0;::::1;::::0;9999:18:1;;22653:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22641:32;;22726:7;22734:1;22726:10;;;;;;;;:::i;:::-;;;;;;;22703:20;:33;;;;:::i;:::-;22690:9;:47;22686:209;;;22752:143;22804:10;22869:7;22877:1;22869:10;;;;;;;;:::i;:::-;;;;;;;22846:20;:33;;;;:::i;:::-;22833:47;::::0;:9:::1;:47;:::i;:::-;22752:33;:143::i;:::-;21126:1816;;;;20658:2284:::0;;;;;;;;;;;:::o;27801:610::-;28024:24;28005:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;28091:7:::1;::::0;28071:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28091:7:0::1;::::0;28100:9;;28071:45;28111:4;;;;;;28071:45;;::::1;::::0;28111:4;;28071:45;28111:4;28071:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28071:19:0::1;::::0;-1:-1:-1;;;28071:45:0:i:1;:::-;28061:55;;28149:11;28135:7;28143:1;28135:10;;;;;;;;:::i;:::-;;;;;;;:25;;28127:68;;;;-1:-1:-1::0;;;28127:68:0::1;;;;;;;:::i;19342:1308::-:0;19680:19;19714:28;19757:17;19638:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;19888:15:::1;::::0;19840:198:::1;::::0;19868:5;;-1:-1:-1;;;;;19888:15:0::1;19918:18:::0;19951:9:::1;19975:14:::0;20004:23;19840:13:::1;:198::i;:::-;20049:12;20079:7:::0;;;20095:15;19802:236;;-1:-1:-1;19802:236:0;;-1:-1:-1;20049:12:0;20064:47:::1;::::0;-1:-1:-1;;;;;20079:7:0;;::::1;::::0;20088:5;;20095:15:::1;20064:14;:47::i;:::-;20049:62;;20122:61;20146:5;20153:10;20165:4;20171:11;20122:23;:61::i;:::-;20211:15;;;;;;;;;-1:-1:-1::0;;;;;20211:15:0::1;-1:-1:-1::0;;;;;20194:41:0::1;;20257:20;20194:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20316:15:0::1;::::0;20309:60:::1;::::0;-1:-1:-1;;;20309:60:0;;-1:-1:-1;;;;;10969:32:1;;;20309:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;20316:15:0;;::::1;::::0;-1:-1:-1;20309:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;20309:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20301:69;;;::::0;::::1;;20393:20;::::0;-1:-1:-1;;;20393:20:0;;-1:-1:-1;;;;;10044:32:1;;;20393:20:0::1;::::0;::::1;10026:51:1::0;20393:16:0;::::1;::::0;::::1;::::0;9999:18:1;;20393:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20381:32;;20440:20;20428:9;:32;20424:179;;;20475:128;20527:10;20556:32;20568:20:::0;20556:9:::1;:32;:::i;20475:128::-;19791:859;19342:1308:::0;;;;;;;;;;;:::o;31185:993::-;31441:24;31413:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;31502:15:::1;::::0;-1:-1:-1;;;;;31502:15:0::1;31491:4:::0;;31502:15:::1;31491:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31491:26:0::1;;31483:59;;;;-1:-1:-1::0;;;31483:59:0::1;;;;;;;:::i;:::-;31583:7;::::0;31563:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;31583:7:0::1;::::0;31592:9;;31563:45;31603:4;;;;;;31563:45;;::::1;::::0;31603:4;;31563:45;31603:4;31563:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31563:19:0::1;::::0;-1:-1:-1;;;31563:45:0:i:1;:::-;31553:55;;31641:9;31627:7;31635:1;31627:10;;;;;;;;:::i;:::-;;;;;;;:23;;31619:66;;;;-1:-1:-1::0;;;31619:66:0::1;;;;;;;:::i;:::-;31713:15;::::0;31745:10;;-1:-1:-1;;;;;31713:15:0;;::::1;::::0;31696:41:::1;::::0;31745:7;;31713:15:::1;::::0;31745:10:::1;;;;:::i;:::-;;;;;;;31696:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31798:15:0::1;::::0;::::1;31857:7:::0;;-1:-1:-1;;;;;31798:15:0;;::::1;::::0;-1:-1:-1;31791:32:0::1;::::0;-1:-1:-1;31842:41:0::1;::::0;-1:-1:-1;31857:7:0;;::::1;::::0;31866:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31875:4;;31880:1;31875:7;;;;;;;:::i;31842:41::-;31902:7;31910:1;31902:10;;;;;;;;:::i;:::-;;;;;;;31791:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;31791:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31769:169;;;::::0;::::1;;31949:24;31955:7;31964:4;;31949:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31970:2:0;;-1:-1:-1;31949:5:0::1;::::0;-1:-1:-1;;31949:24:0:i:1;:::-;32000:7;32008:1;32000:10;;;;;;;;:::i;:::-;;;;;;;31988:9;:22;31984:159;;;32025:118;32077:10;32118:7;32126:1;32118:10;;;;;;;;:::i;:::-;;;;;;;32106:9;:22;;;;:::i;32025:118::-;31185:993:::0;;;;;;;;:::o;18394:940::-;18690:17;18671:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;18720:14:::1;18737:4;;18742:1;18737:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18720:24:::0;-1:-1:-1;18755:14:0::1;18772:4:::0;;18777:15:::1;18791:1;18772:4:::0;18777:15:::1;:::i;:::-;18772:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18755:38;;18806:24;18833:152;18872:13;18900:15;18930:4;;18949:2;18966:8;18833:24;:152::i;:::-;18806:179;;18998:23;19035:7;19043:1;19035:10;;;;;;;;:::i;:::-;;;;;;;19024:8;:21;;;;:::i;:::-;18998:47;;19074:252;19101:6;19122;19143:7;19168:1;19151:7;:14;:18;;;;:::i;:::-;19143:27;;;;;;;;:::i;:::-;;;;;;;19185:15;19215:7;19240:1;19223:7;:14;:18;;;;:::i;:::-;19215:27;;;;;;;;:::i;:::-;;;;;;;19257:18;19290:2;19307:8;19074:12;:252::i;:::-;19056:270;;;;;;;;;18709:625;;;;18394:940:::0;;;;;;;;;;;:::o;24572:868::-;24866:15;24883;24838:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;24916:12:::1;24946:7:::0;;24931:39:::1;::::0;-1:-1:-1;;;;;24946:7:0::1;24955:6:::0;24963;24931:14:::1;:39::i;:::-;24981:54;::::0;-1:-1:-1;;;24981:54:0;;25007:10:::1;24981:54;::::0;::::1;10637:34:1::0;-1:-1:-1;;;;;24981:25:0;::::1;10687:18:1::0;;;10680:43;;;10739:18;;;10732:34;;;24916:54:0;;-1:-1:-1;24981:25:0::1;::::0;10572:18:1;;24981:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25083:20:0::1;::::0;-1:-1:-1;;;25083:20:0;;-1:-1:-1;;;;;10044:32:1;;;25083:20:0::1;::::0;::::1;10026:51:1::0;25047:15:0::1;::::0;;;25083:16;::::1;::::0;::::1;::::0;9999:18:1;;25083:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25046:57;;;;25115:14;25135:33;25153:6;25161;25135:17;:33::i;:::-;25114:54;;;25210:6;-1:-1:-1::0;;;;;25200:16:0::1;:6;-1:-1:-1::0;;;;;25200:16:0::1;;:84;;25267:7;25276;25200:84;;;25233:7;25242;25200:84;25179:105:::0;;-1:-1:-1;25179:105:0;-1:-1:-1;25303:21:0;;::::1;;25295:63;;;::::0;-1:-1:-1;;;25295:63:0;;16776:2:1;25295:63:0::1;::::0;::::1;16758:21:1::0;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;25295:63:0::1;16574:353:1::0;25295:63:0::1;25388:10;25377:7;:21;;25369:63;;;::::0;-1:-1:-1;;;25369:63:0;;14069:2:1;25369:63:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;25369:63:0::1;13867:353:1::0;25369:63:0::1;24905:535;;;;24572:868:::0;;;;;;;;;;;:::o;28419:861::-;28678:24;28650:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;28739:15:::1;::::0;-1:-1:-1;;;;;28739:15:0::1;28728:4:::0;;28739:15:::1;28728:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28728:26:0::1;;28720:59;;;;-1:-1:-1::0;;;28720:59:0::1;;;;;;;:::i;:::-;28821:7;::::0;28800:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28821:7:0::1;::::0;28830:9:::1;::::0;28800:46;28841:4;;;;;;28800:46;;::::1;::::0;28841:4;;28800:46;28841:4;28800:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28800:20:0::1;::::0;-1:-1:-1;;;28800:46:0:i:1;:::-;28790:56;;28910:12;28879:7;28904:1;28887:7;:14;:18;;;;:::i;:::-;28879:27;;;;;;;;:::i;:::-;;;;;;;:43;;28857:127;;;;-1:-1:-1::0;;;28857:127:0::1;;;;;;;:::i;:::-;29012:15;::::0;29044:10;;-1:-1:-1;;;;;29012:15:0;;::::1;::::0;28995:41:::1;::::0;29044:7;;29012:15:::1;::::0;29044:10:::1;;;;:::i;:::-;;;;;;;28995:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29097:15:0::1;::::0;::::1;29156:7:::0;;-1:-1:-1;;;;;29097:15:0;;::::1;::::0;-1:-1:-1;29090:32:0::1;::::0;-1:-1:-1;29141:41:0::1;::::0;-1:-1:-1;29156:7:0;;::::1;::::0;29165:4;;;;:7;::::1;;;;:::i;29141:41::-;29201:7;29209:1;29201:10;;;;;;;;:::i;:::-;;;;;;;29090:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;29090:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29068:169;;;::::0;::::1;;29248:24;29254:7;29263:4;;29248:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29269:2:0;;-1:-1:-1;29248:5:0::1;::::0;-1:-1:-1;;29248:24:0:i:1;32682:232::-:0;32882:7;;32812:24;;32861:45;;-1:-1:-1;;;;;32882:7:0;32891:8;32901:4;32861:20;:45::i;30207:970::-;30440:24;30421:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;30524:15:::1;::::0;;-1:-1:-1;;;;;30524:15:0::1;::::0;30499:4;;;;30504:15:::1;::::0;30499:4;30504:15:::1;:::i;:::-;30499:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30499:40:0::1;;30477:110;;;;-1:-1:-1::0;;;30477:110:0::1;;;;;;;:::i;:::-;30629:7;::::0;30608:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;30629:7:0::1;::::0;30638:8;;30608:45;30648:4;;;;;;30608:45;;::::1;::::0;30648:4;;30608:45;30648:4;30608:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30608:20:0::1;::::0;-1:-1:-1;;;30608:45:0:i:1;:::-;30598:55;;30717:12;30686:7;30711:1;30694:7;:14;:18;;;;:::i;:::-;30686:27;;;;;;;;:::i;:::-;;;;;;;:43;;30664:127;;;;-1:-1:-1::0;;;30664:127:0::1;;;;;;;:::i;:::-;30802:162;30840:4;;30845:1;30840:7;;;;;;;:::i;30802:162::-;30975:35;30981:7;30990:4;;30975:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31004:4:0::1;::::0;-1:-1:-1;30975:5:0::1;::::0;-1:-1:-1;;30975:35:0:i:1;:::-;31038:15;::::0;;31072:14;;-1:-1:-1;;;;;31038:15:0;;::::1;::::0;31021:42:::1;::::0;31064:7;;31072:18:::1;::::0;::::1;:::i;:::-;31064:27;;;;;;;;:::i;:::-;;;;;;;31021:71;;;;;;;;;;;;;19704:25:1::0;;19692:2;19677:18;;19558:177;31021:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31103:66;31137:2;31141:7;31166:1;31149:7;:14;:18;;;;:::i;:::-;31141:27;;;;;;;;:::i;:::-;;;;;;;31103:33;:66::i;17489:897::-:0;17832:15;17862;17892:17;17790:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;17958:174:::1;17986:6;18007;18028:14;18057;18086:10;18111;17958:13;:174::i;:::-;18143:12;18173:7:::0;;17937:195;;-1:-1:-1;17937:195:0;;-1:-1:-1;18143:12:0;18158:39:::1;::::0;-1:-1:-1;;;;;18173:7:0::1;18182:6:::0;18190;18158:14:::1;:39::i;:::-;18143:54;;18208:58;18232:6;18240:10;18252:4;18258:7;18208:23;:58::i;:::-;18277;18301:6;18309:10;18321:4;18327:7;18277:23;:58::i;:::-;18358:20;::::0;-1:-1:-1;;;18358:20:0;;-1:-1:-1;;;;;10044:32:1;;;18358:20:0::1;::::0;::::1;10026:51:1::0;18358:16:0;::::1;::::0;::::1;::::0;9999:18:1;;18358:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18346:32;;17926:460;17489:897:::0;;;;;;;;;;;;;:::o;29288:911::-;29521:24;29502:8;17256:15;17244:8;:27;;17236:55;;;;-1:-1:-1;;;17236:55:0;;;;;;;:::i;:::-;29605:15:::1;::::0;;-1:-1:-1;;;;;29605:15:0::1;::::0;29580:4;;;;29585:15:::1;::::0;29580:4;29585:15:::1;:::i;:::-;29580:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29580:40:0::1;;29558:110;;;;-1:-1:-1::0;;;29558:110:0::1;;;;;;;:::i;:::-;29709:7;::::0;29689:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;29709:7:0::1;::::0;29718:9;;29689:45;29729:4;;;;;;29689:45;;::::1;::::0;29729:4;;29689:45;29729:4;29689:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;29689:19:0::1;::::0;-1:-1:-1;;;29689:45:0:i:1;:::-;29679:55;;29767:11;29753:7;29761:1;29753:10;;;;;;;;:::i;:::-;;;;;;;:25;;29745:68;;;;-1:-1:-1::0;;;29745:68:0::1;;;;;;;:::i;6749:589::-:0;6885:17;6934:1;6923:8;:12;6915:58;;;;-1:-1:-1;;;6915:58:0;;19358:2:1;6915:58:0;;;19340:21:1;19397:2;19377:18;;;19370:30;19436:34;19416:18;;;19409:62;-1:-1:-1;;;19487:18:1;;;19480:31;19528:19;;6915:58:0;19156:397:1;6915:58:0;7018:1;7006:9;:13;:31;;;;;7036:1;7023:10;:14;7006:31;6984:111;;;;-1:-1:-1;;;6984:111:0;;17951:2:1;6984:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;6984:111:0;17749:354:1;6984:111:0;7106:23;7132:17;:8;7145:3;7132:12;:17::i;:::-;7106:43;-1:-1:-1;7160:17:0;7180:31;7106:43;7200:10;7180:19;:31::i;:::-;7160:51;-1:-1:-1;7222:19:0;7244:40;7268:15;7244:19;:9;7258:4;7244:13;:19::i;:::-;:23;;:40::i;:::-;7222:62;-1:-1:-1;7307:23:0;7222:62;7307:9;:23;:::i;:::-;7295:35;6749:589;-1:-1:-1;;;;;;;6749:589:0:o;8709:640::-;8847:24;8907:1;8892:4;:11;:16;;8884:49;;;;-1:-1:-1;;;8884:49:0;;18310:2:1;8884:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8884:49:0;18108:344:1;8884:49:0;8968:4;:11;8954:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8954:26:0;;8944:36;;9021:9;8991:7;9016:1;8999:7;:14;:18;;;;:::i;:::-;8991:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9046:9;9072:1;9058:4;:11;:15;;;;:::i;:::-;9046:27;;9041:301;9075:5;;9041:301;;9103:17;;9144:108;9174:7;9200:4;9205:5;9209:1;9205;:5;:::i;:::-;9200:11;;;;;;;;:::i;:::-;;;;;;;9230:4;9235:1;9230:7;;;;;;;;:::i;:::-;;;;;;;9144:11;:108::i;:::-;9102:150;;;;9284:46;9296:7;9304:1;9296:10;;;;;;;;:::i;:::-;;;;;;;9308:9;9319:10;9284:11;:46::i;:::-;9267:7;9275:5;9279:1;9275;:5;:::i;:::-;9267:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9087:255;;9082:3;;;;;:::i;:::-;;;;9041:301;;;;8709:640;;;;;:::o;8082:619::-;8220:24;8280:1;8265:4;:11;:16;;8257:49;;;;-1:-1:-1;;;8257:49:0;;18310:2:1;8257:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8257:49:0;18108:344:1;8257:49:0;8341:4;:11;8327:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8327:26:0;;8317:36;;8377:8;8364:7;8372:1;8364:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8401:9;8396:298;8430:1;8416:4;:11;:15;;;;:::i;:::-;8412:1;:19;8396:298;;;8454:17;8473:18;8495:108;8525:7;8551:4;8556:1;8551:7;;;;;;;;:::i;:::-;;;;;;;8577:4;8582:1;8586;8582:5;;;;:::i;:::-;8577:11;;;;;;;;:::i;8495:108::-;8453:150;;;;8635:47;8648:7;8656:1;8648:10;;;;;;;;:::i;:::-;;;;;;;8660:9;8671:10;8635:12;:47::i;:::-;8618:7;8626:5;:1;8630;8626:5;:::i;:::-;8618:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8438:256;;8433:3;;;;;:::i;:::-;;;;8396:298;;4292:204;4447:41;;-1:-1:-1;;;4447:41:0;;-1:-1:-1;;;;;10318:15:1;;;4447:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;4415:12:0;;4447:25;;;;;;10235:18:1;;4447:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5329:522::-;5614:51;;;-1:-1:-1;;;;;10655:15:1;;;5614:51:0;;;10637:34:1;10707:15;;;10687:18;;;10680:43;10739:18;;;;10732:34;;;5614:51:0;;;;;;;;;;10572:18:1;;;;5614:51:0;;;;;;;-1:-1:-1;;;;;5614:51:0;-1:-1:-1;;;5614:51:0;;;5589:87;;-1:-1:-1;;;;5589:10:0;;;;:87;;5614:51;5589:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5553:123;;;;5709:7;:57;;;;-1:-1:-1;5721:11:0;;:16;;:44;;;5752:4;5741:24;;;;;;;;;;;;:::i;:::-;5687:156;;;;-1:-1:-1;;;5687:156:0;;13651:2:1;5687:156:0;;;13633:21:1;13690:2;13670:18;;;13663:30;13729:34;13709:18;;;13702:62;-1:-1:-1;;;13780:18:1;;;13773:47;13837:19;;5687:156:0;13449:413:1;5687:156:0;5463:388;;5329:522;;;;:::o;26285:831::-;26420:9;26415:694;26449:1;26435:4;:11;:15;;;;:::i;:::-;26431:1;:19;26415:694;;;26473:13;26488:14;26507:4;26512:1;26507:7;;;;;;;;:::i;:::-;;;;;;;26516:4;26521:1;26525;26521:5;;;;:::i;:::-;26516:11;;;;;;;;:::i;:::-;;;;;;;26472:56;;;;26544:14;26564:32;26582:5;26589:6;26564:17;:32::i;:::-;-1:-1:-1;26543:53:0;-1:-1:-1;26611:17:0;26631:7;26639:5;:1;26643;26639:5;:::i;:::-;26631:14;;;;;;;;:::i;:::-;;;;;;;26611:34;;26661:18;26681;26712:6;-1:-1:-1;;;;;26703:15:0;:5;-1:-1:-1;;;;;26703:15:0;;:101;;26782:9;26801:1;26703:101;;;26747:1;26751:9;26703:101;26660:144;;;;26819:10;26850:1;26836:4;:11;:15;;;;:::i;:::-;26832:1;:19;:106;;26935:3;26832:106;;;26886:7;;26871:44;;-1:-1:-1;;;;;26886:7:0;26895:6;26903:4;26908:5;:1;26912;26908:5;:::i;:::-;26903:11;;;;;;;;:::i;26871:44::-;26974:7;;26819:119;;-1:-1:-1;26959:38:0;;-1:-1:-1;;;;;26974:7:0;26983:5;26990:6;26959:14;:38::i;:::-;26953:144;;-1:-1:-1;;;26953:144:0;;;;;20195:25:1;;;20236:18;;;20229:34;;;-1:-1:-1;;;;;20299:32:1;;;20279:18;;;20272:60;26953:50:0;;;;;;;20168:18:1;;26953:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26457:652;;;;;;;26452:3;;;;;:::i;:::-;;;;26415:694;;;;26285:831;;;:::o;5859:473::-;6105:45;;;-1:-1:-1;;;;;10969:32:1;;;6105:45:0;;;10951:51:1;11018:18;;;;11011:34;;;6105:45:0;;;;;;;;;;10924:18:1;;;;6105:45:0;;;;;;;-1:-1:-1;;;;;6105:45:0;-1:-1:-1;;;6105:45:0;;;6080:81;;-1:-1:-1;;;;6080:10:0;;;;:81;;6105:45;6080:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6044:117;;;;6194:7;:57;;;;-1:-1:-1;6206:11:0;;:16;;:44;;;6237:4;6226:24;;;;;;;;;;;;:::i;:::-;6172:152;;;;-1:-1:-1;;;6172:152:0;;17537:2:1;6172:152:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;-1:-1:-1;;;17666:18:1;;;17659:43;17719:19;;6172:152:0;17335:409:1;6172:152:0;5966:366;;5859:473;;;:::o;6340:287::-;6464:12;;;6424;6464;;;;;;;;;-1:-1:-1;;;;;6442:7:0;;;6457:5;;6442:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6423:54;;;6510:7;6488:131;;;;-1:-1:-1;;;6488:131:0;;14427:2:1;6488:131:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;14576:34;14556:18;;;14549:62;-1:-1:-1;;;14627:19:1;;;14620:41;14678:19;;6488:131:0;14225:478:1;6488:131:0;6412:215;6340:287;;:::o;22950:1614::-;23171:15;23229:7;;23220:41;;-1:-1:-1;;;23220:41:0;;-1:-1:-1;;;;;10318:15:1;;;23220:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23171:15:0;;;;23229:7;;;23220:25;;10235:18:1;;23220:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23220:55:0;;23216:132;;;23301:7;;23292:44;;-1:-1:-1;;;23292:44:0;;-1:-1:-1;;;;;10318:15:1;;;23292:44:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23301:7:0;;;;23292:28;;10235:18:1;;23292:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23216:132;23359:16;23430:7;;23359:16;;23397:93;;-1:-1:-1;;;;;23430:7:0;23452:6;23473;23397:18;:93::i;:::-;23358:132;;;;23505:8;23517:1;23505:13;:30;;;;-1:-1:-1;23522:13:0;;23505:30;23501:1056;;;23574:14;;-1:-1:-1;23590:14:0;;-1:-1:-1;23501:1056:0;;;23638:22;23663:114;23694:14;23727:8;23754;23663:12;:114::i;:::-;23638:139;;23814:14;23796;:32;23792:754;;23897:10;23879:14;:28;;23849:131;;;;-1:-1:-1;;;23849:131:0;;14069:2:1;23849:131:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;23849:131:0;13867:353:1;23849:131:0;24021:14;;-1:-1:-1;24037:14:0;-1:-1:-1;24037:14:0;23792:754;;;24093:22;24118:130;24153:14;24190:8;24221;24118:12;:130::i;:::-;24093:155;;24293:14;24275;:32;;24267:41;;;;;;24375:10;24357:14;:28;;24327:131;;;;-1:-1:-1;;;24327:131:0;;16776:2:1;24327:131:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;24327:131:0;16574:353:1;24327:131:0;24499:14;-1:-1:-1;24515:14:0;;-1:-1:-1;23792:754:0;23623:934;23501:1056;23205:1359;;22950:1614;;;;;;;;;:::o;3897:387::-;3999:14;4015;4065:6;-1:-1:-1;;;;;4055:16:0;:6;-1:-1:-1;;;;;4055:16:0;;;4047:56;;;;-1:-1:-1;;;4047:56:0;;16006:2:1;4047:56:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;4047:56:0;15804:351:1;4047:56:0;4142:6;-1:-1:-1;;;;;4133:15:0;:6;-1:-1:-1;;;;;4133:15:0;;:79;;4197:6;4205;4133:79;;;4165:6;4173;4133:79;4114:98;;-1:-1:-1;4114:98:0;-1:-1:-1;;;;;;4231:20:0;;4223:53;;;;-1:-1:-1;;;4223:53:0;;14910:2:1;4223:53:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:50;15028:18;;4223:53:0;14708:344:1;4223:53:0;3897:387;;;;;:::o;3605:151::-;3663:9;3693:6;;;:30;;-1:-1:-1;3722:1:0;3717;3708:5;3717:1;3722;3708:5;:::i;:::-;3704:9;-1:-1:-1;3703:15:0;;3704:9;3703:15;:::i;:::-;:20;3693:30;3685:63;;;;-1:-1:-1;;;3685:63:0;;12594:2:1;3685:63:0;;;12576:21:1;12633:2;12613:18;;;12606:30;-1:-1:-1;;;12652:18:1;;;12645:50;12712:18;;3685:63:0;12392:344:1;3314:137:0;3372:9;3417:1;3407:5;3411:1;3417;3407:5;:::i;:::-;3403:9;;;3402:16;;3394:49;;;;-1:-1:-1;;;3394:49:0;;13302:2:1;3394:49:0;;;13284:21:1;13341:2;13321:18;;;13314:30;-1:-1:-1;;;13360:18:1;;;13353:50;13420:18;;3394:49:0;13100:344:1;4843:478:0;4970:16;4988;5018:14;5038:26;5049:6;5057;5038:10;:26::i;:::-;5017:47;;;5076:16;5094;5134:32;5142:7;5151:6;5159;5134:7;:32::i;:::-;-1:-1:-1;;;;;5114:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5075:116:0;;;-1:-1:-1;;;;;5075:116:0;;;5235:6;-1:-1:-1;;;;;5225:16:0;:6;-1:-1:-1;;;;;5225:16:0;;:88;;5294:8;5304;5225:88;;;5258:8;5268;5225:88;5202:111;;;;-1:-1:-1;4843:478:0;-1:-1:-1;;;;;;;4843:478:0:o;7459:541::-;7595:16;7644:1;7632:9;:13;7624:60;;;;-1:-1:-1;;;7624:60:0;;15603:2:1;7624:60:0;;;15585:21:1;15642:2;15622:18;;;15615:30;15681:34;15661:18;;;15654:62;-1:-1:-1;;;15732:18:1;;;15725:32;15774:19;;7624:60:0;15401:398:1;7624:60:0;7729:1;7717:9;:13;:31;;;;;7747:1;7734:10;:14;7717:31;7695:111;;;;-1:-1:-1;;;7695:111:0;;17951:2:1;7695:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;7695:111:0;17749:354:1;7695:111:0;7817:17;7837:34;7866:4;7837:24;:9;7851;7837:13;:24::i;:::-;:28;;:34::i;:::-;7817:54;-1:-1:-1;7882:19:0;7904:34;7934:3;7904:25;:10;7919:9;7904:14;:25::i;:34::-;7882:56;-1:-1:-1;7960:32:0;7990:1;7961:23;7882:56;7961:9;:23;:::i;7960:32::-;7949:43;7459:541;-1:-1:-1;;;;;;7459:541:0:o;4504:331::-;4629:15;4675:1;4665:7;:11;4657:43;;;;-1:-1:-1;;;4657:43:0;;18659:2:1;4657:43:0;;;18641:21:1;18698:2;18678:18;;;18671:30;-1:-1:-1;;;18717:18:1;;;18710:49;18776:18;;4657:43:0;18457:343:1;4657:43:0;4730:1;4719:8;:12;:28;;;;;4746:1;4735:8;:12;4719:28;4711:63;;;;-1:-1:-1;;;4711:63:0;;19007:2:1;4711:63:0;;;18989:21:1;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19065:18:1;;;19058:52;19127:18;;4711:63:0;18805:346:1;4711:63:0;4819:8;4795:21;:7;4807:8;4795:11;:21::i;:::-;:32;;;;:::i;3459:138::-;3517:9;3562:1;3552:5;3556:1;3562;3552:5;:::i;:::-;3548:9;;;3547:16;;3539:50;;;;-1:-1:-1;;;3539:50:0;;11895:2:1;3539:50:0;;;11877:21:1;11934:2;11914:18;;;11907:30;-1:-1:-1;;;11953:18:1;;;11946:51;12014:18;;3539:50:0;11693:345:1;14:134;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:55;;298:1;295;288:12;247:55;-1:-1:-1;321:20:1;;364:18;353:30;;350:50;;;396:1;393;386:12;350:50;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:67;;;510:1;507;500:12;525:919;579:5;632:3;625:4;617:6;613:17;609:27;599:55;;650:1;647;640:12;599:55;686:6;673:20;712:4;735:18;772:2;768;765:10;762:36;;;778:18;;:::i;:::-;824:2;821:1;817:10;856:2;850:9;919:2;915:7;910:2;906;902:11;898:25;890:6;886:38;974:6;962:10;959:22;954:2;942:10;939:18;936:46;933:72;;;985:18;;:::i;:::-;1021:2;1014:22;1071:18;;;1105:15;;;;-1:-1:-1;1140:15:1;;;1174;;;1170:24;;1167:33;-1:-1:-1;1164:53:1;;;1213:1;1210;1203:12;1164:53;1235:1;1226:10;;1245:169;1259:2;1256:1;1253:9;1245:169;;;1316:23;1335:3;1316:23;:::i;:::-;1304:36;;1360:12;;;;1277:1;1270:9;;;;;1392:12;;1245:169;;;-1:-1:-1;1432:6:1;525:919;-1:-1:-1;;;;;;;525:919:1:o;1449:188::-;1528:13;;-1:-1:-1;;;;;1570:42:1;;1560:53;;1550:81;;1627:1;1624;1617:12;1642:247;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;1809:9;1796:23;1828:31;1853:5;1828:31;:::i;:::-;1878:5;1642:247;-1:-1:-1;;;1642:247:1:o;1894:251::-;1964:6;2017:2;2005:9;1996:7;1992:23;1988:32;1985:52;;;2033:1;2030;2023:12;1985:52;2065:9;2059:16;2084:31;2109:5;2084:31;:::i;2150:805::-;2263:6;2271;2279;2287;2295;2303;2311;2364:3;2352:9;2343:7;2339:23;2335:33;2332:53;;;2381:1;2378;2371:12;2332:53;2420:9;2407:23;2439:31;2464:5;2439:31;:::i;:::-;2489:5;-1:-1:-1;2546:2:1;2531:18;;2518:32;2559:33;2518:32;2559:33;:::i;:::-;2611:7;-1:-1:-1;2665:2:1;2650:18;;2637:32;;-1:-1:-1;2716:2:1;2701:18;;2688:32;;-1:-1:-1;2767:3:1;2752:19;;2739:33;;-1:-1:-1;2824:3:1;2809:19;;2796:33;2838;2796;2838;:::i;:::-;2890:7;2880:17;;;2944:3;2933:9;2929:19;2916:33;2906:43;;2150:805;;;;;;;;;;:::o;2960:874::-;3082:6;3090;3098;3106;3114;3122;3130;3138;3191:3;3179:9;3170:7;3166:23;3162:33;3159:53;;;3208:1;3205;3198:12;3159:53;3247:9;3234:23;3266:31;3291:5;3266:31;:::i;:::-;3316:5;-1:-1:-1;3373:2:1;3358:18;;3345:32;3386:33;3345:32;3386:33;:::i;:::-;3438:7;-1:-1:-1;3492:2:1;3477:18;;3464:32;;-1:-1:-1;3543:2:1;3528:18;;3515:32;;-1:-1:-1;3594:3:1;3579:19;;3566:33;;-1:-1:-1;3646:3:1;3631:19;;3618:33;;-1:-1:-1;3703:3:1;3688:19;;3675:33;3717;3675;3717;:::i;:::-;3769:7;3759:17;;;3823:3;3812:9;3808:19;3795:33;3785:43;;2960:874;;;;;;;;;;;:::o;3839:663::-;3943:6;3951;3959;3967;3975;3983;4036:3;4024:9;4015:7;4011:23;4007:33;4004:53;;;4053:1;4050;4043:12;4004:53;4092:9;4079:23;4111:31;4136:5;4111:31;:::i;:::-;4161:5;-1:-1:-1;4213:2:1;4198:18;;4185:32;;-1:-1:-1;4264:2:1;4249:18;;4236:32;;-1:-1:-1;4315:2:1;4300:18;;4287:32;;-1:-1:-1;4371:3:1;4356:19;;4343:33;4385;4343;4385;:::i;:::-;4437:7;4427:17;;;4491:3;4480:9;4476:19;4463:33;4453:43;;3839:663;;;;;;;;:::o;4507:916::-;4647:6;4655;4663;4671;4679;4687;4695;4703;4756:3;4744:9;4735:7;4731:23;4727:33;4724:53;;;4773:1;4770;4763:12;4724:53;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4917:70;4979:7;4970:6;4959:9;4955:22;4917:70;:::i;:::-;5006:8;;-1:-1:-1;4891:96:1;-1:-1:-1;;5088:2:1;5073:18;;5060:32;;-1:-1:-1;5139:2:1;5124:18;;5111:32;;-1:-1:-1;5190:2:1;5175:18;;5162:32;;-1:-1:-1;5241:3:1;5226:19;;5213:33;;-1:-1:-1;5296:3:1;5281:19;;5268:33;5310:31;5268:33;5310:31;:::i;:::-;5360:5;5350:15;;;5412:3;5401:9;5397:19;5384:33;5374:43;;4507:916;;;;;;;;;;;:::o;5428:758::-;5557:6;5565;5573;5581;5589;5597;5650:3;5638:9;5629:7;5625:23;5621:33;5618:53;;;5667:1;5664;5657:12;5618:53;5707:9;5694:23;5740:18;5732:6;5729:30;5726:50;;;5772:1;5769;5762:12;5726:50;5795:61;5848:7;5839:6;5828:9;5824:22;5795:61;:::i;:::-;5785:71;;;5903:2;5892:9;5888:18;5875:32;5865:42;;5954:2;5943:9;5939:18;5926:32;5916:42;;6005:2;5994:9;5990:18;5977:32;5967:42;;6059:3;6048:9;6044:19;6031:33;6073:31;6098:5;6073:31;:::i;6191:277::-;6258:6;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6359:9;6353:16;6412:5;6405:13;6398:21;6391:5;6388:32;6378:60;;6434:1;6431;6424:12;6473:293;6552:6;6560;6613:2;6601:9;6592:7;6588:23;6584:32;6581:52;;;6629:1;6626;6619:12;6581:52;6652:40;6682:9;6652:40;:::i;:::-;6642:50;;6711:49;6756:2;6745:9;6741:18;6711:49;:::i;:::-;6701:59;;6473:293;;;;;:::o;6771:184::-;6841:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;-1:-1:-1;6933:16:1;;6771:184;-1:-1:-1;6771:184:1:o;6960:709::-;7073:6;7081;7089;7097;7105;7158:3;7146:9;7137:7;7133:23;7129:33;7126:53;;;7175:1;7172;7165:12;7126:53;7211:9;7198:23;7188:33;;7272:2;7261:9;7257:18;7244:32;7299:18;7291:6;7288:30;7285:50;;;7331:1;7328;7321:12;7285:50;7370:70;7432:7;7423:6;7412:9;7408:22;7370:70;:::i;:::-;7459:8;;-1:-1:-1;7344:96:1;-1:-1:-1;;7544:2:1;7529:18;;7516:32;7557:31;7516:32;7557:31;:::i;:::-;6960:709;;;;-1:-1:-1;6960:709:1;;7659:2;7644:18;7631:32;;6960:709;-1:-1:-1;;6960:709:1:o;7674:416::-;7767:6;7775;7828:2;7816:9;7807:7;7803:23;7799:32;7796:52;;;7844:1;7841;7834:12;7796:52;7880:9;7867:23;7857:33;;7941:2;7930:9;7926:18;7913:32;7968:18;7960:6;7957:30;7954:50;;;8000:1;7997;7990:12;7954:50;8023:61;8076:7;8067:6;8056:9;8052:22;8023:61;:::i;:::-;8013:71;;;7674:416;;;;;:::o;8095:245::-;8174:6;8182;8235:2;8223:9;8214:7;8210:23;8206:32;8203:52;;;8251:1;8248;8241:12;8203:52;-1:-1:-1;;8274:16:1;;8330:2;8315:18;;;8309:25;8274:16;;8309:25;;-1:-1:-1;8095:245:1:o;8345:778::-;8467:6;8475;8483;8491;8499;8507;8560:3;8548:9;8539:7;8535:23;8531:33;8528:53;;;8577:1;8574;8567:12;8528:53;8613:9;8600:23;8590:33;;8670:2;8659:9;8655:18;8642:32;8632:42;;8725:2;8714:9;8710:18;8697:32;8752:18;8744:6;8741:30;8738:50;;;8784:1;8781;8774:12;8738:50;8823:70;8885:7;8876:6;8865:9;8861:22;8823:70;:::i;:::-;8912:8;;-1:-1:-1;8797:96:1;-1:-1:-1;;8997:2:1;8982:18;;8969:32;9010:31;8969:32;9010:31;:::i;:::-;9060:5;9050:15;;;9112:3;9101:9;9097:19;9084:33;9074:43;;8345:778;;;;;;;;:::o;9128:316::-;9205:6;9213;9221;9274:2;9262:9;9253:7;9249:23;9245:32;9242:52;;;9290:1;9287;9280:12;9242:52;-1:-1:-1;;9313:23:1;;;9383:2;9368:18;;9355:32;;-1:-1:-1;9434:2:1;9419:18;;;9406:32;;9128:316;-1:-1:-1;9128:316:1:o;9449:426::-;9578:3;9616:6;9610:13;9641:1;9651:129;9665:6;9662:1;9659:13;9651:129;;;9763:4;9747:14;;;9743:25;;9737:32;9724:11;;;9717:53;9680:12;9651:129;;;9798:6;9795:1;9792:13;9789:48;;;9833:1;9824:6;9819:3;9815:16;9808:27;9789:48;-1:-1:-1;9853:16:1;;;;;9449:426;-1:-1:-1;;9449:426:1:o;11056:632::-;11227:2;11279:21;;;11349:13;;11252:18;;;11371:22;;;11198:4;;11227:2;11450:15;;;;11424:2;11409:18;;;11198:4;11493:169;11507:6;11504:1;11501:13;11493:169;;;11568:13;;11556:26;;11637:15;;;;11602:12;;;;11529:1;11522:9;11493:169;;;-1:-1:-1;11679:3:1;;11056:632;-1:-1:-1;;;;;;11056:632:1:o;12043:344::-;12245:2;12227:21;;;12284:2;12264:18;;;12257:30;-1:-1:-1;;;12318:2:1;12303:18;;12296:50;12378:2;12363:18;;12043:344::o;12741:354::-;12943:2;12925:21;;;12982:2;12962:18;;;12955:30;13021:32;13016:2;13001:18;;12994:60;13086:2;13071:18;;12741:354::o;15057:339::-;15259:2;15241:21;;;15298:2;15278:18;;;15271:30;-1:-1:-1;;;15332:2:1;15317:18;;15310:45;15387:2;15372:18;;15057:339::o;16932:398::-;17134:2;17116:21;;;17173:2;17153:18;;;17146:30;17212:34;17207:2;17192:18;;17185:62;-1:-1:-1;;;17278:2:1;17263:18;;17256:32;17320:3;17305:19;;16932:398::o;20667:128::-;20707:3;20738:1;20734:6;20731:1;20728:13;20725:39;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20667:128::o;20800:217::-;20840:1;20866;20856:132;;20910:10;20905:3;20901:20;20898:1;20891:31;20945:4;20942:1;20935:15;20973:4;20970:1;20963:15;20856:132;-1:-1:-1;21002:9:1;;20800:217::o;21022:168::-;21062:7;21128:1;21124;21120:6;21116:14;21113:1;21110:21;21105:1;21098:9;21091:17;21087:45;21084:71;;;21135:18;;:::i;:::-;-1:-1:-1;21175:9:1;;21022:168::o;21195:125::-;21235:4;21263:1;21260;21257:8;21254:34;;;21268:18;;:::i;:::-;-1:-1:-1;21305:9:1;;21195:125::o;21325:136::-;21364:3;21392:5;21382:39;;21401:18;;:::i;:::-;-1:-1:-1;;;21437:18:1;;21325:136::o;21466:135::-;21505:3;-1:-1:-1;;21526:17:1;;21523:43;;;21546:18;;:::i;:::-;-1:-1:-1;21593:1:1;21582:13;;21466:135::o;21606:127::-;21667:10;21662:3;21658:20;21655:1;21648:31;21698:4;21695:1;21688:15;21722:4;21719:1;21712:15;21738:127;21799:10;21794:3;21790:20;21787:1;21780:31;21830:4;21827:1;21820:15;21854:4;21851:1;21844:15;21870:127;21931:10;21926:3;21922:20;21919:1;21912:31;21962:4;21959:1;21952:15;21986:4;21983:1;21976:15;22002:131;-1:-1:-1;;;;;22077:31:1;;22067:42;;22057:70;;22123:1;22120;22113:12;22057:70;22002:131;:::o

Swarm Source

ipfs://9e009d451135d8f7785354bbd0067448d7f55ac869805336dbb4ecd29444fdc4
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.