Contract 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 1

 
Txn Hash
Block
From
To
Value [Txn Fee]
0xdf372571ef1c316483a57452d7f58401b834e86597992a1250cca985aea045fd97437822021-08-04 14:52:396 mins ago0xb5112e36c90e6e224cb904680e35c8a304a31766 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00079082
0x479d5a32a14d16fe1b9337f2656ef1050725f72c741e29ef71b04f8a94dd378597437592021-08-04 14:51:307 mins ago0x06d6f6ceef574364c39a171241693fb460564ce0 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000623835
0x1aa39738c44ca5f54bf5d4e53d8c7dbb1267c03243a47d69c53a593e1dfd4fe497437562021-08-04 14:51:177 mins ago0xd85a952259daf38b4d737e15c73d959067ab0eb3 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000777675
0xc3ed835d27948b0eaf2256a736f6d8817492d8c8a7b7d5df12612dece0d2a8ce97437162021-08-04 14:49:099 mins ago0xeeb7ff4e7da4405fe40457fce0b79d114d0af12d IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.0004731
0xa13cf8ca500becf7a6eb07a2b3ba6b2fe5a9f23439c8cb26fe14d410e13f455397436742021-08-04 14:46:3112 mins ago0x2c076e95f6307d214386b86e7f1eb154330047ec IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.0005591
0xf68117c239c512e74ea8b28dbbac500c867eecccf96700c18d391841fe30164697436532021-08-04 14:45:1613 mins ago0xb5112e36c90e6e224cb904680e35c8a304a31766 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00084942
0x8a8b7b61db8f0c650887597ee4c6e0d0fde033e20e489916c8e3b9d00cd5041997436362021-08-04 14:44:1914 mins ago0xf7b0ac4f6c868352d1468a3a9456bd6643d95e00 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000563005
0xf8022bb660cada0d99195201cacb1faa2bdcfcf82aba36703068c40a0f38772897435882021-08-04 14:41:4217 mins ago0xd85a952259daf38b4d737e15c73d959067ab0eb3 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.0007884
0x2136d85ffffee3dc6fc26001431fc00ebf2feb4558c686fd079b8166758215aa97435612021-08-04 14:40:1018 mins ago0xc6479ee39d57b0d0fcc7c6cec9ca31a78c390273 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00085263
0x1260715e47bd92c9023cb87e0f728400d7a25474cac80b8106b0c180fc71905797435512021-08-04 14:39:3519 mins ago0xaaa31508efffd967c90913b23db9ef7b44277487 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000745445
0x4fa594229be21c75020ca5214ce66a9e207ea8ddca9e0bc346c31de5b127be5497435292021-08-04 14:38:2420 mins ago0xc6479ee39d57b0d0fcc7c6cec9ca31a78c390273 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00086158
0xce86c674bb4f6ca7484a85acce340a17bf85d94221688762035c667dc795346e97434942021-08-04 14:36:2222 mins ago0xaaa31508efffd967c90913b23db9ef7b44277487 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00064748
0x2adab3cedd2267b1e04dc3423e67b6bc8fc60ade76780f0c479ef9f8e51b07e397434192021-08-04 14:32:3726 mins ago0xaaa31508efffd967c90913b23db9ef7b44277487 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00087641
0x2b30b17db949403557cd8bbd0a6083c0ec7fdbb76e96b00d8d1f35fe33e78deb97432782021-08-04 14:25:3133 mins ago0xe6d3bfade9cbe6696b50747c2a611c1cbac4d656 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00047351
0x2e90b66f7dfc0221232c424e8b394cc0df3f07babff3cd2db7eaf20d1faccc2897431822021-08-04 14:19:4439 mins ago0xb5816ecfd736d640e3315bbcaed17242df42ba83 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000732705
0x140d3325969f21543a98396917a689596e0027afae2795a76e5f842d76e0031997431592021-08-04 14:18:2040 mins ago0xb5816ecfd736d640e3315bbcaed17242df42ba83 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000732705
0xaf9ed729552a412a25dc4c8f17b07fdf08034d6383a6b57e070afe51fa69149597430302021-08-04 14:11:0947 mins ago0xecb9accd123c6ec7362800718b344809dad21320 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00057254
0x3c1f834998125462282672c35068cc4fcaa7a8938aeca40f92d1828de49a62bb97430202021-08-04 14:10:3548 mins ago0xe86afe973e5621729d374486272db707b74b094b IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.0006234
0x66817f8e5e82a5e36c621ef44151a3ee4a3ca549e106c4e8b8d04293af36cc6497430142021-08-04 14:10:1048 mins ago0x02f19ae2389bfc95d917092bae0fea64ae1cc659 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00047351
0x7bbeef662e860bb80d639870ed740489b57b526a7f98de4c4f1e40480f31c44797429812021-08-04 14:08:2350 mins ago0xc5817a2d76aaedecb07b577a73aa8dd9aee38ad4 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00078658
0x4795689f340c4cb42426f37f5d15271e719b67a9ce4d9a6c2e7051a80d86329197429292021-08-04 14:05:2453 mins ago0x160358be9bd4ffddeb54bdbda0010ffbf44b05e7 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00047351
0xb0b789b1f7424adb43d84d99ca42fe122d31c4b3a47d4f99b5054c919accbb6997429032021-08-04 14:03:5555 mins ago0x728d830919b24446aaf33eb991e75130dd9d79d2 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00053521
0xe8428ae73815bcd2b775571954ced9d5cea4747e3591c5a74a03a69eb056e31b97428732021-08-04 14:02:0956 mins ago0x160358be9bd4ffddeb54bdbda0010ffbf44b05e7 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00054804
0x3530cd254058350cd80513fc115ff3417d5009617312938c23b82f27f1da2cae97428642021-08-04 14:01:4157 mins ago0x728d830919b24446aaf33eb991e75130dd9d79d2 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000544685
0x2d6cca3e32d09f8aabad8fc177a9e4a70b1813b0e3afa13a8b78cce72adad34697427832021-08-04 13:57:381 hr 1 min ago0xcb60b67e7451538fd0f91831fc41df7146b38fa1 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00061002
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc0c0b913c06d021211b8c0d0ae16422c58779144836eaa2b9d86af982ebc070e97383772021-08-04 10:11:444 hrs 47 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.2 BNB
0xc0c0b913c06d021211b8c0d0ae16422c58779144836eaa2b9d86af982ebc070e97383772021-08-04 10:11:444 hrs 47 mins ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.2 BNB
0x3c0e58970b55b0a29917db6e591d488d8421f096025f0aa86ef21a78602d3ddd97383652021-08-04 10:11:084 hrs 47 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x1f331c1ebbf3823f2930429ff8c90649c438a0731.032568146149885391 BNB
0x3c0e58970b55b0a29917db6e591d488d8421f096025f0aa86ef21a78602d3ddd97383652021-08-04 10:11:084 hrs 47 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef1.032568146149885391 BNB
0x9866a23ec8335e7068968103c8206d061b32a9702f305407859d81316f41211f97383472021-08-04 10:10:144 hrs 48 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.3 BNB
0x9866a23ec8335e7068968103c8206d061b32a9702f305407859d81316f41211f97383472021-08-04 10:10:144 hrs 48 mins ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.3 BNB
0xd83027e2e9f8d86979ba5c37ad5f534b7104eda5090251a5fcb2a844588632c197381482021-08-04 9:59:494 hrs 59 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x461e5e4782c43039961926a7f5703da865c336cc0.135563841046250766 BNB
0xd83027e2e9f8d86979ba5c37ad5f534b7104eda5090251a5fcb2a844588632c197381482021-08-04 9:59:494 hrs 59 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.135563841046250766 BNB
0xdc97c6cef22417872d430b1e326d8a1bc4baa1f7e4e0a705cb5178c59cedb3b897379122021-08-04 9:47:355 hrs 11 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.033923904696640177 BNB
0x964d2cae83884a22ebf10d74c0f331b826843cff80212c225de5ac572a16b9d697378092021-08-04 9:42:265 hrs 16 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0x5e944b2a3ace2e3bf6264f45983af962df5258370.000043672427037637 BNB
0x964d2cae83884a22ebf10d74c0f331b826843cff80212c225de5ac572a16b9d697378092021-08-04 9:42:265 hrs 16 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.000043672427037637 BNB
0xbf9fc06b7cccac210ba877de766d73d29bcb0685e32bee5844bf1274024b97c597374122021-08-04 9:22:345 hrs 36 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x8fb6765acbc84341f94efd14c4f190590ab239830.01374412740843194 BNB
0xbf9fc06b7cccac210ba877de766d73d29bcb0685e32bee5844bf1274024b97c597374122021-08-04 9:22:345 hrs 36 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.01374412740843194 BNB
0x194f5384e9a7297fc5cb56c474daa03655f6feea3ecc529c90b8727f5fe0741d97372392021-08-04 9:13:195 hrs 45 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token1.545789561823025136 BNB
0xe76be7d828779c7edc3d97e59c34130115bbdf4188c9c59a764e9cb44aec698e97371952021-08-04 9:11:075 hrs 47 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.07 BNB
0x2bd522406e38ac2367c2bb4cafac7292656bb31f9a700cd92f045f0e36cec33c97369372021-08-04 8:57:426 hrs 1 min ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0xc142995f3a97536bbf30f28999d328feed4ef63c0.346873318937295024 BNB
0x2bd522406e38ac2367c2bb4cafac7292656bb31f9a700cd92f045f0e36cec33c97369372021-08-04 8:57:426 hrs 1 min ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.346873318937295024 BNB
0xf753b3dcb2ecec345890cce7db84c66e5f907130ab76315287eace87c261b62497367832021-08-04 8:49:486 hrs 9 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x71e2875367beb0f895c6f6d6e7e268866794f5d40.391157431409010247 BNB
0xf753b3dcb2ecec345890cce7db84c66e5f907130ab76315287eace87c261b62497367832021-08-04 8:49:486 hrs 9 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.391157431409010247 BNB
0x9594dad14ec35d851c3137ccff9df45739726350f0908d131a3ea0bc0d64523397366952021-08-04 8:45:166 hrs 13 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0xad140e3df94b5265a1fb5e70cfe39e41c850c2545.640838178242084064 BNB
0x9594dad14ec35d851c3137ccff9df45739726350f0908d131a3ea0bc0d64523397366952021-08-04 8:45:166 hrs 13 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef5.640838178242084064 BNB
0xc725188a2215fa4d9a2283c3094f3117349db08dc739342922223bdf81f4199697365972021-08-04 8:40:126 hrs 18 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0xaa5bc567c39ae92c95a8a0b2a2c8b1eec493d33f0.001196787953929242 BNB
0xc725188a2215fa4d9a2283c3094f3117349db08dc739342922223bdf81f4199697365972021-08-04 8:40:126 hrs 18 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.239357590785848474 BNB
0x7e4c403ebe444e3b2d67a4ba3a467280e8b623904782e6ebe42324546e7d79e397365152021-08-04 8:36:066 hrs 22 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0xe3392c2d958ab1fd838deb1c034df8a72d4b5a1b0.000439524968709065 BNB
0x7e4c403ebe444e3b2d67a4ba3a467280e8b623904782e6ebe42324546e7d79e397365152021-08-04 8:36:066 hrs 22 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.000439524968709065 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwindexSwapRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 50000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-23
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity =0.6.12;

