Contract 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff 12

Contract Overview

Balance:
17.569078786014845154 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7d976893d1d9159fa7406789e784c53aa5a8283756219031fe82f7e702451a59Swap Exact Token...264277152022-05-23 6:03:552 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0001642845 1.500000009
0xf01e1cf5cc7e51add424e80f73113d68437e9bae8e6f06c42eda48b29e331e11Swap Exact Token...264276632022-05-23 5:59:342 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0001642845 1.500000009
0x2affca17eec6192fe6535920bb3f63fd6fbc0793895186acb766ddde7fecf860Approve264276292022-05-23 5:55:132 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00010924 5
0xb93b87e9bd96e3d32f743196895b38b40b677bb9de62c0f33d1a3a923a051eacSwap Exact Token...264276042022-05-23 5:51:032 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0000617685 1.500000009
0x2f8734fa5379cfc822dfcc394e68f6b96f275ca7b46bbfa1864a2241684e371aApprove264275872022-05-23 5:48:132 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00010924 5
0xacf33306bc44f86957b54121ac253519fa54638fc14e3c26ced21b3841fc87a3Approve264275792022-05-23 5:47:122 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00010924 5
0x2b0908db9da934c99b43b95a8f7392a75ede0e03d2f2c2d0bf6ca615a39a3e85Approve264275732022-05-23 5:46:422 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00010924 5
0x7c9f58013be17d39630b2266412301c84598c993bd0232a461a01f230c77645cApprove264275622022-05-23 5:45:472 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00010924 5
0x765193efbcb9536e6420e8c169666afd94b5953bff218a705c0d2df555173896Swap Exact Token...264275042022-05-23 5:40:562 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0000617685 1.500000009
0xc95a84e76033f08aa1a937fdce779274925f8fb1bac154dde0966df12783874aSwap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00047076 20
0x4717b8aefe6a98052bfa298c80d2077c64f09617f5606b25381855e16bbcecd8Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.000471 20
0xe72533c430c46e8659a1bf9724462738c6c7c432472aa95dc62351f703e18235Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.000471 20
0x931ab1fdd21131e2b57778257c5a86df54e7a34dba470f9714520a518401ef84Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0002355 10
0x7b3f0e57eb2e16e4ea38e46270f6b8563c40cca045de8b61736e7014b15cf972Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00016868634.1
0xa017dc2d019dee703d10e23029fca4250611c1becf342ea60416d176f65f5d2cSwap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00016868634.1
0x5657b8459e41cd6403cd6c79cd9949ab0f23f3cf2fb9d85707c529e912073264Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00016868634.1
0x8e7f473b6d9beb44894f2ad80fa5ce8d3014e78409d731921a9243ae03d224b1Swap Exact Token...264274852022-05-23 5:39:212 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.000047328 1.500000009
0x924b235164f7051d9429c10a0fb90811346103030c0982040c85c5c95a3d740fSwap Exact Token...264274652022-05-23 5:37:412 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0000375 1.500000009
0x9313eca8eeebf4200259ba1d1a0720fa89b08e04533e88723ebb4efc2480a59bSwap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00016868634.1
0x0139f2e55759b599bc9d581e8ddea2189db280316b848a52af649e38e39e2ee5Swap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.0001132014.1
0x4a3d007b4ede44be8ab4f296fa827bac8b220fe17be8aa874d701577f9f41ffcSwap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00009660424.1
0xa84e4376f88ac6f055cbbd74e17c13d0cf9bf90b76b269a539a747ed41592e0dSwap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00009660424.1
0x8e2e29030140bcb52917dacb1c74501b2dbde833ada32a75dd3d0314620a0e96Swap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00009660424.1
0xb0b8d5af89cb621e3cff01b315a23d8114f7f161dc989fbad31dfc2cff73b127Swap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00009660424.1
0xe348635016c5ce1b1e6092ea0f42a37e4fa0d927ee678c0e321151839c71032eSwap Exact Token...264273712022-05-23 5:28:092 days 11 hrs ago0x866f02818a9a13341f850abdf5205f2e3f008324 IN 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0 MATIC0.00009791624.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8aa7e56a7263dd9afe61446d7178f963988c14b2db7658ba2ea6fee5f6bdfbdf263023732022-05-13 4:09:3812 days 13 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.001 MATIC
0x17d680b619414b313421ec4b6cc30d01ba2c265f72cc6009238a77b86ea9aeba262941152022-05-12 9:29:2213 days 7 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.01 MATIC
0x91090dc39cc3b142ee6a399ad13bfe5a7352d2626165157a0f4fc12521d279c9262939572022-05-12 9:10:5013 days 8 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12701 MATIC
0x11bf7d19a6cc29cc8be63ae9ffc8b030927ebf1f5ad760bc0828107aca8de6ed262261842022-05-06 10:37:5719 days 6 hrs ago 0x6003d361fdb808fd1a28f619285070a5132871d00xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0x279d2721c4cf1c074173dcb6728275f5610e441d59786b68465c800921e437db262260482022-05-06 10:21:1319 days 6 hrs ago 0x6003d361fdb808fd1a28f619285070a5132871d00xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0xa196dca682f3056611ab32df0a9c8db62a76fec9bf04bda61de4b1c0ff4dcb8f262257482022-05-06 9:52:1919 days 7 hrs ago 0x47748cfc0774cedb2fc33f6e4e0159cdf25744ba0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0x5ee3ae5e7ffbaab14592feba8425b59e09ef2293034ed4d1db29b302cede5f62262256282022-05-06 9:40:3119 days 7 hrs ago 0x238b4e03a04e334da96d4a3edfe6cc8808ec849a0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0x3f1b649f7c9d9015febc6454e793d28dd4729c580142be5067de5cf8cfc59b52261908862022-05-03 21:49:2021 days 19 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.01 MATIC
0x3f1b649f7c9d9015febc6454e793d28dd4729c580142be5067de5cf8cfc59b52261908862022-05-03 21:49:2021 days 19 hrs ago 0x3a1aa3da47e30252bba5ce6059ddc63eb1da54350xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0xbddaa0a45ea781bad31f7c9c6a5a5ab6382628fb6c6f705615f37e062757824b261905422022-05-03 21:15:1121 days 19 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.01 MATIC
0xbddaa0a45ea781bad31f7c9c6a5a5ab6382628fb6c6f705615f37e062757824b261905422022-05-03 21:15:1121 days 19 hrs ago 0x3f1ab5ad68020245d1c1b0daffd0d758c673011d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.01 MATIC
0x978b133623f2eb0f9553c017567e76bf08240c160ad896ae3bebbadffe21ccdd261328112022-04-29 14:24:0226 days 2 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12702 MATIC
0x14f311db27f37141cb82c6203c63d2f6b34bc07c9203ae919fcb1480744c2ce3260323982022-04-22 1:01:2933 days 16 hrs ago 0xc25e70eb8eec828d14aa312bc9b82ca530df5e240xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00032 MATIC
0x92cdfa94ddd5e09d145956f83c88965671faede0387f07599174f45eaa471163259507552022-04-15 22:59:1139 days 18 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.0001625 MATIC
0x99a031588601ed9ee26950217e3fb0963321bb3f91adf93c33f9b6366416679f259506362022-04-15 22:46:1439 days 18 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00000875 MATIC
0x9334ecdcdf67492a9c581a07664321cc12d6f27d3e261c74b42aa42f38530274259438812022-04-15 10:08:5340 days 7 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00001625 MATIC
0x3bc5174772727c17c5749f7ef15854d1946ec4c5f63fdc42ff364360cb0c87d9259437912022-04-15 10:00:3140 days 7 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00000875 MATIC
0x988e21623c4b87e6dfc25024cb7752a9eaadd35bb13037edb9d448527ed01f01259436132022-04-15 9:45:2040 days 7 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.0175 MATIC
0xe9abb91f3b3b99f976726eab0ea686c737dfaa031f2614226e3fb7032931f679259435942022-04-15 9:42:1040 days 7 hrs ago 0x2f2265257bb8c75dc51b575341d975e87cb4229d0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00325 MATIC
0xa100cc1decdb5e35e1cf56f313ea85bc0ddee2232fead9da29cdf7ea6ba6aec0259287912022-04-14 7:33:1841 days 9 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.000000005 MATIC
0xa100cc1decdb5e35e1cf56f313ea85bc0ddee2232fead9da29cdf7ea6ba6aec0259287912022-04-14 7:33:1841 days 9 hrs ago 0xd21609496eccbdc0a35a32e9a360dbd861fbfc3f0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.000000005 MATIC
0x5a9f9ae0c0d4c8a04046744a8dc0e754c10bb23ff767eb5ba5c77a42a2f82368259282932022-04-14 6:51:3241 days 10 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12700.00015 MATIC
0x5a9f9ae0c0d4c8a04046744a8dc0e754c10bb23ff767eb5ba5c77a42a2f82368259282932022-04-14 6:51:3241 days 10 hrs ago 0x01bb901250936b4dbaf2d462aacf3f56d892fc200xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0.00015 MATIC
0x3b1335c1c6d00e800a85754bf7fcd9ac47b81e650a7fc936091720757dc6bd9e255357222022-03-16 8:11:4170 days 9 hrs ago 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff0x0d500b1d8e8ef31e21c99d1db9a6444d3adf12701 MATIC
0x3b1335c1c6d00e800a85754bf7fcd9ac47b81e650a7fc936091720757dc6bd9e255357222022-03-16 8:11:4170 days 9 hrs ago 0xdec5d3e1233db8e7bd831b5ef930081d3f807b820xa5e0829caced8ffdd4de3c43696c57f7d7a678ff1 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-12-10
*/

