Contract 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xec80c1ba5196e4a432deac2fb3ed1128b19164b44c8327f29c73900ff4d9c85fRemove Liquidity...113028872021-09-28 8:22:268 mins agoBubba: Deployer IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00235381
0xa21f53482d7ad1fe5f6ac87c0b7514353fce15ab6026d9b797cd50bba0ca89d4Swap Exact Token...113028562021-09-28 8:20:5210 mins ago0x1d787485f43f7720ebf97e2a9bb0f735fe4c404a IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000590245
0x72053a3d3912354e68df93cca5f608380a97915faa26ab0a6feaa835a5a2cf93Swap Exact Token...113028362021-09-28 8:19:5211 mins ago0x1d787485f43f7720ebf97e2a9bb0f735fe4c404a IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000590065
0x59a90b5cba54ed7e8f2ec11d4da086041f347a178c72b08c2a48ed61a61ab269Swap Exact Token...113027442021-09-28 8:15:1615 mins ago0xdebaff32be9a6b84e4aa4e3095c172b9b2fd7747 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00111156
0xdb0157240978aad0b5915514ee55f1f2a4edd9c2fea35aef390bc7d5bf85f33fSwap Exact Token...113026292021-09-28 8:09:2721 mins ago0xb9c18722a295d8e69169c20c7829a00a51c3fe4a IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00052774
0x402141cdf1c132834b88c702c63772d1093c98da1962cf1681a3a3ee5454aac6Swap Exact Token...113023752021-09-28 7:56:4534 mins ago0xaba9fad0213774fa1e58dc1eaa1417394f748a0f IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000665065
0xcf7099ad2446318b1f2f5c15c99dd506cac3a10a0d44dabd814789e88a412f79Add Liquidity ET...113023632021-09-28 7:56:0934 mins ago0x825c2fa4e506bd0021e003b3cdcc645896b3d489 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.185196203220877 BNB0.00094603
0xab7fbf8e71f496b67b43a12c7567f6221415736458055259bc6765f1e66384f1Swap Exact Token...113023442021-09-28 7:55:1235 mins ago0x825c2fa4e506bd0021e003b3cdcc645896b3d489 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000665005
0xf200728cb656ee40d394d0ba85981dc62414f4b859c0b2290ee472809e76a3c8Swap Exact Token...113023382021-09-28 7:54:5435 mins ago0x351a6b44ac100fad59182778492be6a430b35987 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000677525
0x0f70bce3dac8f81d7a2ef68d50a6787b52ac55bc31695dc33f5f8d73e7dcdb4cAdd Liquidity113023232021-09-28 7:54:0936 mins ago0xc676c2ee8932d8d84692161669891daf39c98d45 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00098392
0xbbb62e410f1af30083746034dbf76304bf3b6edc463cc3d11d739c44fb045187Swap Exact Token...113021332021-09-28 7:44:0546 mins ago0xcd3d5ad497624b0104cc3d70198ab023f96b146d IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000527625
0xdfc4e6940640c113b0d00bf2b7cfec1401b46092301855ed539e08371fbb549cSwap Tokens For ...113020972021-09-28 7:42:1748 mins ago0xaba9fad0213774fa1e58dc1eaa1417394f748a0f IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000602535
0xa28ae1ea2f318c1866859bdc2fd785c015d045ac12ffd78f2537a38755d8e2e9Remove Liquidity113019402021-09-28 7:34:2656 mins ago0xb69e5ae337f23971589fa639fbe008ea9aa4370d IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000867255
0xad697d5f0a267c8157ac11169596339f24f4f899f861598aef9f2625413683ceAdd Liquidity113015662021-09-28 7:15:171 hr 15 mins ago0x2c1ea614c49691d5139ffa6c7f9bc063c36de771 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000852995
0xc7d50ad0e339108349b9f4f5a75ce3b1d84c08ae3886894903b928af4c566d1fRemove Liquidity113014612021-09-28 7:10:021 hr 20 mins ago0xbe62f5d285087505a6281cbcf7f124b229191233 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00082057
0xa128ffc4d65e1d65e64675c4424923792c3e28e773e590666a6783c0582b2d80Swap Exact Token...113014402021-09-28 7:08:591 hr 21 mins ago0x850446fd556775ff1ce4f49b0e0c9835edda1810 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00111116
0x6778d737731591ede74333d2bfd398e24fa395ed9698d2fa9edf9b0790f1cc55Add Liquidity113013002021-09-28 7:01:591 hr 28 mins ago0x6dea7a140c56abcfe7ad28c56b8f32d9067e1759 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.0009075
0x891dfcfd6085b1a53d6ba7166e360486a03da35ccfc6405f0ba5846c350512a5Swap Exact Token...113012772021-09-28 7:00:501 hr 30 mins ago0x9933f5fc07524099bec6a0c1fd610b8d8680cf39 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00111116
0xc329bbc6719e656ae36aba2acdd299a67f728aa7e698539480ff000e0a7ed55bSwap Exact Token...113006672021-09-28 6:30:142 hrs ago0x34107ec192d732de1c4704cd11d6649917bcf584 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000665065
0xcf16f51725a27b89379772cec830fbaeb40b48f550ef04e7f73316783f4144e7Add Liquidity ET...113005782021-09-28 6:25:472 hrs 5 mins ago0x8fb6765acbc84341f94efd14c4f190590ab23983 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.400846881372144 BNB0.000816585
0x3b98f3aa0be3bad2019ef6f50ddb2dc4ae1ea892b35b2148bb38a42a1f15980dAdd Liquidity ET...113005422021-09-28 6:23:592 hrs 6 mins ago0x6c32b4bb473fe3e2d699973b68e3b97eb85ba0d6 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef1.138796089679039 BNB0.00087109
0xc472c324bf1799c1090191871ca42c39465a9026e3d2f91df7a54e12c343ca3dSwap Exact Token...113004372021-09-28 6:18:442 hrs 12 mins ago0x6c32b4bb473fe3e2d699973b68e3b97eb85ba0d6 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.00126115
0xda69f6652c4d44d429e86e2fddf9c10f0c2aa83e28b54f9ba8bc5ae395e2ddbeAdd Liquidity ET...113002552021-09-28 6:09:382 hrs 21 mins ago0x6c32b4bb473fe3e2d699973b68e3b97eb85ba0d6 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.025749634404387 BNB0.00087103
0x4146304a367a1b30bc0509a140ca6c166c2167a4fa5aecb758647203c4a3ca24Swap Exact ETH F...113002212021-09-28 6:07:562 hrs 22 mins ago0x6c32b4bb473fe3e2d699973b68e3b97eb85ba0d6 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.025 BNB0.000573785
0x39e0e9625272e155d87cbd248261a049b4754c5f09d21d5a79e8cefaf600e8a3Add Liquidity113000612021-09-28 5:59:562 hrs 30 mins ago0x873c472d345eada9fbd6621992f20b80e0cac672 IN  0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0 BNB0.000928075
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xec80c1ba5196e4a432deac2fb3ed1128b19164b44c8327f29c73900ff4d9c85f113028872021-09-28 8:22:268 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47efBubba: Deployer0.042371498779202398 BNB
0xec80c1ba5196e4a432deac2fb3ed1128b19164b44c8327f29c73900ff4d9c85f113028872021-09-28 8:22:268 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.042371498779202398 BNB
0xa21f53482d7ad1fe5f6ac87c0b7514353fce15ab6026d9b797cd50bba0ca89d4113028562021-09-28 8:20:5210 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x1d787485f43f7720ebf97e2a9bb0f735fe4c404a2.481934908142798723 BNB
0xa21f53482d7ad1fe5f6ac87c0b7514353fce15ab6026d9b797cd50bba0ca89d4113028562021-09-28 8:20:5210 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef2.481934908142798723 BNB
0x72053a3d3912354e68df93cca5f608380a97915faa26ab0a6feaa835a5a2cf93113028362021-09-28 8:19:5211 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x1d787485f43f7720ebf97e2a9bb0f735fe4c404a0.66586031416205204 BNB
0x72053a3d3912354e68df93cca5f608380a97915faa26ab0a6feaa835a5a2cf93113028362021-09-28 8:19:5211 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.66586031416205204 BNB
0xa6ec247337cd407049cb38e803103f45c6276d0a15e995c34c83499ddefa52b9113026492021-09-28 8:10:3120 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token2.238362805720497812 BNB
0xa6ec247337cd407049cb38e803103f45c6276d0a15e995c34c83499ddefa52b9113026492021-09-28 8:10:3120 mins ago 0xee6db2cc1ed15424a00e62ccdfe23397b54aab89 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef2.238362805720497812 BNB
0x402141cdf1c132834b88c702c63772d1093c98da1962cf1681a3a3ee5454aac6113023752021-09-28 7:56:4534 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0xaba9fad0213774fa1e58dc1eaa1417394f748a0f0.193894572194345407 BNB
0x402141cdf1c132834b88c702c63772d1093c98da1962cf1681a3a3ee5454aac6113023752021-09-28 7:56:4534 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.193894572194345407 BNB
0xcf7099ad2446318b1f2f5c15c99dd506cac3a10a0d44dabd814789e88a412f79113023632021-09-28 7:56:0934 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.185196203220877466 BNB
0xab7fbf8e71f496b67b43a12c7567f6221415736458055259bc6765f1e66384f1113023442021-09-28 7:55:1235 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x825c2fa4e506bd0021e003b3cdcc645896b3d4890.186261158768522709 BNB
0xab7fbf8e71f496b67b43a12c7567f6221415736458055259bc6765f1e66384f1113023442021-09-28 7:55:1235 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.186261158768522709 BNB
0x85e59869c60717e8d3c065e4356c5e53680df5efc3622453cf5e58465c49d77f113022452021-09-28 7:49:5341 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.523787463189440727 BNB
0x85e59869c60717e8d3c065e4356c5e53680df5efc3622453cf5e58465c49d77f113022452021-09-28 7:49:5341 mins ago 0xee6db2cc1ed15424a00e62ccdfe23397b54aab89 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.523787463189440727 BNB
0xb4c8e2b98a0d17e1c22a69abc674c2dc461968e05f8853cd35d65041159c1f2d113022202021-09-28 7:48:2942 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token3.430241363039185016 BNB
0xb4c8e2b98a0d17e1c22a69abc674c2dc461968e05f8853cd35d65041159c1f2d113022202021-09-28 7:48:2942 mins ago 0xee6db2cc1ed15424a00e62ccdfe23397b54aab89 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef3.430241363039185016 BNB
0x1db6ec43b7b2e8558f77520fd479b391692e9e1d45c825c15e9641018531915c113011632021-09-28 6:55:081 hr 35 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0xee6db2cc1ed15424a00e62ccdfe23397b54aab891.388529023344599862 BNB
0x1db6ec43b7b2e8558f77520fd479b391692e9e1d45c825c15e9641018531915c113011632021-09-28 6:55:081 hr 35 mins ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef1.388529023344599862 BNB
0xd7692a797f4e06bc6ded36083d20c473e8b80039fe880b21c0495fae8e1a3f4b113010462021-09-28 6:49:171 hr 41 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token2.077739550010541023 BNB
0xd7692a797f4e06bc6ded36083d20c473e8b80039fe880b21c0495fae8e1a3f4b113010462021-09-28 6:49:171 hr 41 mins ago 0xee6db2cc1ed15424a00e62ccdfe23397b54aab89 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef2.077739550010541023 BNB
0xc329bbc6719e656ae36aba2acdd299a67f728aa7e698539480ff000e0a7ed55b113006672021-09-28 6:30:142 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0x34107ec192d732de1c4704cd11d6649917bcf5840.111166229280309112 BNB
0xc329bbc6719e656ae36aba2acdd299a67f728aa7e698539480ff000e0a7ed55b113006672021-09-28 6:30:142 hrs ago Binance: WBNB Token 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.111166229280309112 BNB
0xcf16f51725a27b89379772cec830fbaeb40b48f550ef04e7f73316783f4144e7113005782021-09-28 6:25:472 hrs 5 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token0.400846881372144955 BNB
0x3b98f3aa0be3bad2019ef6f50ddb2dc4ae1ea892b35b2148bb38a42a1f15980d113005422021-09-28 6:23:592 hrs 6 mins ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef Binance: WBNB Token1.138796089679039124 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 Security Audit

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

-----Decoded View---------------
Arg [0] : _factory (address): 0x4e66fda7820c53c1a2f601f84918c375205eac3e
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----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.