interface ITwindexSwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

interface ITwindexSwapRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

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

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

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

contract TwindexSwapRouter is ITwindexSwapRouter {
    using SafeMath for uint;

    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'TwindexSwapRouter: EXPIRED');
        _;
    }

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (ITwindexSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ITwindexSwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = TwindexSwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = TwindexSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'TwindexSwapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = TwindexSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'TwindexSwapRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = TwindexSwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ITwindexSwapPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = TwindexSwapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ITwindexSwapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = TwindexSwapLibrary.pairFor(factory, tokenA, tokenB);
        ITwindexSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = ITwindexSwapPair(pair).burn(to);
        (address token0,) = TwindexSwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'TwindexSwapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'TwindexSwapRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = TwindexSwapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        ITwindexSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = TwindexSwapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ITwindexSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = TwindexSwapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ITwindexSwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = TwindexSwapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? TwindexSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ITwindexSwapPair(TwindexSwapLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = TwindexSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = TwindexSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'TwindexSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        amounts = TwindexSwapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        amounts = TwindexSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'TwindexSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        amounts = TwindexSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        amounts = TwindexSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'TwindexSwapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = TwindexSwapLibrary.sortTokens(input, output);
            ITwindexSwapPair pair = ITwindexSwapPair(TwindexSwapLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = TwindexSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? TwindexSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'TwindexSwapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, TwindexSwapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'TwindexSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return TwindexSwapLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return TwindexSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return TwindexSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

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

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

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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

library TwindexSwapLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'TwindexSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'TwindexSwapLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'652b5a4fa6b1efd55c9821e56279c871f9999588a5472d22ab78b8ec61e2521e'
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ITwindexSwapPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'TwindexSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'TwindexSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'TwindexSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'TwindexSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint 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(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'TwindexSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'TwindexSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

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

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'TwindexSwapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","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":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","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":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"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":"swapExactTokensForETH","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":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"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":"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":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"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":"swapTokensForExactETH","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"}]

60c060405234801561001057600080fd5b5060405162005628380380620056288339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6154a362000185600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f15280614342528061438552806146cf528061489a5280614dbd5280614eaa5280614f8452506154a36000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615441602d913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fbe565b8560008151811061124a57fe5b60200260200101516140a9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614279915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144ea565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fbe565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615441602d913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806152fd6029913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140a9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614678915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b5051906149f5565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615441602d913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614678915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615441602d913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615441602d913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b5095945050505050565b6000610f44848484614a67565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806152fd6029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b73565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614678915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fbe565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c4d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152ae6028913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154196028913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e58565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614da0565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fbe565b90506132438d3383886140a9565b61324f8c3383876140a9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614da0565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b90506133fc8b3383886140a9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5477696e64657853776170526f757465723a2045585049524544000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5477696e64657853776170526f757465723a20494e56414c49445f5041544800604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806152fd6029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153a86023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061537b602d913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806153ef602a913960400191505060405180910390fd5b6000613e19856103e56150cd565b90506000613e2782856150cd565b90506000613e4183613e3b886103e86150cd565b90615153565b9050808281613e4c57fe5b04979650505050505050565b6060600282511015613ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5477696e646578537761704c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ee357600080fd5b50604051908082528060200260200182016040528015613f0d578160200160208202803683370190505b5090508281600081518110613f1e57fe5b60200260200101818152505060005b6001835103811015613fb657600080613f7087868581518110613f4c57fe5b6020026020010151878660010181518110613f6357fe5b60200260200101516151c5565b91509150613f92848481518110613f8357fe5b60200260200101518383613d4c565b848460010181518110613fa157fe5b60209081029190910101525050600101613f2d565b509392505050565b6000806000613fcd8585614c4d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f652b5a4fa6b1efd55c9821e56279c871f9999588a5472d22ab78b8ec61e2521e609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061418757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141e9576040519150601f19603f3d011682016040523d82523d6000602084013e6141ee565b606091505b509150915081801561421c57508051158061421c575080806020019051602081101561421957600080fd5b50515b614271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153cb6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144e45760008084838151811061429757fe5b60200260200101518584600101815181106142ae57fe5b60200260200101519150915060006142c68383614c4d565b50905060008785600101815181106142da57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461432257826000614326565b6000835b91509150600060028a5103881061433d578861437e565b61437e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061437157fe5b6020026020010151613fbe565b90506143ab7f00000000000000000000000000000000000000000000000000000000000000008888613fbe565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143f5576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561446a578181015183820152602001614452565b50505050905090810190601f1680156144975780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144b957600080fd5b505af11580156144cd573d6000803e3d6000fd5b50506001909901985061427c975050505050505050565b50505050565b606060028251101561455d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5477696e646578537761704c6962726172793a20494e56414c49445f50415448604482015290519081900360640190fd5b815167ffffffffffffffff8111801561457557600080fd5b5060405190808252806020026020018201604052801561459f578160200160208202803683370190505b50905082816001835103815181106145b357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fb657600080614613878660018603815181106145ff57fe5b6020026020010151878681518110613f6357fe5b9150915061463584848151811061462657fe5b60200260200101518383614a67565b84600185038151811061464457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145e3565b60005b6001835103811015613d475760008084838151811061469657fe5b60200260200101518584600101815181106146ad57fe5b60200260200101519150915060006146c58383614c4d565b50905060006146f57f00000000000000000000000000000000000000000000000000000000000000008585613fbe565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561474357600080fd5b505afa158015614757573d6000803e3d6000fd5b505050506040513d606081101561476d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147b75782846147ba565b83835b91509150614829828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614836868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461487a5782600061487e565b6000835b91509150600060028c51038a10614895578a6148c9565b6148c97f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061437157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614979578181015183820152602001614961565b50505050905090810190601f1680156149a65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149c857600080fd5b505af11580156149dc573d6000803e3d6000fd5b50506001909b019a5061467b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615326602e913960400191505060405180910390fd5b600083118015614ad15750600082115b614b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806153ef602a913960400191505060405180910390fd5b6000614b3e6103e8614b3886886150cd565b906150cd565b90506000614b526103e5614b3886896149f5565b9050614b696001828481614b6257fe5b0490615153565b9695505050505050565b6000808411614bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806153546027913960400191505060405180910390fd5b600083118015614bdd5750600082115b614c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806153ef602a913960400191505060405180910390fd5b82614c3d85846150cd565b81614c4457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d66027913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d0f578284614d12565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614d9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5477696e646578537761704c6962726172793a205a45524f5f41444452455353604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e6057600080fd5b505afa158015614e74573d6000803e3d6000fd5b505050506040513d6020811015614e8a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f7c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f4f57600080fd5b505af1158015614f63573d6000803e3d6000fd5b505050506040513d6020811015614f7957600080fd5b50505b600080614faa7f00000000000000000000000000000000000000000000000000000000000000008b8b6151c5565b91509150816000148015614fbc575080155b15614fcc578793508692506150c0565b6000614fd9898484614b73565b9050878111615046578581101561503b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806154196028913960400191505060405180910390fd5b8894509250826150be565b6000615053898486614b73565b90508981111561505f57fe5b878110156150b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152ae6028913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150e8575050808202828282816150e557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151d48585614c4d565b5090506000806151e5888888613fbe565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561522a57600080fd5b505afa15801561523e573d6000803e3d6000fd5b505050506040513d606081101561525457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461529b57808261529e565b81815b9099909850965050505050505056fe5477696e64657853776170526f757465723a20494e53554646494349454e545f415f414d4f554e545477696e646578537761704c6962726172793a204944454e544943414c5f4144445245535345535477696e64657853776170526f757465723a204558434553534956455f494e5055545f414d4f554e545477696e646578537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545477696e646578537761704c6962726172793a20494e53554646494349454e545f414d4f554e545477696e646578537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45445477696e646578537761704c6962726172793a20494e53554646494349454e545f4c49515549444954595477696e64657853776170526f757465723a20494e53554646494349454e545f425f414d4f554e545477696e64657853776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54a2646970667358221220c6273c1bb63f831c3b5a3bf2c01d2305d48c7fad9d54c05f45b18569d337beab64736f6c634300060c00330000000000000000000000004e66fda7820c53c1a2f601f84918c375205eac3e000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000004e66fda7820c53c1a2f601f84918c375205eac3e000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e66fda7820c53c1a2f601f84918c375205eac3e
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

10411:18687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10895:10;:18;10909:4;10895:18;;10888:26;;;;10411:18687;;;;;15079:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15079:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28034:264;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28034:264:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22296:858;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22296:858:0;-1:-1:-1;22296:858:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28840:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28840:255:0;;-1:-1:-1;28840:255:0;;-1:-1:-1;;;;;28840:255:0:i;15758:681::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15758:681:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19485:634::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19485:634:0;-1:-1:-1;19485:634:0;;;;;;;;;:::i;21454:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21454:836:0;-1:-1:-1;21454:836:0;;;;;;;;;:::i;17903:722::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17903:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25357:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25357:718:0;-1:-1:-1;25357:718:0;;;;;;;;;:::i;26943:849::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26943:849:0;-1:-1:-1;26943:849:0;;;;;;;;;:::i;20743:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20743:705:0;-1:-1:-1;20743:705:0;;;;;;;;;:::i;28306:263::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28306:263:0;;;;;;;;;;;;:::i;20125:612::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20125:612:0;-1:-1:-1;20125:612:0;;;;;;;;;:::i;10547:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27836:190;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27836:190:0;;;;;;;;;;;;:::i;17197:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17197:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26081:856::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26081:856:0;-1:-1:-1;26081:856:0;;;;;;;;;:::i;14196:877::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14196:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10499:41::-;;;;;;;;;;;;;:::i;28577:255::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28577:255:0;;-1:-1:-1;28577:255:0;;-1:-1:-1;;;;;28577:255:0:i;16445:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16445:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12427:742::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12427:742:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;13175:978;;;;;;;;;;;;;;;;-1:-1:-1;13175:978:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23160:818::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23160:818:0;-1:-1:-1;23160:818:0;;;;;;;;;:::i;15079:673::-;15316:16;15334:14;15297:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15388:196:::1;15418:5;15438:4;15457:9;15481:14;15510:12;15545:4;15565:8;15388:15;:196::i;:::-;15361:223:::0;;-1:-1:-1;15361:223:0;-1:-1:-1;15595:51:0::1;15623:5:::0;15630:2;15361:223;15595:27:::1;:51::i;:::-;15663:4;15657:20;;;15678:9;15657:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15699:45;15730:2;15734:9;15699:30;:45::i;:::-;15079:673:::0;;;;;;;;;;:::o;28034:264::-;28187:14;28226:64;28258:8;28268:9;28279:10;28226:31;:64::i;:::-;28219:71;28034:264;-1:-1:-1;;;;28034:264:0:o;22296:858::-;22510:21;22482:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22557:29:::1;22582:4;22557:29;:4:::0;;22562:15;;;22557:21;;::::1;;;;;;;;;;;;;:29;;;22549:73;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22643:57;22676:7;22685:8;22695:4;;22643:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22643:32:0::1;::::0;-1:-1:-1;;;22643:57:0:i:1;:::-;22633:67;;22750:12;22719:7;22744:1;22727:7;:14;:18;22719:27;;;;;;;;;;;;;;:43;;22711:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22823:143;22869:4;;22874:1;22869:7;;;;;;;;;;;;;;;22878:10;22890:53;22917:7;22926:4;;22931:1;22926:7;;;;;;;;;;;;;;;22935:4;;22940:1;22935:7;;;;;;;;;;;;;;;22890:26;:53::i;:::-;22945:7;22953:1;22945:10;;;;;;;;;;;;;;22823:31;:143::i;:::-;22977:35;22983:7;22992:4;;22977:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23006:4:0::1;::::0;-1:-1:-1;22977:5:0::1;::::0;-1:-1:-1;;22977:35:0:i:1;:::-;23029:4;23023:20;;;23044:7;23069:1;23052:7;:14;:18;23044:27;;;;;;;;;;;;;;23023:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23083:63;23114:2;23118:7;23143:1;23126:7;:14;:18;23118:27;;;;;;;;;;;;;;23083:30;:63::i;:::-;22296:858:::0;;;;;;;;;:::o;28840:255::-;28984:21;29030:57;29062:7;29071:9;29082:4;29030:31;:57::i;:::-;29023:64;;28840:255;;;;;:::o;15758:681::-;16064:12;16078;16103;16118:51;16145:7;16154:6;16162;16118:26;:51::i;:::-;16103:66;;16180:10;16193;:33;;16217:9;16193:33;;;16211:2;16193:33;16237:82;;;;;;16267:10;16237:82;;;;16287:4;16237:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16180:46;;-1:-1:-1;16237:29:0;;;;;;:82;;;;;-1:-1:-1;;16237:82:0;;;;;;;;-1:-1:-1;16237:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16351:80;16367:6;16375;16383:9;16394:10;16406;16418:2;16422:8;16351:15;:80::i;:::-;16330:101;;;;;;;;15758:681;;;;;;;;;;;;;;;;:::o;19485:634::-;19709:21;19690:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19753:57:::1;19786:7;19795:8;19805:4;;19753:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;19753:32:0::1;::::0;-1:-1:-1;;;19753:57:0:i:1;:::-;19743:67;;19860:12;19829:7;19854:1;19837:7;:14;:18;19829:27;;;;;;;;;;;;;;:43;;19821:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19933:143;19979:4;;19984:1;19979:7;;;;;;19933:143;20087:24;20093:7;20102:4;;20087:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;20108:2:0;;-1:-1:-1;20087:5:0::1;::::0;-1:-1:-1;;20087:24:0:i:1;21454:836::-:0;21668:21;21640:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21715:29:::1;21740:4;21715:29;:4:::0;;21720:15;;;21715:21;;::::1;;;;;;;;;;;;;:29;;;21707:73;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21801:57;21833:7;21842:9;21853:4;;21801:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;21801:31:0::1;::::0;-1:-1:-1;;;21801:57:0:i:1;:::-;21791:67;;21891:11;21877:7;21885:1;21877:10;;;;;;;;;;;;;;:25;;21869:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17903:722:::0;18221:14;18248:12;18263:48;18290:7;18299:5;18306:4;18263:26;:48::i;:::-;18248:63;;18322:10;18335;:33;;18359:9;18335:33;;;18353:2;18335:33;18379:82;;;;;;18409:10;18379:82;;;;18429:4;18379:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18322:46;;-1:-1:-1;18379:29:0;;;;;;:82;;;;;-1:-1:-1;;18379:82:0;;;;;;;;-1:-1:-1;18379:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18484:133;18546:5;18553:9;18564:14;18580:12;18594:2;18598:8;18484:47;:133::i;:::-;18472:145;17903:722;-1:-1:-1;;;;;;;;;;;;;17903:722:0:o;25357:718::-;25591:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25612:141:::1;25658:4;;25663:1;25658:7;;;;;;;;;;;;;;;25667:10;25679:53;25706:7;25715:4;;25720:1;25715:7;;;;;;;;;;;;;;;25724:4;;25729:1;25724:7;;;;;;25679:53;25734:8;25612:31;:141::i;:::-;25764:18;25792:4:::0;;25797:15;;;25792:21;;::::1;;;;;;;;;;;;;25785:39;;;25825:2;25785:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25785:43:0;25839:44:::1;::::0;;25785:43:::1;25839:44:::0;;::::1;::::0;;;;;;;;;;;25785:43;;-1:-1:-1;25839:44:0::1;::::0;;;25874:4;;;;;;25839:44;::::1;::::0;25874:4;;25839:44;25874:4;25839:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;25880:2:0;;-1:-1:-1;25839:34:0::1;::::0;-1:-1:-1;;25839:44:0:i:1;:::-;25982:12:::0;25916:62:::1;25964:13:::0;25923:4;;25928:15;;;25923:21;;::::1;;;;;;;;;;;;;25916:39;;;25956:2;25916:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25916:43:0;;:47:::1;:62::i;:::-;:78;;25894:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10713:1;25357:718:::0;;;;;;;:::o;26943:849::-;27210:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27244:29:::1;27269:4;27244:29;:4:::0;;27249:15;;;27244:21;;::::1;;;;;;;;;;;;;:29;;;27236:73;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27320:141;27366:4;;27371:1;27366:7;;;;;;27320:141;27472:55;27507:4;;27472:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27521:4:0::1;::::0;-1:-1:-1;27472:34:0::1;::::0;-1:-1:-1;;27472:55:0:i:1;:::-;27538:14;27562:4;27555:22;;;27586:4;27555:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27555:37:0;;-1:-1:-1;27611:25:0;;::::1;;27603:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27703:4;27697:20;;;27718:9;27697:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27739:45;27770:2;27774:9;27739:30;:45::i;20743:705::-:0;20959:21;20931:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21017:4:::1;21006:15;;:4;;21011:1;21006:7;;;;;;;;;;;;;;;:15;;;20998:59;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21078:58;21111:7;21120:9;21131:4;;21078:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;21078:32:0::1;::::0;-1:-1:-1;;;21078:58:0:i:1;:::-;21068:68;;21186:12;21155:7;21180:1;21163:7;:14;:18;21155:27;;;;;;;;;;;;;;:43;;21147:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21265:4;21259:19;;;21286:7;21294:1;21286:10;;;;;;;;;;;;;;21259:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21323:4;21317:20;;;21338:53;21365:7;21374:4;;21379:1;21374:7;;;;;;21338:53;21393:7;21401:1;21393:10;;;;;;;;;;;;;;21317:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21317:87:0;21310:95:::1;;;;21416:24;21422:7;21431:4;;21416:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;21437:2:0;;-1:-1:-1;21416:5:0::1;::::0;-1:-1:-1;;21416:24:0:i:1;:::-;20743:705:::0;;;;;;;;:::o;28306:263::-;28459:13;28497:64;28528:9;28539;28550:10;28497:30;:64::i;20125:612::-;20349:21;20330:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20393:57:::1;20425:7;20434:9;20445:4;;20393:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;20393:31:0::1;::::0;-1:-1:-1;;;20393:57:0:i:1;:::-;20383:67;;20483:11;20469:7;20477:1;20469:10;;;;;;;;;;;;;;:25;;20461:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10547:38:::0;;;:::o;27836:190::-;27933:12;27965:53;27990:7;27999:8;28009;27965:24;:53::i;17197:700::-;17463:14;17444:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17506:196:::1;17536:5;17556:4;17575:9;17599:14;17628:12;17663:4;17683:8;17506:15;:196::i;:::-;17490:212;;;;;;17713:78;17741:5;17748:2;17759:5;17752:23;;;17784:4;17752:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17752:38:0;17713:27:::1;:78::i;:::-;17808:4;17802:20;;;17823:9;17802:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17844:45;17875:2;17879:9;17844:30;:45::i;26081:856::-:0;26341:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26386:4:::1;26375:15;;:4;;26380:1;26375:7;;;;;;;;;;;;;;;:15;;;26367:59;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26437:13;26453:9;26437:25;;26479:4;26473:19;;;26500:8;26473:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26535:4;26529:20;;;26550:53;26577:7;26586:4;;26591:1;26586:7;;;;;;26550:53;26605:8;26529:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26529:85:0;26522:93:::1;;;;26626:18;26654:4:::0;;26659:15;;;26654:21;;::::1;;;;;;;;;;;;;26647:39;;;26687:2;26647:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26647:43:0;26701:44:::1;::::0;;26647:43:::1;26701:44:::0;;::::1;::::0;;;;;;;;;;;26647:43;;-1:-1:-1;26701:44:0::1;::::0;;;26736:4;;;;;;26701:44;::::1;::::0;26736:4;;26701:44;26736:4;26701:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;26742:2:0;;-1:-1:-1;26701:34:0::1;::::0;-1:-1:-1;;26701:44:0:i:1;:::-;26844:12:::0;26778:62:::1;26826:13:::0;26785:4;;26790:15;;;26785:21;;::::1;;;;;;;;;;;;;26778:39;;;26818:2;26778:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;14196:877:::0;14450:12;14464;14431:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14489:12:::1;14504:51;14531:7;14540:6;14548;14504:26;:51::i;:::-;14566:64;::::0;;;;;14602:10:::1;14566:64;::::0;::::1;::::0;:35:::1;::::0;::::1;:64:::0;;;;;;;;;;;;;;14489:66;;-1:-1:-1;14566:35:0;;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;14566:35:0;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;14698:31:0::1;::::0;;;;;:27:::1;:31:::0;;::::1;;::::0;::::1;::::0;;;14668:12:::1;::::0;;;14698:27;;::::1;::::0;::::1;::::0;:31;;;;;;;;;;;14668:12;14698:27;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14698:31:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;14698:31:0;-1:-1:-1;14741:14:0::1;14760:45;14790:6:::0;14798;14760:29:::1;:45::i;:::-;14740:65;;;14847:6;14837:16;;:6;:16;;;:58;;14878:7;14887;14837:58;;;14857:7;14866;14837:58;14816:79:::0;;-1:-1:-1;14816:79:0;-1:-1:-1;14914:21:0;;::::1;;14906:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15010:10;14999:7;:21;;14991:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10713:1;;;;14196:877:::0;;;;;;;;;;;:::o;10499:41::-;;;:::o;28577:255::-;28721:21;28767:57;28800:7;28809:8;28819:4;28767:32;:57::i;16445:673::-;16734:16;16752:14;16779:12;16794:48;16821:7;16830:5;16837:4;16794:26;:48::i;:::-;16779:63;;16853:10;16866;:33;;16890:9;16866:33;;;16884:2;16866:33;16910:82;;;;;;16940:10;16910:82;;;;16960:4;16910:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16853:46;;-1:-1:-1;16910:29:0;;;;;;:82;;;;;-1:-1:-1;;16910:82:0;;;;;;;;-1:-1:-1;16910:29:0;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17030:80;17049:5;17056:9;17067:14;17083:12;17097:2;17101:8;17030:18;:80::i;:::-;17003:107;;;;-1:-1:-1;16445:673:0;-1:-1:-1;;;;;;;;;;;;;16445:673:0:o;12427:742::-;12715:12;12729;12743:14;12696:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12791:85:::1;12805:6;12813;12821:14;12837;12853:10;12865;12791:13;:85::i;:::-;12770:106:::0;;-1:-1:-1;12770:106:0;-1:-1:-1;12887:12:0::1;12902:51;12929:7;12938:6:::0;12946;12902:26:::1;:51::i;:::-;12887:66;;12964;12996:6;13004:10;13016:4;13022:7;12964:31;:66::i;:::-;13041;13073:6;13081:10;13093:4;13099:7;13041:31;:66::i;:::-;13147:4;13130:27;;;13158:2;13130:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13130:31:0;12427:742;;;;-1:-1:-1;13130:31:0;;-1:-1:-1;12427:742:0;;-1:-1:-1;;;;;;;;;12427:742:0:o;13175:978::-;13428:16;13446:14;13462;13409:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13516:176:::1;13544:5;13564:4;13583:18;13616:9;13640:14;13669:12;13516:13;:176::i;:::-;13489:203:::0;;-1:-1:-1;13489:203:0;-1:-1:-1;13703:12:0::1;13718:48;13745:7;13754:5:::0;13761:4:::1;13718:26;:48::i;:::-;13703:63;;13777:69;13809:5;13816:10;13828:4;13834:11;13777:31;:69::i;:::-;13863:4;13857:19;;;13884:9;13857:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;13920:4;13914:20;;;13935:4;13941:9;13914:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13914:37:0;13907:45:::1;;;;13992:4;13975:27;;;14003:2;13975:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13975:31:0;;-1:-1:-1;14057:9:0::1;:21:::0;-1:-1:-1;14053:92:0::1;;;14080:65;14111:10;14135:9;14123;:21;14080:30;:65::i;:::-;10713:1;13175:978:::0;;;;;;;;;;;:::o;23160:818::-;23373:21;23345:8;10656:15;10644:8;:27;;10636:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23431:4:::1;23420:15;;:4;;23425:1;23420:7;;;;;;;;;;;;;;;:15;;;23412:59;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23492:57;23524:7;23533:9;23544:4;;23492:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23492:31:0::1;::::0;-1:-1:-1;;;23492:57:0:i:1;:::-;23482:67;;23582:9;23568:7;23576:1;23568:10;;;;;;;;;;;;;;:23;;23560:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23654:4;23648:19;;;23675:7;23683:1;23675:10;;;;;;;;;;;;;;23648:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23712:4;23706:20;;;23727:53;23754:7;23763:4;;23768:1;23763:7;;;;;;23727:53;23782:7;23790:1;23782:10;;;;;;;;;;;;;;23706:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23706:87:0;23699:95:::1;;;;23805:24;23811:7;23820:4;;23805:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23826:2:0;;-1:-1:-1;23805:5:0::1;::::0;-1:-1:-1;;23805:24:0:i:1;:::-;23892:7;23900:1;23892:10;;;;;;;;;;;;;;23880:9;:22;23876:94;;;23904:66;23935:10;23959:7;23967:1;23959:10;;;;;;;;;;;;;;23947:9;:22;23904:30;:66::i;34582:361::-:0;34777:45;;;34766:10;34777:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34766:57;;;;34731:12;;34745:17;;34766:10;;;;34777:45;34766:57;;;34777:45;34766:57;;34777:45;34766:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34730:93;;;;34842:7;:57;;;;-1:-1:-1;34854:11:0;;:16;;:44;;;34885:4;34874:24;;;;;;;;;;;;;;;-1:-1:-1;34874:24:0;34854:44;34834:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34582:361;;;;;:::o;35361:195::-;35469:12;;;35431;35469;;;;;;;;;35448:7;;;;35462:5;;35448:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35430:52;;;35501:7;35493:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35361:195;;;:::o;31739:521::-;31832:14;31878:1;31867:8;:12;31859:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31960:1;31948:9;:13;:31;;;;;31978:1;31965:10;:14;31948:31;31940:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32037:20;32060:17;:8;32073:3;32060:12;:17::i;:::-;32037:40;-1:-1:-1;32088:14:0;32105:31;32037:40;32125:10;32105:19;:31::i;:::-;32088:48;-1:-1:-1;32147:16:0;32166:40;32190:15;32166:19;:9;32180:4;32166:13;:19::i;:::-;:23;;:40::i;:::-;32147:59;;32241:11;32229:9;:23;;;;;;;31739:521;-1:-1:-1;;;;;;;31739:521:0:o;32939:513::-;33040:21;33097:1;33082:4;:11;:16;;33074:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33167:4;:11;33156:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33156:23:0;;33146:33;;33203:8;33190:7;33198:1;33190:10;;;;;;;;;;;;;:21;;;;;33227:6;33222:223;33253:1;33239:4;:11;:15;33235:1;:19;33222:223;;;33277:14;33293:15;33312:42;33324:7;33333:4;33338:1;33333:7;;;;;;;;;;;;;;33342:4;33347:1;33351;33347:5;33342:11;;;;;;;;;;;;;;33312;:42::i;:::-;33276:78;;;;33386:47;33399:7;33407:1;33399:10;;;;;;;;;;;;;;33411:9;33422:10;33386:12;:47::i;:::-;33369:7;33377:1;33381;33377:5;33369:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;33256:3:0;;33222:223;;;;32939:513;;;;;:::o;30268:460::-;30357:12;30383:14;30399;30417:26;30428:6;30436;30417:10;:26::i;:::-;30581:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30571:43;;;;;;30484:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30474:244;;;;;;;;;30268:460;-1:-1:-1;;;;;30268:460:0:o;34951:402::-;35176:51;;;35165:10;35176:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35165:63;;;;35130:12;;35144:17;;35165:10;;;;35176:51;35165:63;;;35176:51;35165:63;;35176:51;35165:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35129:99;;;;35247:7;:57;;;;-1:-1:-1;35259:11:0;;:16;;:44;;;35290:4;35279:24;;;;;;;;;;;;;;;-1:-1:-1;35279:24:0;35259:44;35239:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34951:402;;;;;;:::o;18736:743::-;18843:6;18838:634;18869:1;18855:4;:11;:15;18851:1;:19;18838:634;;;18893:13;18908:14;18927:4;18932:1;18927:7;;;;;;;;;;;;;;18936:4;18941:1;18945;18941:5;18936:11;;;;;;;;;;;;;;18892:56;;;;18964:14;18983:44;19013:5;19020:6;18983:29;:44::i;:::-;18963:64;;;19042:14;19059:7;19067:1;19071;19067:5;19059:14;;;;;;;;;;;;;;19042:31;;19089:15;19106;19134:6;19125:15;;:5;:15;;;:61;;19167:9;19183:1;19125:61;;;19149:1;19153:9;19125:61;19088:98;;;;19201:10;19232:1;19218:4;:11;:15;19214:1;:19;:84;;19295:3;19214:84;;;19236:56;19263:7;19272:6;19280:4;19285:1;19289;19285:5;19280:11;;;;;;;;;;;;;;19236:26;:56::i;:::-;19201:97;;19330:50;19357:7;19366:5;19373:6;19330:26;:50::i;:::-;19313:73;;;19405:10;19417;19429:2;19443:1;19433:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19433:12:0;;19313:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18872:3:0;;;;;-1:-1:-1;18838:634:0;;-1:-1:-1;;;;;;;;18838:634:0;;;18736:743;;;:::o;33533:534::-;33634:21;33691:1;33676:4;:11;:16;;33668:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33761:4;:11;33750:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33750:23:0;;33740:33;;33814:9;33784:7;33809:1;33792:7;:14;:18;33784:27;;;;;;;;;;;;;;;;;:39;33848:11;;:15;;33834:226;33865:5;;33834:226;;33893:14;33909:15;33928:42;33940:7;33949:4;33958:1;33954;:5;33949:11;;;;;;;;;;;;;;33962:4;33967:1;33962:7;;;;;;;33928:42;33892:78;;;;34002:46;34014:7;34022:1;34014:10;;;;;;;;;;;;;;34026:9;34037:10;34002:11;:46::i;:::-;33985:7;33997:1;33993;:5;33985:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;33872:3:0;;33834:226;;24125:1226;24238:6;24233:1111;24264:1;24250:4;:11;:15;24246:1;:19;24233:1111;;;24288:13;24303:14;24322:4;24327:1;24322:7;;;;;;;;;;;;;;24331:4;24336:1;24340;24336:5;24331:11;;;;;;;;;;;;;;24287:56;;;;24359:14;24378:44;24408:5;24415:6;24378:29;:44::i;:::-;24358:64;;;24437:21;24478:50;24505:7;24514:5;24521:6;24478:26;:50::i;:::-;24437:92;;24544:16;24575:17;24663:13;24678;24696:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24696:18:0;;;;;;;24662:52;;;;;-1:-1:-1;24662:52:0;;-1:-1:-1;24730:17:0;;24771:15;;;;;;;;:61;;24813:8;24823;24771:61;;;24790:8;24800;24771:61;24729:103;;;;24861:56;24904:12;24868:5;24861:23;;;24893:4;24861:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:56;24847:70;;24947:73;24979:11;24992:12;25006:13;24947:31;:73::i;:::-;24932:88;;24233:1111;;;;25051:15;25068;25096:6;25087:15;;:5;:15;;;:67;;25132:12;25151:1;25087:67;;;25111:1;25115:12;25087:67;25050:104;;;;25169:10;25200:1;25186:4;:11;:15;25182:1;:19;:84;;25263:3;25182:84;;;25204:56;25231:7;25240:6;25248:4;25253:1;25257;25253:5;25248:11;;;;;;;25204:56;25319:12;;;25329:1;25319:12;;;;;;;;;;25281:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;25169:97;;-1:-1:-1;25281:9:0;;;;;;25291:10;;25303;;25169:97;;25319:12;;25281:51;;;;;;;;25319:12;;25281:51;;;;25319:12;;25281:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24267:3:0;;;;;-1:-1:-1;24233:1111:0;;-1:-1:-1;;;;;;;;;;24233:1111:0;29370:129;29454:5;;;29449:16;;;;29441:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32381:476;32474:13;32520:1;32508:9;:13;32500:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32603:1;32591:9;:13;:31;;;;;32621:1;32608:10;:14;32591:31;32583:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32680:14;32697:34;32726:4;32697:24;:9;32711;32697:13;:24::i;:::-;:28;;:34::i;:::-;32680:51;-1:-1:-1;32742:16:0;32761:34;32791:3;32761:25;:10;32776:9;32761:14;:25::i;:34::-;32742:53;;32817:32;32847:1;32830:11;32818:9;:23;;;;;;;32817:29;:32::i;:::-;32806:43;32381:476;-1:-1:-1;;;;;;32381:476:0:o;31292:325::-;31374:12;31417:1;31407:7;:11;31399:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31492:1;31481:8;:12;:28;;;;;31508:1;31497:8;:12;31481:28;31473:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31601:8;31577:21;:7;31589:8;31577:11;:21::i;:::-;:32;;;;;;;31292:325;-1:-1:-1;;;;31292:325:0:o;29823:353::-;29898:14;29914;29959:6;29949:16;;:6;:16;;;;29941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30048:6;30039:15;;:6;:15;;;:53;;30077:6;30085;30039:53;;;30058:6;30066;30039:53;30020:72;;-1:-1:-1;30020:72:0;-1:-1:-1;30111:20:0;;;30103:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29823:353;;;;;:::o;11017:1404::-;11235:12;11249;11394:1;11330:66;;11350:7;11330:36;;;11367:6;11375;11330:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11330:52:0;:66;;;11326:154;;;11433:7;11413:39;;;11453:6;11461;11413:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11326:154:0;11491:13;11506;11523:55;11554:7;11563:6;11571;11523:30;:55::i;:::-;11490:88;;;;11593:8;11605:1;11593:13;:30;;;;-1:-1:-1;11610:13:0;;11593:30;11589:825;;;11662:14;;-1:-1:-1;11678:14:0;;-1:-1:-1;11589:825:0;;;11726:19;11748:60;11773:14;11789:8;11799;11748:24;:60::i;:::-;11726:82;;11845:14;11827;:32;11823:580;;11906:10;11888:14;:28;;11880:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12002:14;;-1:-1:-1;12018:14:0;-1:-1:-1;12018:14:0;11823:580;;;12074:19;12096:60;12121:14;12137:8;12147;12096:24;:60::i;:::-;12074:82;;12200:14;12182;:32;;12175:40;;;;12260:10;12242:14;:28;;12234:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12356:14;-1:-1:-1;12372:14:0;;-1:-1:-1;11823:580:0;11589:825;;11017:1404;;;;;;;;;;;:::o;29507:142::-;29559:6;29586;;;:30;;-1:-1:-1;;29601:5:0;;;29615:1;29610;29601:5;29610:1;29596:15;;;;;:20;29586:30;29578:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29234:128;29318:5;;;29313:16;;;;29305:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30786:393;30879:13;30894;30921:14;30940:26;30951:6;30959;30940:10;:26::i;:::-;30920:46;;;30978:13;30993;31028:32;31036:7;31045:6;31053;31028:7;:32::i;:::-;31011:62;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31011:64:0;;;;;;;30977:98;;;;;-1:-1:-1;30977:98:0;;-1:-1:-1;31109:16:0;;;;;;;;:62;;31152:8;31162;31109:62;;;31129:8;31139;31109:62;31086:85;;;;-1:-1:-1;30786:393:0;-1:-1:-1;;;;;;;30786:393:0:o

Swarm Source

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