/**
 *Submitted for verification at polygonscan.com on 2021-05-18
*/

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

pragma solidity >=0.5.0;

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

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

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: @uniswap/lib/contracts/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

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

// File: contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

// File: contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

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

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

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

// File: contracts/libraries/UniswapV2Library.sol

pragma solidity >=0.5.0;



library UniswapV2Library {
    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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: 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'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
            ))));
    }

    // 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,) = IUniswapV2Pair(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, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: 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, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: 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, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: 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, 'UniswapV2Library: 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, 'UniswapV2Library: 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);
        }
    }
}

// File: contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts/UniswapV2Router02.sol

pragma solidity =0.6.6;








contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: 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 (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: 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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: 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 = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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 = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(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,) = UniswapV2Library.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 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.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 = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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 = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.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, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.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,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.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 = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.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, UniswapV2Library.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,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(UniswapV2Library.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,
            'UniswapV2Router: 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, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: 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 UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

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"}]

60c06040523480156200001157600080fd5b506040516200573e3803806200573e833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155b762000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb528061444a528061448d52806147ed52806149ce5280614f49528061502a52806150aa52506155b76000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613cff565b50965096945050505050565b6000610f44848484613e3c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140c6565b8560008151811061124a57fe5b60200260200101516141b1565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614381915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613cff565b509695505050505050565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484614608565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140c6565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61183d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140c6565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6141b1565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614796915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b2916565b1015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614796915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613cff565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b5095945050505050565b6000610f44848484614b9b565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6126027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614cbf565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613cff565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614796915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140c6565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d9f565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154bf6026913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154256026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f60565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140c6565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614ef2565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140c6565b90506132db8d3383886141b1565b6132e78c3383876141b1565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614ef2565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140c6565b90506134aa8b3383886141b1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613cff565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6138867f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613cff565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613cf857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d39565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dd8576040519150601f19603f3d011682016040523d82523d6000602084013e613ddd565b606091505b5050905080613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154e56023913960400191505060405180910390fd5b505050565b6000808411613e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615557602b913960400191505060405180910390fd5b600083118015613ea65750600082115b613efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b6000613f0f856103e563ffffffff6151f316565b90506000613f23828563ffffffff6151f316565b90506000613f4983613f3d886103e863ffffffff6151f316565b9063ffffffff61527916565b9050808281613f5457fe5b04979650505050505050565b6060600282511015613fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613feb57600080fd5b50604051908082528060200260200182016040528015614015578160200160208202803683370190505b509050828160008151811061402657fe5b60200260200101818152505060005b60018351038110156140be576000806140788786858151811061405457fe5b602002602001015187866001018151811061406b57fe5b60200260200101516152eb565b9150915061409a84848151811061408b57fe5b60200260200101518383613e3c565b8484600101815181106140a957fe5b60209081029190910101525050600101614035565b509392505050565b60008060006140d58585614d9f565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061428f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614252565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b5091509150818015614324575080511580614324575080806020019051602081101561432157600080fd5b50515b614379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806155336024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156146025760008084838151811061439f57fe5b60200260200101518584600101815181106143b657fe5b60200260200101519150915060006143ce8383614d9f565b50905060008785600101815181106143e257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461442a5782600061442e565b6000835b91509150600060028a510388106144455788614486565b6144867f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061447957fe5b60200260200101516140c6565b90506144b37f000000000000000000000000000000000000000000000000000000000000000088886140c6565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144fd576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614588578181015183820152602001614570565b50505050905090810190601f1680156145b55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145d757600080fd5b505af11580156145eb573d6000803e3d6000fd5b505060019099019850614384975050505050505050565b50505050565b606060028251101561467b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561469357600080fd5b506040519080825280602002602001820160405280156146bd578160200160208202803683370190505b50905082816001835103815181106146d157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140be576000806147318786600186038151811061471d57fe5b602002602001015187868151811061406b57fe5b9150915061475384848151811061474457fe5b60200260200101518383614b9b565b84600185038151811061476257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614701565b60005b6001835103811015613e37576000808483815181106147b457fe5b60200260200101518584600101815181106147cb57fe5b60200260200101519150915060006147e38383614d9f565b50905060006148137f000000000000000000000000000000000000000000000000000000000000000085856140c6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561486157600080fd5b505afa158015614875573d6000803e3d6000fd5b505050506040513d606081101561488b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148d55782846148d8565b83835b9150915061495d828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b955061496a868383613e3c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149ae578260006149b2565b6000835b91509150600060028c51038a106149c9578a6149fd565b6149fd7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061447957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614aad578181015183820152602001614a95565b50505050905090810190601f168015614ada5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614afc57600080fd5b505af1158015614b10573d6000803e3d6000fd5b50506001909b019a506147999950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806153d4602c913960400191505060405180910390fd5b600083118015614c055750600082115b614c5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b6000614c7e6103e8614c72868863ffffffff6151f316565b9063ffffffff6151f316565b90506000614c986103e5614c72868963ffffffff614b2916565b9050614cb56001828481614ca857fe5b049063ffffffff61527916565b9695505050505050565b6000808411614d19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154736025913960400191505060405180910390fd5b600083118015614d295750600082115b614d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b82614d8f858463ffffffff6151f316565b81614d9657fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154006025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e61578284614e64565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614eeb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614f9257600080fd5b505afa158015614fa6573d6000803e3d6000fd5b505050506040513d6020811015614fbc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150a257604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561507557600080fd5b505af1158015615089573d6000803e3d6000fd5b505050506040513d602081101561509f57600080fd5b50505b6000806150d07f00000000000000000000000000000000000000000000000000000000000000008b8b6152eb565b915091508160001480156150e2575080155b156150f2578793508692506151e6565b60006150ff898484614cbf565b905087811161516c5785811015615161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154256026913960400191505060405180910390fd5b8894509250826151e4565b6000615179898486614cbf565b90508981111561518557fe5b878110156151de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154bf6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061520e5750508082028282828161520b57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152fa8585614d9f565b50905060008061530b8888886140c6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561535057600080fd5b505afa158015615364573d6000803e3d6000fd5b505050506040513d606081101561537a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153c15780826153c4565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a26469706673582212206dd6e03c4b2c0a8e55214926227ae9e2d6f9fec2ce74a6446d615afa355c84f364736f6c634300060600330000000000000000000000005757371414417b8c6caad45baef941abc7d3ab320000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000005757371414417b8c6caad45baef941abc7d3ab320000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889

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

0000000000000000000000005757371414417b8c6caad45baef941abc7d3ab320000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000005757371414417b8c6caad45baef941abc7d3ab320000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889

-----Decoded View---------------
Arg [0] : _factory (address): 0x5757371414417b8c6caad45baef941abc7d3ab32
Arg [1] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005757371414417b8c6caad45baef941abc7d3ab32
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [2] : 0000000000000000000000005757371414417b8c6caad45baef941abc7d3ab32
Arg [3] : 0000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889


Deployed ByteCode Sourcemap

16327:18549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16809:10;:18;16823:4;16809:18;;16802:26;;;;16327:18549;;12:1:-1;9;2:12;20959:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20959:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20959:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33820:262;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33820:262:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33820:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28128:850;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28128:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28128:850:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28128:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28128:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28128:850:0;;-1:-1:-1;28128:850:0;-1:-1:-1;28128:850:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28128:850:0;;;;;;;;;;;;;;;;;34620:253;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34620:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34620:253:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34620:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34620:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34620:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34620:253:0;;-1:-1:-1;34620:253:0;;-1:-1:-1;;;;;34620:253:0:i;21638:677::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21638:677:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21638:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25345:628::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25345:628:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25345:628:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25345:628:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25345:628:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25345:628:0;;-1:-1:-1;25345:628:0;-1:-1:-1;25345:628:0;;;;;;;;;:::i;27294:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27294:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27294:828:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27294:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27294:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27294:828:0;;-1:-1:-1;27294:828:0;-1:-1:-1;27294:828:0;;;;;;;;;:::i;23775:718::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23775:718:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23775:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31161:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31161:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31161:714:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31161:714:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31161:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31161:714:0;;-1:-1:-1;31161:714:0;-1:-1:-1;31161:714:0;;;;;;;;;:::i;32737:843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32737:843:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32737:843:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32737:843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32737:843:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32737:843:0;;-1:-1:-1;32737:843:0;-1:-1:-1;32737:843:0;;;;;;;;;:::i;26591:697::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26591:697:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26591:697:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26591:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26591:697:0;;-1:-1:-1;26591:697:0;-1:-1:-1;26591:697:0;;;;;;;;;:::i;34090:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34090:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34090:261:0;;;;;;;;;;;;:::i;25979:606::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25979:606:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25979:606:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25979:606:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25979:606:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25979:606:0;;-1:-1:-1;25979:606:0;-1:-1:-1;25979:606:0;;;;;;;;;:::i;16463:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16463:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33624:188;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33624:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33624:188:0;;;;;;;;;;;;:::i;23069:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23069:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23069:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31881:850::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31881:850:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31881:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31881:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31881:850:0;;-1:-1:-1;31881:850:0;-1:-1:-1;31881:850:0;;;;;;;;;:::i;20088:865::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20088:865:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20088:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16415:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16415:41:0;;;:::i;34359:253::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34359:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34359:253:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34359:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34359:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34359:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34359:253:0;;-1:-1:-1;34359:253:0;;-1:-1:-1;;;;;34359:253:0:i;22321:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22321:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22321:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18327:738::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18327:738:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18327:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19071:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;19071:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28984:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28984:810:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28984:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28984:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28984:810:0;;-1:-1:-1;28984:810:0;-1:-1:-1;28984:810:0;;;;;;;;;:::i;20959:673::-;21196:16;21214:14;21177:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21268:196:::1;21298:5;21318:4;21337:9;21361:14;21390:12;21425:4;21445:8;21268:15;:196::i;:::-;21241:223:::0;;-1:-1:-1;21241:223:0;-1:-1:-1;21475:51:0::1;21503:5:::0;21510:2;21241:223;21475:27:::1;:51::i;:::-;21543:4;21537:20;;;21558:9;21537:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21537:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21537:31:0;;;;21579:45;21610:2;21614:9;21579:30;:45::i;:::-;20959:673:::0;;;;;;;;;;:::o;33820:262::-;33973:14;34012:62;34042:8;34052:9;34063:10;34012:29;:62::i;:::-;34005:69;33820:262;-1:-1:-1;;;;33820:262:0:o;28128:850::-;28342:21;28314:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28389:29:::1;28414:4;28389:29;:4:::0;;28394:15;;;28389:21;;::::1;;;;;;;;;;;;;:29;;;28381:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28473:55;28504:7;28513:8;28523:4;;28473:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28473:30:0::1;::::0;-1:-1:-1;;;28473:55:0:i:1;:::-;28463:65;;28578:12;28547:7;28572:1;28555:7;:14;:18;28547:27;;;;;;;;;;;;;;:43;;28539:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28649:141;28695:4;;28700:1;28695:7;;;;;;;;;;;;;;;28704:10;28716:51;28741:7;28750:4;;28755:1;28750:7;;;;;;;;;;;;;;;28759:4;;28764:1;28759:7;;;;;;;;;;;;;;;28716:24;:51::i;:::-;28769:7;28777:1;28769:10;;;;;;;;;;;;;;28649:31;:141::i;:::-;28801:35;28807:7;28816:4;;28801:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28830:4:0::1;::::0;-1:-1:-1;28801:5:0::1;::::0;-1:-1:-1;;28801:35:0:i:1;:::-;28853:4;28847:20;;;28868:7;28893:1;28876:7;:14;:18;28868:27;;;;;;;;;;;;;;28847:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28847:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28847:49:0;;;;28907:63;28938:2;28942:7;28967:1;28950:7;:14;:18;28942:27;;;;;;;;;;;;;;28907:30;:63::i;:::-;28128:850:::0;;;;;;;;;:::o;34620:253::-;34764:21;34810:55;34840:7;34849:9;34860:4;34810:29;:55::i;:::-;34803:62;;34620:253;;;;;:::o;21638:677::-;21944:12;21958;21983;21998:49;22023:7;22032:6;22040;21998:24;:49::i;:::-;21983:64;;22058:10;22071;:33;;22095:9;22071:33;;;22089:2;22071:33;22115:80;;;;;;22143:10;22115:80;;;;22163:4;22115:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22058:46;;-1:-1:-1;22115:27:0;;;;;;:80;;;;;-1:-1:-1;;22115:80:0;;;;;;;;-1:-1:-1;22115:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;22115:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22115:80:0;;;;22227;22243:6;22251;22259:9;22270:10;22282;22294:2;22298:8;22227:15;:80::i;:::-;22206:101;;;;;;;;21638:677;;;;;;;;;;;;;;;;:::o;25345:628::-;25569:21;25550:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25613:55:::1;25644:7;25653:8;25663:4;;25613:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25613:30:0::1;::::0;-1:-1:-1;;;25613:55:0:i:1;:::-;25603:65;;25718:12;25687:7;25712:1;25695:7;:14;:18;25687:27;;;;;;;;;;;;;;:43;;25679:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25789:141;25835:4;;25840:1;25835:7;;;;;;25789:141;25941:24;25947:7;25956:4;;25941:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25962:2:0;;-1:-1:-1;25941:5:0::1;::::0;-1:-1:-1;;25941:24:0:i:1;27294:828::-:0;27508:21;27480:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27555:29:::1;27580:4;27555:29;:4:::0;;27560:15;;;27555:21;;::::1;;;;;;;;;;;;;:29;;;27547:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27639:55;27669:7;27678:9;27689:4;;27639:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27639:29:0::1;::::0;-1:-1:-1;;;27639:55:0:i:1;:::-;27629:65;;27727:11;27713:7;27721:1;27713:10;;;;;;;;;;;;;;:25;;27705:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23775:718:::0;24093:14;24120:12;24135:46;24160:7;24169:5;24176:4;24135:24;:46::i;:::-;24120:61;;24192:10;24205;:33;;24229:9;24205:33;;;24223:2;24205:33;24249:80;;;;;;24277:10;24249:80;;;;24297:4;24249:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24192:46;;-1:-1:-1;24249:27:0;;;;;;:80;;;;;-1:-1:-1;;24249:80:0;;;;;;;;-1:-1:-1;24249:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;24249:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24249:80:0;;;;24352:133;24414:5;24421:9;24432:14;24448:12;24462:2;24466:8;24352:47;:133::i;:::-;24340:145;23775:718;-1:-1:-1;;;;;;;;;;;;;23775:718:0:o;31161:714::-;31395:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31416:139:::1;31462:4;;31467:1;31462:7;;;;;;;;;;;;;;;31471:10;31483:51;31508:7;31517:4;;31522:1;31517:7;;;;;;;;;;;;;;;31526:4;;31531:1;31526:7;;;;;;31483:51;31536:8;31416:31;:139::i;:::-;31566:18;31594:4:::0;;31599:15;;;31594:21;;::::1;;;;;;;;;;;;;31587:39;;;31627:2;31587:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31587:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31587:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31587:43:0;31641:44:::1;::::0;;31587:43:::1;31641:44:::0;;::::1;::::0;;;;;;;;;;;31587:43;;-1:-1:-1;31641:44:0::1;::::0;;;31676:4;;;;;;31641:44;::::1;::::0;31676:4;;31641:44;31676:4;31641:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31682:2:0;;-1:-1:-1;31641:34:0::1;::::0;-1:-1:-1;;31641:44:0:i:1;:::-;31784:12:::0;31718:62:::1;31766:13:::0;31725:4;;31730:15;;;31725:21;;::::1;;;;;;;;;;;;;31718:39;;;31758:2;31718:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31718:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31718:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31718:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31696:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16627:1;31161:714:::0;;;;;;;:::o;32737:843::-;33004:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33038:29:::1;33063:4;33038:29;:4:::0;;33043:15;;;33038:21;;::::1;;;;;;;;;;;;;:29;;;33030:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33112:139;33158:4;;33163:1;33158:7;;;;;;33112:139;33262:55;33297:4;;33262:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33311:4:0::1;::::0;-1:-1:-1;33262:34:0::1;::::0;-1:-1:-1;;33262:55:0:i:1;:::-;33345:37;::::0;;;;;33376:4:::1;33345:37;::::0;::::1;::::0;;;33328:14:::1;::::0;33345:22:::1;33352:4;33345:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33345:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33345:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33345:37:0;;-1:-1:-1;33401:25:0;;::::1;;33393:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33491:4;33485:20;;;33506:9;33485:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33485:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33485:31:0;;;;33527:45;33558:2;33562:9;33527:30;:45::i;26591:697::-:0;26807:21;26779:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26865:4:::1;26854:15;;:4;;26859:1;26854:7;;;;;;;;;;;;;;;:15;;;26846:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26924:56;26955:7;26964:9;26975:4;;26924:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26924:30:0::1;::::0;-1:-1:-1;;;26924:56:0:i:1;:::-;26914:66;;27030:12;26999:7;27024:1;27007:7;:14;:18;26999:27;;;;;;;;;;;;;;:43;;26991:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27107:4;27101:19;;;27128:7;27136:1;27128:10;;;;;;;;;;;;;;27101:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27101:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27101:40:0;;;;;27165:4;27159:20;;;27180:51;27205:7;27214:4;;27219:1;27214:7;;;;;;27180:51;27233:7;27241:1;27233:10;;;;;;;;;;;;;;27159:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27159:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27159:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27159:85:0;27152:93:::1;;;;27256:24;27262:7;27271:4;;27256:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27277:2:0;;-1:-1:-1;27256:5:0::1;::::0;-1:-1:-1;;27256:24:0:i:1;:::-;26591:697:::0;;;;;;;;:::o;34090:261::-;34243:13;34281:62;34310:9;34321;34332:10;34281:28;:62::i;25979:606::-;26203:21;26184:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26247:55:::1;26277:7;26286:9;26297:4;;26247:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26247:29:0::1;::::0;-1:-1:-1;;;26247:55:0:i:1;:::-;26237:65;;26335:11;26321:7;26329:1;26321:10;;;;;;;;;;;;;;:25;;26313:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16463:38:::0;;;:::o;33624:188::-;33721:12;33753:51;33776:7;33785:8;33795;33753:22;:51::i;23069:700::-;23335:14;23316:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23378:196:::1;23408:5;23428:4;23447:9;23471:14;23500:12;23535:4;23555:8;23378:15;:196::i;:::-;23624:38;::::0;;;;;23656:4:::1;23624:38;::::0;::::1;::::0;;;23362:212;;-1:-1:-1;23585:78:0::1;::::0;-1:-1:-1;23613:5:0;;23620:2;;23624:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23624:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23624:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23624:38:0;23585:27:::1;:78::i;:::-;23680:4;23674:20;;;23695:9;23674:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23674:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23674:31:0;;;;23716:45;23747:2;23751:9;23716:30;:45::i;31881:850::-:0;32141:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32186:4:::1;32175:15;;:4;;32180:1;32175:7;;;;;;;;;;;;;;;:15;;;32167:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32235:13;32251:9;32235:25;;32277:4;32271:19;;;32298:8;32271:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32271:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32271:38:0;;;;;32333:4;32327:20;;;32348:51;32373:7;32382:4;;32387:1;32382:7;;;;;;32348:51;32401:8;32327:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32327:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32327:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32327:83:0;32320:91:::1;;;;32422:18;32450:4:::0;;32455:15;;;32450:21;;::::1;;;;;;;;;;;;;32443:39;;;32483:2;32443:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32443:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32443:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32443:43:0;32497:44:::1;::::0;;32443:43:::1;32497:44:::0;;::::1;::::0;;;;;;;;;;;32443:43;;-1:-1:-1;32497:44:0::1;::::0;;;32532:4;;;;;;32497:44;::::1;::::0;32532:4;;32497:44;32532:4;32497:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32538:2:0;;-1:-1:-1;32497:34:0::1;::::0;-1:-1:-1;;32497:44:0:i:1;:::-;32640:12:::0;32574:62:::1;32622:13:::0;32581:4;;32586:15;;;32581:21;;::::1;;;;;;;;;;;;;32574:39;;;32614:2;32574:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;20088:865:0::0;20342:12;20356;20323:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20381:12:::1;20396:49;20421:7;20430:6;20438;20396:24;:49::i;:::-;20456:62;::::0;;;;;20490:10:::1;20456:62;::::0;::::1;::::0;:33:::1;::::0;::::1;:62:::0;;;;;;;;;;;;;;20381:64;;-1:-1:-1;20456:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20456:33:0;:62;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20456:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20456:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20586:29:0::1;::::0;;;;;:25:::1;:29:::0;;::::1;;::::0;::::1;::::0;;;20556:12:::1;::::0;;;20586:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20556:12;20586:25;:29;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20586:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20586:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20586:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20586:29:0;-1:-1:-1;20627:14:0::1;20646:43;20674:6:::0;20682;20646:27:::1;:43::i;:::-;20626:63;;;20731:6;20721:16;;:6;:16;;;:58;;20762:7;20771;20721:58;;;20741:7;20750;20721:58;20700:79:::0;;-1:-1:-1;20700:79:0;-1:-1:-1;20798:21:0;;::::1;;20790:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20892:10;20881:7;:21;;20873:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16627:1;;;;20088:865:::0;;;;;;;;;;;:::o;16415:41::-;;;:::o;34359:253::-;34503:21;34549:55;34580:7;34589:8;34599:4;34549:30;:55::i;22321:669::-;22610:16;22628:14;22655:12;22670:46;22695:7;22704:5;22711:4;22670:24;:46::i;:::-;22655:61;;22727:10;22740;:33;;22764:9;22740:33;;;22758:2;22740:33;22784:80;;;;;;22812:10;22784:80;;;;22832:4;22784:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22727:46;;-1:-1:-1;22784:27:0;;;;;;:80;;;;;-1:-1:-1;;22784:80:0;;;;;;;;-1:-1:-1;22784:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;22784:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22784:80:0;;;;22902;22921:5;22928:9;22939:14;22955:12;22969:2;22973:8;22902:18;:80::i;:::-;22875:107;;;;-1:-1:-1;22321:669:0;-1:-1:-1;;;;;;;;;;;;;22321:669:0:o;18327:738::-;18615:12;18629;18643:14;18596:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18691:85:::1;18705:6;18713;18721:14;18737;18753:10;18765;18691:13;:85::i;:::-;18670:106:::0;;-1:-1:-1;18670:106:0;-1:-1:-1;18787:12:0::1;18802:49;18827:7;18836:6:::0;18844;18802:24:::1;:49::i;:::-;18787:64;;18862:66;18894:6;18902:10;18914:4;18920:7;18862:31;:66::i;:::-;18939;18971:6;18979:10;18991:4;18997:7;18939:31;:66::i;:::-;19043:4;19028:25;;;19054:2;19028:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19028:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19028:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19028:29:0;18327:738;;;;-1:-1:-1;19028:29:0;;-1:-1:-1;18327:738:0;;-1:-1:-1;;;;;;;;;18327:738:0:o;19071:974::-;19324:16;19342:14;19358;19305:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19412:176:::1;19440:5;19460:4;19479:18;19512:9;19536:14;19565:12;19412:13;:176::i;:::-;19385:203:::0;;-1:-1:-1;19385:203:0;-1:-1:-1;19599:12:0::1;19614:46;19639:7;19648:5:::0;19655:4:::1;19614:24;:46::i;:::-;19599:61;;19671:69;19703:5;19710:10;19722:4;19728:11;19671:31;:69::i;:::-;19757:4;19751:19;;;19778:9;19751:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19751:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19751:39:0;;;;;19814:4;19808:20;;;19829:4;19835:9;19808:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19808:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19808:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19808:37:0;19801:45:::1;;;;19884:4;19869:25;;;19895:2;19869:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19869:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19869:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19869:29:0;;-1:-1:-1;19949:9:0::1;:21:::0;-1:-1:-1;19945:92:0::1;;;19972:65;20003:10;20027:9;20015;:21;19972:30;:65::i;:::-;16627:1;19071:974:::0;;;;;;;;;;;:::o;28984:810::-;29197:21;29169:8;16572:15;16560:8;:27;;16552:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29255:4:::1;29244:15;;:4;;29249:1;29244:7;;;;;;;;;;;;;;;:15;;;29236:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29314:55;29344:7;29353:9;29364:4;;29314:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29314:29:0::1;::::0;-1:-1:-1;;;29314:55:0:i:1;:::-;29304:65;;29402:9;29388:7;29396:1;29388:10;;;;;;;;;;;;;;:23;;29380:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29472:4;29466:19;;;29493:7;29501:1;29493:10;;;;;;;;;;;;;;29466:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29466:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29466:40:0;;;;;29530:4;29524:20;;;29545:51;29570:7;29579:4;;29584:1;29579:7;;;;;;29545:51;29598:7;29606:1;29598:10;;;;;;;;;;;;;;29524:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29524:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29524:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29524:85:0;29517:93:::1;;;;29621:24;29627:7;29636:4;;29621:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29642:2:0;;-1:-1:-1;29621:5:0::1;::::0;-1:-1:-1;;29621:24:0:i:1;:::-;29708:7;29716:1;29708:10;;;;;;;;;;;;;;29696:9;:22;29692:94;;;29720:66;29751:10;29775:7;29783:1;29775:10;;;;;;;;;;;;;;29763:9;:22;29720:30;:66::i;1426:361::-:0;1621:45;;;1610:10;1621:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1621:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1621:45:0;179:29:-1;160:49;;1610:57:0;;;;1575:12;;1589:17;;1610:10;;;;1621:45;1610:57;;;25:18:-1;1610:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1610:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1574:93:0;;;;1686:7;:57;;;;-1:-1:-1;1698:11:0;;:16;;:44;;;1729:4;1718:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1718:24:0;1698:44;1678:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1426:361;;;;;:::o;2205:195::-;2313:12;;;2275;2313;;;;;;;;;2292:7;;;;2306:5;;2292:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2292:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2274:52:0;;;2345:7;2337:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2205:195;;;:::o;12785:517::-;12878:14;12924:1;12913:8;:12;12905:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13004:1;12992:9;:13;:31;;;;;13022:1;13009:10;:14;12992:31;12984:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13079:20;13102:17;:8;13115:3;13102:17;:12;:17;:::i;:::-;13079:40;-1:-1:-1;13130:14:0;13147:31;13079:40;13167:10;13147:31;:19;:31;:::i;:::-;13130:48;-1:-1:-1;13189:16:0;13208:40;13232:15;13208:19;:9;13222:4;13208:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;13189:59;;13283:11;13271:9;:23;;;;;;;12785:517;-1:-1:-1;;;;;;;12785:517:0:o;13977:511::-;14078:21;14135:1;14120:4;:11;:16;;14112:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14203:4;:11;14192:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14192:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14192:23:0;;14182:33;;14239:8;14226:7;14234:1;14226:10;;;;;;;;;;;;;:21;;;;;14263:6;14258:223;14289:1;14275:4;:11;:15;14271:1;:19;14258:223;;;14313:14;14329:15;14348:42;14360:7;14369:4;14374:1;14369:7;;;;;;;;;;;;;;14378:4;14383:1;14387;14383:5;14378:11;;;;;;;;;;;;;;14348;:42::i;:::-;14312:78;;;;14422:47;14435:7;14443:1;14435:10;;;;;;;;;;;;;;14447:9;14458:10;14422:12;:47::i;:::-;14405:7;14413:1;14417;14413:5;14405:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14292:3:0;;14258:223;;;;13977:511;;;;;:::o;11302:478::-;11391:12;11417:14;11433;11451:26;11462:6;11470;11451:10;:26::i;:::-;11615:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11615:32:0;;;;;11605:43;;;;;;11518:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11518:251:0;;;;;;;11508:262;;;;;;;;;11302:478;-1:-1:-1;;;;;11302:478:0:o;1795:402::-;2020:51;;;2009:10;2020:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2020:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;2020:51:0;179:29:-1;160:49;;2009:63:0;;;;1974:12;;1988:17;;2009:10;;;;2020:51;2009:63;;;25:18:-1;2009:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2009:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1973:99:0;;;;2091:7;:57;;;;-1:-1:-1;2103:11:0;;:16;;:44;;;2134:4;2123:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2123:24:0;2103:44;2083:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1795:402;;;;;;:::o;24604:735::-;24711:6;24706:626;24737:1;24723:4;:11;:15;24719:1;:19;24706:626;;;24761:13;24776:14;24795:4;24800:1;24795:7;;;;;;;;;;;;;;24804:4;24809:1;24813;24809:5;24804:11;;;;;;;;;;;;;;24760:56;;;;24832:14;24851:42;24879:5;24886:6;24851:27;:42::i;:::-;24831:62;;;24908:14;24925:7;24933:1;24937;24933:5;24925:14;;;;;;;;;;;;;;24908:31;;24955:15;24972;25000:6;24991:15;;:5;:15;;;:61;;25033:9;25049:1;24991:61;;;25015:1;25019:9;24991:61;24954:98;;;;25067:10;25098:1;25084:4;:11;:15;25080:1;:19;:82;;25159:3;25080:82;;;25102:54;25127:7;25136:6;25144:4;25149:1;25153;25149:5;25144:11;;;;;;;;;;;;;;25102:24;:54::i;:::-;25067:95;;25192:48;25217:7;25226:5;25233:6;25192:24;:48::i;:::-;25177:69;;;25265:10;25277;25289:2;25303:1;25293:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25293:12:0;87:42:-1;143:17;;-1:-1;25293:12:0;;25177:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25177:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25177:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24740:3:0;;;;;-1:-1:-1;24706:626:0;;-1:-1:-1;;;;;;;;24706:626:0;;;24604:735;;;:::o;14569:532::-;14670:21;14727:1;14712:4;:11;:16;;14704:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14795:4;:11;14784:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14784:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14784:23:0;;14774:33;;14848:9;14818:7;14843:1;14826:7;:14;:18;14818:27;;;;;;;;;;;;;;;;;:39;14882:11;;:15;;14868:226;14899:5;;14868:226;;14927:14;14943:15;14962:42;14974:7;14983:4;14992:1;14988;:5;14983:11;;;;;;;;;;;;;;14996:4;15001:1;14996:7;;;;;;;14962:42;14926:78;;;;15036:46;15048:7;15056:1;15048:10;;;;;;;;;;;;;;15060:9;15071:10;15036:11;:46::i;:::-;15019:7;15031:1;15027;:5;15019:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14906:3:0;;14868:226;;29941:1214;30054:6;30049:1099;30080:1;30066:4;:11;:15;30062:1;:19;30049:1099;;;30104:13;30119:14;30138:4;30143:1;30138:7;;;;;;;;;;;;;;30147:4;30152:1;30156;30152:5;30147:11;;;;;;;;;;;;;;30103:56;;;;30175:14;30194:42;30222:5;30229:6;30194:27;:42::i;:::-;30174:62;;;30251:19;30288:48;30313:7;30322:5;30329:6;30288:24;:48::i;:::-;30251:86;;30352:16;30383:17;30471:13;30486;30504:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30504:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30504:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30504:18:0;;;;;;;30470:52;;;;;-1:-1:-1;30470:52:0;;-1:-1:-1;30538:17:0;;30579:15;;;;;;;;:61;;30621:8;30631;30579:61;;;30598:8;30608;30579:61;30537:103;;;;30669:56;30712:12;30676:5;30669:23;;;30701:4;30669:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30669:56:0;30655:70;;30755:71;30785:11;30798:12;30812:13;30755:29;:71::i;:::-;30740:86;;30049:1099;;;;30857:15;30874;30902:6;30893:15;;:5;:15;;;:67;;30938:12;30957:1;30893:67;;;30917:1;30921:12;30893:67;30856:104;;;;30975:10;31006:1;30992:4;:11;:15;30988:1;:19;:82;;31067:3;30988:82;;;31010:54;31035:7;31044:6;31052:4;31057:1;31061;31057:5;31052:11;;;;;;;31010:54;31123:12;;;31133:1;31123:12;;;;;;;;;;31085:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;30975:95;;-1:-1:-1;31085:9:0;;;;;;31095:10;;31107;;30975:95;;31123:12;;31085:51;;;;;;;;31123:12;;31085:51;;;;31123:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31085:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31085:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30083:3:0;;;;;-1:-1:-1;30049:1099:0;;-1:-1:-1;;;;;;;;;;30049:1099:0;10325:129;10409:5;;;10404:16;;;;10396:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13423:472;13516:13;13562:1;13550:9;:13;13542:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13643:1;13631:9;:13;:31;;;;;13661:1;13648:10;:14;13631:31;13623:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13718:14;13735:34;13764:4;13735:24;:9;13749;13735:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13718:51;-1:-1:-1;13780:16:0;13799:34;13829:3;13799:25;:10;13814:9;13799:25;:14;:25;:::i;:34::-;13780:53;;13855:32;13885:1;13868:11;13856:9;:23;;;;;;;13855:32;:29;:32;:::i;:::-;13844:43;13423:472;-1:-1:-1;;;;;;13423:472:0:o;12342:321::-;12424:12;12467:1;12457:7;:11;12449:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12540:1;12529:8;:12;:28;;;;;12556:1;12545:8;:12;12529:28;12521:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12647:8;12623:21;:7;12635:8;12623:21;:11;:21;:::i;:::-;:32;;;;;;;12342:321;-1:-1:-1;;;;12342:321:0:o;10861:349::-;10936:14;10952;10997:6;10987:16;;:6;:16;;;;10979:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11084:6;11075:15;;:6;:15;;;:53;;11113:6;11121;11075:53;;;11094:6;11102;11075:53;11056:72;;-1:-1:-1;11056:72:0;-1:-1:-1;11147:20:0;;;11139:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10861:349;;;;;:::o;16931:1390::-;17244:50;;;;;;:64;:50;;;;;;;;;;;;;;;;17149:12;;;;;;17262:7;17244:34;;;;;;:50;;;;;;;;;;;;;;;:34;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;17244:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17244:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17244:50:0;:64;;;17240:150;;;17325:53;;;;;;:37;:53;;;;;;;;;;;;;;;;17343:7;17325:37;;;;;;:53;;;;;;;;;;;;;;;-1:-1:-1;17325:37:0;:53;;;2:2:-1;;;;27:1;24;17:12;2:2;17325:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17325:53:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17240:150:0;17401:13;17416;17433:53;17462:7;17471:6;17479;17433:28;:53::i;:::-;17400:86;;;;17501:8;17513:1;17501:13;:30;;;;-1:-1:-1;17518:13:0;;17501:30;17497:817;;;17570:14;;-1:-1:-1;17586:14:0;;-1:-1:-1;17497:817:0;;;17634:19;17656:58;17679:14;17695:8;17705;17656:22;:58::i;:::-;17634:80;;17751:14;17733;:32;17729:574;;17812:10;17794:14;:28;;17786:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17906:14;;-1:-1:-1;17922:14:0;-1:-1:-1;17922:14:0;17729:574;;;17978:19;18000:58;18023:14;18039:8;18049;18000:22;:58::i;:::-;17978:80;;18102:14;18084;:32;;18077:40;;;;18162:10;18144:14;:28;;18136:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18256:14;-1:-1:-1;18272:14:0;;-1:-1:-1;17729:574:0;17497:817;;16931:1390;;;;;;;;;;;:::o;10462:142::-;10514:6;10541;;;:30;;-1:-1:-1;;10556:5:0;;;10570:1;10565;10556:5;10565:1;10551:15;;;;;:20;10541:30;10533:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10189:128;10273:5;;;10268:16;;;;10260:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11838:391;11931:13;11946;11973:14;11992:26;12003:6;12011;11992:10;:26::i;:::-;11972:46;;;12030:13;12045;12078:32;12086:7;12095:6;12103;12078:7;:32::i;:::-;12063:60;;;:62;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12063:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12063:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12063:62:0;;;;;;;12029:96;;;;;-1:-1:-1;12029:96:0;;-1:-1:-1;12159:16:0;;;;;;;;:62;;12202:8;12212;12159:62;;;12179:8;12189;12159:62;12136:85;;;;-1:-1:-1;11838:391:0;-1:-1:-1;;;;;;;11838:391:0:o

Swarm Source

ipfs://6dd6e03c4b2c0a8e55214926227ae9e2d6f9fec2ce74a6446d615afa355c84f3
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading