Contract 0xf491e7b69e4244ad4002bc14e878a34207e38c29 14

 

Contract Overview

SpookySwap: Router
Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x80142bb124c070b54308f1e753103c52d03b3c419bc9914718c69eb57d93f55cSwap Exact Token...519197962022-12-05 14:32:172 mins ago0x7003ce269f8fe382ac028f50eed4508d06f54b88 IN  SpookySwap: Router0 FTM0.0113186304
0x5a3c81465fe7dbe527d3d6b605901a0c14c946e9e0117c075f9e927c5d8818caSwap Exact Token...519197462022-12-05 14:30:393 mins ago0x5d300ce8b46065f3ac8f01e673779c11d4eb949c IN  SpookySwap: Router0 FTM0.023530224626
0x549943e3968381a1f0e9c8c839d3899456e4e68aecc40ccda6ef485b8904e34bSwap Exact Token...519197462022-12-05 14:30:393 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.031001434196
0xb445cc4225a0db3ebfc84d3018c5b3b93be0e651816748f1ae1b5702fd242169Swap Exact Token...519197462022-12-05 14:30:393 mins ago0x7003ce269f8fe382ac028f50eed4508d06f54b88 IN  SpookySwap: Router0 FTM0.018838403735
0x03ee4488c3b05d1a9c14c5c71cc2fee673c8cdf3831c997299451d9ab20dd74bSwap Exact Token...519197462022-12-05 14:30:393 mins ago0xf2360ee947b2ed41d31ec6c5fe30aa436438a090 IN  SpookySwap: Router0 FTM0.048123258634
0x87be594e11785d09c0714f4974c468e3b7e783f8a5153c9df858e8d2db90bd19Swap Exact Token...519197442022-12-05 14:30:363 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.037071150975
0x1da4356fcbdb15153e6fbe9ea91c5956655cd396f2b2a8ad374c84ec1d1d117aSwap Exact Token...519197442022-12-05 14:30:363 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.037056303879
0x6db0441d4a5f0e10db3823ae90a288f85e30dd61afb60765e95542133c160708Swap Exact Token...519197442022-12-05 14:30:363 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.037295393323
0x1a999952ad34db725f0af13b5ffafd53956dd9fed4841f24eeac283a4e0770dcSwap Exact Token...519197442022-12-05 14:30:363 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.037071150975
0xb8384c436eaef321879fdcd7dc21455028689467719b4ccbbcc328a4de7d1c0fSwap Exact Token...519197432022-12-05 14:30:304 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.026753484025
0x856dcad338d4fbe35d528ca172d816327ec0c0f3f2433d68c1c042afa4546bcfSwap Exact Token...519197432022-12-05 14:30:304 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.048796117446
0x81032b839ed3dc355c9dea4942852efa30c0463bcddb0c026d01136c388e9e8cSwap Exact Token...519197432022-12-05 14:30:304 mins ago0x5d300ce8b46065f3ac8f01e673779c11d4eb949c IN  SpookySwap: Router0 FTM0.023260380947
0xc7df3654f57a9a1426e6373fc0a604ca556fcd5d1838d9e08e5d48fa082eb49cSwap Exact Token...519197432022-12-05 14:30:304 mins ago0xd676432a77cfe7bbf5a048e375557cc18e295ae7 IN  SpookySwap: Router0 FTM0.01488407411
0x4d23f04f7ea4b9c8ffc7bf6e3cad443297b568e843e520d93943b001ac1c5275Swap Exact Token...519197432022-12-05 14:30:304 mins ago0xf2360ee947b2ed41d31ec6c5fe30aa436438a090 IN  SpookySwap: Router0 FTM0.046249947803
0xd13952a53009caea64c54bb34c96c4fabd96af506e95a39a8d7f75f43bb88afcSwap Exact Token...519197432022-12-05 14:30:304 mins ago0xf2360ee947b2ed41d31ec6c5fe30aa436438a090 IN  SpookySwap: Router0 FTM0.045831862632
0x0703ed6538c81b1cca70bbaa6ef150fa2cf066ddfd54b8fe02e642068229f727Swap Exact Token...519197332022-12-05 14:30:064 mins ago0xf2360ee947b2ed41d31ec6c5fe30aa436438a090 IN  SpookySwap: Router0 FTM0.010854194441
0xefd93fcb579d0e3dd5510bdf5406f6f358e4dded39a1c52c5382cba8e7156283Swap Exact Token...519197322022-12-05 14:30:054 mins ago0x5d300ce8b46065f3ac8f01e673779c11d4eb949c IN  SpookySwap: Router0 FTM0.010854194441
0x05c6f69fc024a774dbf374cb29424bab89ebc5c3458ad4dd86793a4491e1491eSwap Exact Token...519197302022-12-05 14:30:034 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.010733175747
0x0ca4ed6376044a06a4225ec2236e9777290cb09a9035bd51754b7fcb4d2ca565Swap Exact Token...519197252022-12-05 14:29:464 mins ago0xf2360ee947b2ed41d31ec6c5fe30aa436438a090 IN  SpookySwap: Router0 FTM0.006021816944
0x75abcb9e49f540814cc994d266114d43ae15ba6cbd91b03023bb497965d9fb99Swap Exact Token...519197252022-12-05 14:29:464 mins ago0x5d300ce8b46065f3ac8f01e673779c11d4eb949c IN  SpookySwap: Router0 FTM0.011041068753
0x39d903a008cc4b334aeb396fbd645367f36ec06d8b62e781050cfa6c583c73ffSwap Exact Token...519197032022-12-05 14:29:025 mins ago0xdfd3240c2ce61bdcedda56101ce83b599905681c IN  SpookySwap: Router0 FTM0.059244912
0x679425cb98130e932bcecce081efc303763db8bdd424d5e0c5dbc55df78fd23aSwap Exact Token...519196742022-12-05 14:28:166 mins ago0x9e35977c8966a528e95e5c430318b0709b8e4cba IN  SpookySwap: Router0 FTM0.002824416
0xa4521f6ece1c78d576851d59e02f5ca74678c0ab0ae99b062c146f1867eb88a9Swap Exact Token...519196702022-12-05 14:28:116 mins ago0x7003ce269f8fe382ac028f50eed4508d06f54b88 IN  SpookySwap: Router0 FTM0.0113255032
0xe6724bce7fa146053bb3abe45571ff713f3b30307a6593b3f0458f11e399cb43Swap Exact Token...519196652022-12-05 14:28:056 mins ago0x7003ce269f8fe382ac028f50eed4508d06f54b88 IN  SpookySwap: Router0 FTM0.0046939288
0x032d9b9501a5f189d309e73d82167b2855ba0d6e5bd8b104c44e57863e1d000eSwap Exact ETH F...519196592022-12-05 14:27:596 mins ago0x623adda207afdb26dd70389cd2a60295ce3ac5ac IN  SpookySwap: Router199 FTM0.0026196075
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xded6e9024d0379d545b0179ad3bb3f5446b0e3bc692c2de85e432cda0cf68fdb519198202022-12-05 14:33:131 min ago SpookySwap: Router 0x061b3e27c7874ce3c3dc37421277b66a92291e7f2.108835822857035221 FTM
0xded6e9024d0379d545b0179ad3bb3f5446b0e3bc692c2de85e432cda0cf68fdb519198202022-12-05 14:33:131 min ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router2.108835822857035221 FTM
0xd990a7f3e1bfaa9f3000c074c1483cf01c5a482a1c350fb435ec2c4522e52a10519198062022-12-05 14:32:401 min ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token19.94 FTM
0xd990a7f3e1bfaa9f3000c074c1483cf01c5a482a1c350fb435ec2c4522e52a10519198062022-12-05 14:32:401 min ago 0x76b13435a7c927f7268d7c5ba3efbd71d72b5950 SpookySwap: Router19.94 FTM
0xe80cf02b0fd583d6c1c4bfb8ac96d7ca3e45d7a298a2908c66adb864264b92d3519197782022-12-05 14:31:363 mins ago SpookySwap: Router 0x061b3e27c7874ce3c3dc37421277b66a92291e7f374.139141942441614926 FTM
0xe80cf02b0fd583d6c1c4bfb8ac96d7ca3e45d7a298a2908c66adb864264b92d3519197782022-12-05 14:31:363 mins ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router374.139141942441614926 FTM
0x34a3f04c0eb7ff51d099a258c3efd1e9314c70c561304f3bc7faf785a089a310519197732022-12-05 14:31:253 mins ago SpookySwap: Router 0x061b3e27c7874ce3c3dc37421277b66a92291e7f20.111651531179265371 FTM
0x34a3f04c0eb7ff51d099a258c3efd1e9314c70c561304f3bc7faf785a089a310519197732022-12-05 14:31:253 mins ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router20.111651531179265371 FTM
0x032d9b9501a5f189d309e73d82167b2855ba0d6e5bd8b104c44e57863e1d000e519196592022-12-05 14:27:596 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token199 FTM
0x7a0dfba6cd57488885dc0366196a8f7d3ee7cb2e312c78e2a4896bb9817fc980519196192022-12-05 14:27:097 mins ago SpookySwap: Router 0x061b3e27c7874ce3c3dc37421277b66a92291e7f0.226259704783347427 FTM
0x7a0dfba6cd57488885dc0366196a8f7d3ee7cb2e312c78e2a4896bb9817fc980519196192022-12-05 14:27:097 mins ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router0.226259704783347427 FTM
0xb0564feea0238f40ab498107602934dd84ff56a3d44a5b146fe78a468eb76706519194972022-12-05 14:23:4210 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token1 FTM
0x951d0891a2e198497af8dc4abdc18337f5063c6a426ae371b44372237dc6f74f519194872022-12-05 14:23:1611 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token2,766.675 FTM
0x951d0891a2e198497af8dc4abdc18337f5063c6a426ae371b44372237dc6f74f519194872022-12-05 14:23:1611 mins ago 0x76b13435a7c927f7268d7c5ba3efbd71d72b5950 SpookySwap: Router2,766.675 FTM
0x62358374127c4ada3860ebe900a6ca5b20c04b6d640a4e04486fce8fe81e8a56519194872022-12-05 14:23:1611 mins ago SpookySwap: Router0xac64c91e6db22439df6441be0f4d6dc64b7fd9650.085169140645581718 FTM
0x62358374127c4ada3860ebe900a6ca5b20c04b6d640a4e04486fce8fe81e8a56519194872022-12-05 14:23:1611 mins ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router0.085169140645581718 FTM
0x61cd97fcb87e113ec739310b6d7178843a4f8ebe9e416329f7deb0af7673c907519194582022-12-05 14:22:1812 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token0.822618494672 FTM
0x61cd97fcb87e113ec739310b6d7178843a4f8ebe9e416329f7deb0af7673c907519194582022-12-05 14:22:1812 mins ago 0x76b13435a7c927f7268d7c5ba3efbd71d72b5950 SpookySwap: Router0.822618494672 FTM
0x29da2c8e5daae2af645743abf270f064aafd17a8aef6be2a1e8fb17f448dfe9c519194362022-12-05 14:21:1313 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token1.037195724975 FTM
0x29da2c8e5daae2af645743abf270f064aafd17a8aef6be2a1e8fb17f448dfe9c519194362022-12-05 14:21:1313 mins ago 0x76b13435a7c927f7268d7c5ba3efbd71d72b5950 SpookySwap: Router1.037195724975 FTM
0xca03918c875bbc7da205fb5ea53133d7b4fe3e17352e71d17ef2dec97dd2f776519193842022-12-05 14:18:3216 mins ago SpookySwap: Router Fantom Finance: Wrapped Fantom Token0.918298112112 FTM
0xca03918c875bbc7da205fb5ea53133d7b4fe3e17352e71d17ef2dec97dd2f776519193842022-12-05 14:18:3216 mins ago 0x76b13435a7c927f7268d7c5ba3efbd71d72b5950 SpookySwap: Router0.918298112112 FTM
0xd898917adf3058f5b53888c1efe4448970bb51513bef1bc7627ee533f16f0d57519193672022-12-05 14:17:2417 mins ago SpookySwap: Router 0x061b3e27c7874ce3c3dc37421277b66a92291e7f1.880547527819513029 FTM
0xd898917adf3058f5b53888c1efe4448970bb51513bef1bc7627ee533f16f0d57519193672022-12-05 14:17:2417 mins ago Fantom Finance: Wrapped Fantom Token SpookySwap: Router1.880547527819513029 FTM
0xc07c5efb01a093aa7b67bd4ee5a05d892158118c00d31d669bd66b0c92cca238519192732022-12-05 14:11:5122 mins ago SpookySwap: Router0xea4c232fde13fb8c0e892693d747b8918eec54a91,181.257147641831343878 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-04-26
*/

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

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

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

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

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

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

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

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

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

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

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

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

contract 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 Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162005616380380620056168339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61549162000185600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f15280614342528061438552806146cf528061489a5280614dbd5280614eaa5280614f8452506154916000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153e2602b913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fbe565b8560008151811061124a57fe5b60200260200101516140a9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614279915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144ea565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fbe565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153e2602b913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806153726027913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140a9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614678915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b5051906149f5565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153e2602b913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614678915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153e2602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806153e2602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b5095945050505050565b6000610f44848484614a67565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806153726027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b73565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614678915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fbe565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c4d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153996026913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152ff6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e58565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614da0565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fbe565b90506132438d3383886140a9565b61324f8c3383876140a9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614da0565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b90506133fc8b3383886140a9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806153726027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153bf6023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615431602b913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153256028913960400191505060405180910390fd5b6000613e19856103e66150cd565b90506000613e2782856150cd565b90506000613e4183613e3b886103e86150cd565b90615153565b9050808281613e4c57fe5b04979650505050505050565b6060600282511015613ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ee357600080fd5b50604051908082528060200260200182016040528015613f0d578160200160208202803683370190505b5090508281600081518110613f1e57fe5b60200260200101818152505060005b6001835103811015613fb657600080613f7087868581518110613f4c57fe5b6020026020010151878660010181518110613f6357fe5b60200260200101516151c5565b91509150613f92848481518110613f8357fe5b60200260200101518383613d4c565b848460010181518110613fa157fe5b60209081029190910101525050600101613f2d565b509392505050565b6000806000613fcd8585614c4d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fcdf2deca40a0bd56de8e3ce5c7df6727e5b1bf2ac96f283fa9c4b3e6b42ea9d2609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061418757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141e9576040519150601f19603f3d011682016040523d82523d6000602084013e6141ee565b606091505b509150915081801561421c57508051158061421c575080806020019051602081101561421957600080fd5b50515b614271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061540d6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144e45760008084838151811061429757fe5b60200260200101518584600101815181106142ae57fe5b60200260200101519150915060006142c68383614c4d565b50905060008785600101815181106142da57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461432257826000614326565b6000835b91509150600060028a5103881061433d578861437e565b61437e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061437157fe5b6020026020010151613fbe565b90506143ab7f00000000000000000000000000000000000000000000000000000000000000008888613fbe565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143f5576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561446a578181015183820152602001614452565b50505050905090810190601f1680156144975780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144b957600080fd5b505af11580156144cd573d6000803e3d6000fd5b50506001909901985061427c975050505050505050565b50505050565b606060028251101561455d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561457557600080fd5b5060405190808252806020026020018201604052801561459f578160200160208202803683370190505b50905082816001835103815181106145b357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fb657600080614613878660018603815181106145ff57fe5b6020026020010151878681518110613f6357fe5b9150915061463584848151811061462657fe5b60200260200101518383614a67565b84600185038151811061464457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145e3565b60005b6001835103811015613d475760008084838151811061469657fe5b60200260200101518584600101815181106146ad57fe5b60200260200101519150915060006146c58383614c4d565b50905060006146f57f00000000000000000000000000000000000000000000000000000000000000008585613fbe565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561474357600080fd5b505afa158015614757573d6000803e3d6000fd5b505050506040513d606081101561476d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147b75782846147ba565b83835b91509150614829828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614836868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461487a5782600061487e565b6000835b91509150600060028c51038a10614895578a6148c9565b6148c97f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061437157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614979578181015183820152602001614961565b50505050905090810190601f1680156149a65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149c857600080fd5b505af11580156149dc573d6000803e3d6000fd5b50506001909b019a5061467b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806152ae602c913960400191505060405180910390fd5b600083118015614ad15750600082115b614b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153256028913960400191505060405180910390fd5b6000614b3e6103e8614b3886886150cd565b906150cd565b90506000614b526103e6614b3886896149f5565b9050614b696001828481614b6257fe5b0490615153565b9695505050505050565b6000808411614bcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061534d6025913960400191505060405180910390fd5b600083118015614bdd5750600082115b614c32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153256028913960400191505060405180910390fd5b82614c3d85846150cd565b81614c4457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806152da6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d0f578284614d12565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614d9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e6057600080fd5b505afa158015614e74573d6000803e3d6000fd5b505050506040513d6020811015614e8a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f7c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f4f57600080fd5b505af1158015614f63573d6000803e3d6000fd5b505050506040513d6020811015614f7957600080fd5b50505b600080614faa7f00000000000000000000000000000000000000000000000000000000000000008b8b6151c5565b91509150816000148015614fbc575080155b15614fcc578793508692506150c0565b6000614fd9898484614b73565b9050878111615046578581101561503b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152ff6026913960400191505060405180910390fd5b8894509250826150be565b6000615053898486614b73565b90508981111561505f57fe5b878110156150b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153996026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150e8575050808202828282816150e557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151d48585614c4d565b5090506000806151e5888888613fbe565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561522a57600080fd5b505afa15801561523e573d6000803e3d6000fd5b505050506040513d606081101561525457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461529b57808261529e565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220e14b722fb587ead5fa5d4f483865f4692687582d680f187213266621e4e4994464736f6c634300060c0033000000000000000000000000152ee697f2e276fa89e96742e9bb9ab1f2e61be300000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

000000000000000000000000152ee697f2e276fa89e96742e9bb9ab1f2e61be300000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x152ee697f2e276fa89e96742e9bb9ab1f2e61be3
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000152ee697f2e276fa89e96742e9bb9ab1f2e61be3
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

15366:18549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15848:10;:18;15862:4;15848:18;;15841:26;;;;15366:18549;;;;;19998:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19998:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32859:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32859:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27167:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27167:850:0;-1:-1:-1;27167:850:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33659:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33659:253:0;;-1:-1:-1;33659:253:0;;-1:-1:-1;;;;;33659:253:0:i;20677:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20677:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24384:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24384:628:0;-1:-1:-1;24384:628:0;;;;;;;;;:::i;26333:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26333:828:0;-1:-1:-1;26333:828:0;;;;;;;;;:::i;22814:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22814:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30200:714::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30200:714:0;-1:-1:-1;30200:714:0;;;;;;;;;:::i;31776:843::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31776:843:0;-1:-1:-1;31776:843:0;;;;;;;;;:::i;25630:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25630:697:0;-1:-1:-1;25630:697:0;;;;;;;;;:::i;33129:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33129:261:0;;;;;;;;;;;;:::i;25018:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25018:606:0;-1:-1:-1;25018:606:0;;;;;;;;;:::i;15502:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32663:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32663:188:0;;;;;;;;;;;;:::i;22108:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22108:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30920:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30920:850:0;-1:-1:-1;30920:850:0;;;;;;;;;:::i;19127:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19127:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15454:41::-;;;;;;;;;;;;;:::i;33398:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33398:253:0;;-1:-1:-1;33398:253:0;;-1:-1:-1;;;;;33398:253:0:i;21360:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21360:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17366:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17366:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18110:974;;;;;;;;;;;;;;;;-1:-1:-1;18110:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28023:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28023:810:0;-1:-1:-1;28023:810:0;;;;;;;;;:::i;19998:673::-;20235:16;20253:14;20216:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20307:196:::1;20337:5;20357:4;20376:9;20400:14;20429:12;20464:4;20484:8;20307:15;:196::i;:::-;20280:223:::0;;-1:-1:-1;20280:223:0;-1:-1:-1;20514:51:0::1;20542:5:::0;20549:2;20280:223;20514:27:::1;:51::i;:::-;20582:4;20576:20;;;20597:9;20576:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20618:45;20649:2;20653:9;20618:30;:45::i;:::-;19998:673:::0;;;;;;;;;;:::o;32859:262::-;33012:14;33051:62;33081:8;33091:9;33102:10;33051:29;:62::i;:::-;33044:69;32859:262;-1:-1:-1;;;;32859:262:0:o;27167:850::-;27381:21;27353:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27428:29:::1;27453:4;27428:29;:4:::0;;27433:15;;;27428:21;;::::1;;;;;;;;;;;;;:29;;;27420:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27512:55;27543:7;27552:8;27562:4;;27512:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27512:30:0::1;::::0;-1:-1:-1;;;27512:55:0:i:1;:::-;27502:65;;27617:12;27586:7;27611:1;27594:7;:14;:18;27586:27;;;;;;;;;;;;;;:43;;27578:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27688:141;27734:4;;27739:1;27734:7;;;;;;;;;;;;;;;27743:10;27755:51;27780:7;27789:4;;27794:1;27789:7;;;;;;;;;;;;;;;27798:4;;27803:1;27798:7;;;;;;;;;;;;;;;27755:24;:51::i;:::-;27808:7;27816:1;27808:10;;;;;;;;;;;;;;27688:31;:141::i;:::-;27840:35;27846:7;27855:4;;27840:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27869:4:0::1;::::0;-1:-1:-1;27840:5:0::1;::::0;-1:-1:-1;;27840:35:0:i:1;:::-;27892:4;27886:20;;;27907:7;27932:1;27915:7;:14;:18;27907:27;;;;;;;;;;;;;;27886:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27946:63;27977:2;27981:7;28006:1;27989:7;:14;:18;27981:27;;;;;;;;;;;;;;27946:30;:63::i;:::-;27167:850:::0;;;;;;;;;:::o;33659:253::-;33803:21;33849:55;33879:7;33888:9;33899:4;33849:29;:55::i;:::-;33842:62;;33659:253;;;;;:::o;20677:677::-;20983:12;20997;21022;21037:49;21062:7;21071:6;21079;21037:24;:49::i;:::-;21022:64;;21097:10;21110;:33;;21134:9;21110:33;;;21128:2;21110:33;21154:80;;;;;;21182:10;21154:80;;;;21202:4;21154:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21097:46;;-1:-1:-1;21154:27:0;;;;;;:80;;;;;-1:-1:-1;;21154:80:0;;;;;;;;-1:-1:-1;21154:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21266;21282:6;21290;21298:9;21309:10;21321;21333:2;21337:8;21266:15;:80::i;:::-;21245:101;;;;;;;;20677:677;;;;;;;;;;;;;;;;:::o;24384:628::-;24608:21;24589:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24652:55:::1;24683:7;24692:8;24702:4;;24652:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24652:30:0::1;::::0;-1:-1:-1;;;24652:55:0:i:1;:::-;24642:65;;24757:12;24726:7;24751:1;24734:7;:14;:18;24726:27;;;;;;;;;;;;;;:43;;24718:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24828:141;24874:4;;24879:1;24874:7;;;;;;24828:141;24980:24;24986:7;24995:4;;24980:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25001:2:0;;-1:-1:-1;24980:5:0::1;::::0;-1:-1:-1;;24980:24:0:i:1;26333:828::-:0;26547:21;26519:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26594:29:::1;26619:4;26594:29;:4:::0;;26599:15;;;26594:21;;::::1;;;;;;;;;;;;;:29;;;26586:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26678:55;26708:7;26717:9;26728:4;;26678:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26678:29:0::1;::::0;-1:-1:-1;;;26678:55:0:i:1;:::-;26668:65;;26766:11;26752:7;26760:1;26752:10;;;;;;;;;;;;;;:25;;26744:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22814:718:::0;23132:14;23159:12;23174:46;23199:7;23208:5;23215:4;23174:24;:46::i;:::-;23159:61;;23231:10;23244;:33;;23268:9;23244:33;;;23262:2;23244:33;23288:80;;;;;;23316:10;23288:80;;;;23336:4;23288:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23231:46;;-1:-1:-1;23288:27:0;;;;;;:80;;;;;-1:-1:-1;;23288:80:0;;;;;;;;-1:-1:-1;23288:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23391:133;23453:5;23460:9;23471:14;23487:12;23501:2;23505:8;23391:47;:133::i;:::-;23379:145;22814:718;-1:-1:-1;;;;;;;;;;;;;22814:718:0:o;30200:714::-;30434:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30455:139:::1;30501:4;;30506:1;30501:7;;;;;;;;;;;;;;;30510:10;30522:51;30547:7;30556:4;;30561:1;30556:7;;;;;;;;;;;;;;;30565:4;;30570:1;30565:7;;;;;;30522:51;30575:8;30455:31;:139::i;:::-;30605:18;30633:4:::0;;30638:15;;;30633:21;;::::1;;;;;;;;;;;;;30626:39;;;30666:2;30626:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30626:43:0;30680:44:::1;::::0;;30626:43:::1;30680:44:::0;;::::1;::::0;;;;;;;;;;;30626:43;;-1:-1:-1;30680:44:0::1;::::0;;;30715:4;;;;;;30680:44;::::1;::::0;30715:4;;30680:44;30715:4;30680:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30721:2:0;;-1:-1:-1;30680:34:0::1;::::0;-1:-1:-1;;30680:44:0:i:1;:::-;30823:12:::0;30757:62:::1;30805:13:::0;30764:4;;30769:15;;;30764:21;;::::1;;;;;;;;;;;;;30757:39;;;30797:2;30757:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30757:43:0;;:47:::1;:62::i;:::-;:78;;30735:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15666:1;30200:714:::0;;;;;;;:::o;31776:843::-;32043:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32077:29:::1;32102:4;32077:29;:4:::0;;32082:15;;;32077:21;;::::1;;;;;;;;;;;;;:29;;;32069:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32151:139;32197:4;;32202:1;32197:7;;;;;;32151:139;32301:55;32336:4;;32301:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32350:4:0::1;::::0;-1:-1:-1;32301:34:0::1;::::0;-1:-1:-1;;32301:55:0:i:1;:::-;32367:14;32391:4;32384:22;;;32415:4;32384:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32384:37:0;;-1:-1:-1;32440:25:0;;::::1;;32432:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32530:4;32524:20;;;32545:9;32524:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32566:45;32597:2;32601:9;32566:30;:45::i;25630:697::-:0;25846:21;25818:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25904:4:::1;25893:15;;:4;;25898:1;25893:7;;;;;;;;;;;;;;;:15;;;25885:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25963:56;25994:7;26003:9;26014:4;;25963:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25963:30:0::1;::::0;-1:-1:-1;;;25963:56:0:i:1;:::-;25953:66;;26069:12;26038:7;26063:1;26046:7;:14;:18;26038:27;;;;;;;;;;;;;;:43;;26030:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26146:4;26140:19;;;26167:7;26175:1;26167:10;;;;;;;;;;;;;;26140:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26204:4;26198:20;;;26219:51;26244:7;26253:4;;26258:1;26253:7;;;;;;26219:51;26272:7;26280:1;26272:10;;;;;;;;;;;;;;26198:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26198:85:0;26191:93:::1;;;;26295:24;26301:7;26310:4;;26295:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26316:2:0;;-1:-1:-1;26295:5:0::1;::::0;-1:-1:-1;;26295:24:0:i:1;:::-;25630:697:::0;;;;;;;;:::o;33129:261::-;33282:13;33320:62;33349:9;33360;33371:10;33320:28;:62::i;25018:606::-;25242:21;25223:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25286:55:::1;25316:7;25325:9;25336:4;;25286:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25286:29:0::1;::::0;-1:-1:-1;;;25286:55:0:i:1;:::-;25276:65;;25374:11;25360:7;25368:1;25360:10;;;;;;;;;;;;;;:25;;25352:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15502:38:::0;;;:::o;32663:188::-;32760:12;32792:51;32815:7;32824:8;32834;32792:22;:51::i;22108:700::-;22374:14;22355:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22417:196:::1;22447:5;22467:4;22486:9;22510:14;22539:12;22574:4;22594:8;22417:15;:196::i;:::-;22401:212;;;;;;22624:78;22652:5;22659:2;22670:5;22663:23;;;22695:4;22663:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22663:38:0;22624:27:::1;:78::i;:::-;22719:4;22713:20;;;22734:9;22713:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22755:45;22786:2;22790:9;22755:30;:45::i;30920:850::-:0;31180:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31225:4:::1;31214:15;;:4;;31219:1;31214:7;;;;;;;;;;;;;;;:15;;;31206:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31274:13;31290:9;31274:25;;31316:4;31310:19;;;31337:8;31310:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31372:4;31366:20;;;31387:51;31412:7;31421:4;;31426:1;31421:7;;;;;;31387:51;31440:8;31366:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31366:83:0;31359:91:::1;;;;31461:18;31489:4:::0;;31494:15;;;31489:21;;::::1;;;;;;;;;;;;;31482:39;;;31522:2;31482:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31482:43:0;31536:44:::1;::::0;;31482:43:::1;31536:44:::0;;::::1;::::0;;;;;;;;;;;31482:43;;-1:-1:-1;31536:44:0::1;::::0;;;31571:4;;;;;;31536:44;::::1;::::0;31571:4;;31536:44;31571:4;31536:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31577:2:0;;-1:-1:-1;31536:34:0::1;::::0;-1:-1:-1;;31536:44:0:i:1;:::-;31679:12:::0;31613:62:::1;31661:13:::0;31620:4;;31625:15;;;31620:21;;::::1;;;;;;;;;;;;;31613:39;;;31653:2;31613:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;19127:865:::0;19381:12;19395;19362:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19420:12:::1;19435:49;19460:7;19469:6;19477;19435:24;:49::i;:::-;19495:62;::::0;;;;;19529:10:::1;19495:62;::::0;::::1;::::0;:33:::1;::::0;::::1;:62:::0;;;;;;;;;;;;;;19420:64;;-1:-1:-1;19495:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19495:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;19625:29:0::1;::::0;;;;;:25:::1;:29:::0;;::::1;;::::0;::::1;::::0;;;19595:12:::1;::::0;;;19625:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;19595:12;19625:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19625:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19625:29:0;-1:-1:-1;19666:14:0::1;19685:43;19713:6:::0;19721;19685:27:::1;:43::i;:::-;19665:63;;;19770:6;19760:16;;:6;:16;;;:58;;19801:7;19810;19760:58;;;19780:7;19789;19760:58;19739:79:::0;;-1:-1:-1;19739:79:0;-1:-1:-1;19837:21:0;;::::1;;19829:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19931:10;19920:7;:21;;19912:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15666:1;;;;19127:865:::0;;;;;;;;;;;:::o;15454:41::-;;;:::o;33398:253::-;33542:21;33588:55;33619:7;33628:8;33638:4;33588:30;:55::i;21360:669::-;21649:16;21667:14;21694:12;21709:46;21734:7;21743:5;21750:4;21709:24;:46::i;:::-;21694:61;;21766:10;21779;:33;;21803:9;21779:33;;;21797:2;21779:33;21823:80;;;;;;21851:10;21823:80;;;;21871:4;21823:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21766:46;;-1:-1:-1;21823:27:0;;;;;;:80;;;;;-1:-1:-1;;21823:80:0;;;;;;;;-1:-1:-1;21823:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21941;21960:5;21967:9;21978:14;21994:12;22008:2;22012:8;21941:18;:80::i;:::-;21914:107;;;;-1:-1:-1;21360:669:0;-1:-1:-1;;;;;;;;;;;;;21360:669:0:o;17366:738::-;17654:12;17668;17682:14;17635:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17730:85:::1;17744:6;17752;17760:14;17776;17792:10;17804;17730:13;:85::i;:::-;17709:106:::0;;-1:-1:-1;17709:106:0;-1:-1:-1;17826:12:0::1;17841:49;17866:7;17875:6:::0;17883;17841:24:::1;:49::i;:::-;17826:64;;17901:66;17933:6;17941:10;17953:4;17959:7;17901:31;:66::i;:::-;17978;18010:6;18018:10;18030:4;18036:7;17978:31;:66::i;:::-;18082:4;18067:25;;;18093:2;18067:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18067:29:0;17366:738;;;;-1:-1:-1;18067:29:0;;-1:-1:-1;17366:738:0;;-1:-1:-1;;;;;;;;;17366:738:0:o;18110:974::-;18363:16;18381:14;18397;18344:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:176:::1;18479:5;18499:4;18518:18;18551:9;18575:14;18604:12;18451:13;:176::i;:::-;18424:203:::0;;-1:-1:-1;18424:203:0;-1:-1:-1;18638:12:0::1;18653:46;18678:7;18687:5:::0;18694:4:::1;18653:24;:46::i;:::-;18638:61;;18710:69;18742:5;18749:10;18761:4;18767:11;18710:31;:69::i;:::-;18796:4;18790:19;;;18817:9;18790:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;18853:4;18847:20;;;18868:4;18874:9;18847:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18847:37:0;18840:45:::1;;;;18923:4;18908:25;;;18934:2;18908:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18908:29:0;;-1:-1:-1;18988:9:0::1;:21:::0;-1:-1:-1;18984:92:0::1;;;19011:65;19042:10;19066:9;19054;:21;19011:30;:65::i;:::-;15666:1;18110:974:::0;;;;;;;;;;;:::o;28023:810::-;28236:21;28208:8;15611:15;15599:8;:27;;15591:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28294:4:::1;28283:15;;:4;;28288:1;28283:7;;;;;;;;;;;;;;;:15;;;28275:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28353:55;28383:7;28392:9;28403:4;;28353:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28353:29:0::1;::::0;-1:-1:-1;;;28353:55:0:i:1;:::-;28343:65;;28441:9;28427:7;28435:1;28427:10;;;;;;;;;;;;;;:23;;28419:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28511:4;28505:19;;;28532:7;28540:1;28532:10;;;;;;;;;;;;;;28505:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28569:4;28563:20;;;28584:51;28609:7;28618:4;;28623:1;28618:7;;;;;;28584:51;28637:7;28645:1;28637:10;;;;;;;;;;;;;;28563:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28563:85:0;28556:93:::1;;;;28660:24;28666:7;28675:4;;28660:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28681:2:0;;-1:-1:-1;28660:5:0::1;::::0;-1:-1:-1;;28660:24:0:i:1;:::-;28747:7;28755:1;28747:10;;;;;;;;;;;;;;28735:9;:22;28731:94;;;28759:66;28790:10;28814:7;28822:1;28814:10;;;;;;;;;;;;;;28802:9;:22;28759:30;:66::i;12948:361::-:0;13143:45;;;13132:10;13143:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13132:57;;;;13097:12;;13111:17;;13132:10;;;;13143:45;13132:57;;;13143:45;13132:57;;13143:45;13132:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13096:93;;;;13208:7;:57;;;;-1:-1:-1;13220:11:0;;:16;;:44;;;13251:4;13240:24;;;;;;;;;;;;;;;-1:-1:-1;13240:24:0;13220:44;13200:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12948:361;;;;;:::o;13727:195::-;13835:12;;;13797;13835;;;;;;;;;13814:7;;;;13828:5;;13814:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13796:52;;;13867:7;13859:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13727:195;;;:::o;10117:517::-;10210:14;10256:1;10245:8;:12;10237:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10336:1;10324:9;:13;:31;;;;;10354:1;10341:10;:14;10324:31;10316:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10411:20;10434:17;:8;10447:3;10434:12;:17::i;:::-;10411:40;-1:-1:-1;10462:14:0;10479:31;10411:40;10499:10;10479:19;:31::i;:::-;10462:48;-1:-1:-1;10521:16:0;10540:40;10564:15;10540:19;:9;10554:4;10540:13;:19::i;:::-;:23;;:40::i;:::-;10521:59;;10615:11;10603:9;:23;;;;;;;10117:517;-1:-1:-1;;;;;;;10117:517:0:o;11309:511::-;11410:21;11467:1;11452:4;:11;:16;;11444:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11535:4;:11;11524:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11524:23:0;;11514:33;;11571:8;11558:7;11566:1;11558:10;;;;;;;;;;;;;:21;;;;;11595:6;11590:223;11621:1;11607:4;:11;:15;11603:1;:19;11590:223;;;11645:14;11661:15;11680:42;11692:7;11701:4;11706:1;11701:7;;;;;;;;;;;;;;11710:4;11715:1;11719;11715:5;11710:11;;;;;;;;;;;;;;11680;:42::i;:::-;11644:78;;;;11754:47;11767:7;11775:1;11767:10;;;;;;;;;;;;;;11779:9;11790:10;11754:12;:47::i;:::-;11737:7;11745:1;11749;11745:5;11737:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;11624:3:0;;11590:223;;;;11309:511;;;;;:::o;8634:478::-;8723:12;8749:14;8765;8783:26;8794:6;8802;8783:10;:26::i;:::-;8947:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8937:43;;;;;;8850:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8840:262;;;;;;;;;8634:478;-1:-1:-1;;;;;8634:478:0:o;13317:402::-;13542:51;;;13531:10;13542:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13531:63;;;;13496:12;;13510:17;;13531:10;;;;13542:51;13531:63;;;13542:51;13531:63;;13542:51;13531:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13495:99;;;;13613:7;:57;;;;-1:-1:-1;13625:11:0;;:16;;:44;;;13656:4;13645:24;;;;;;;;;;;;;;;-1:-1:-1;13645:24:0;13625:44;13605:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13317:402;;;;;;:::o;23643:735::-;23750:6;23745:626;23776:1;23762:4;:11;:15;23758:1;:19;23745:626;;;23800:13;23815:14;23834:4;23839:1;23834:7;;;;;;;;;;;;;;23843:4;23848:1;23852;23848:5;23843:11;;;;;;;;;;;;;;23799:56;;;;23871:14;23890:42;23918:5;23925:6;23890:27;:42::i;:::-;23870:62;;;23947:14;23964:7;23972:1;23976;23972:5;23964:14;;;;;;;;;;;;;;23947:31;;23994:15;24011;24039:6;24030:15;;:5;:15;;;:61;;24072:9;24088:1;24030:61;;;24054:1;24058:9;24030:61;23993:98;;;;24106:10;24137:1;24123:4;:11;:15;24119:1;:19;:82;;24198:3;24119:82;;;24141:54;24166:7;24175:6;24183:4;24188:1;24192;24188:5;24183:11;;;;;;;;;;;;;;24141:24;:54::i;:::-;24106:95;;24231:48;24256:7;24265:5;24272:6;24231:24;:48::i;:::-;24216:69;;;24304:10;24316;24328:2;24342:1;24332:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24332:12:0;;24216:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23779:3:0;;;;;-1:-1:-1;23745:626:0;;-1:-1:-1;;;;;;;;23745:626:0;;;23643:735;;;:::o;11901:532::-;12002:21;12059:1;12044:4;:11;:16;;12036:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12127:4;:11;12116:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12116:23:0;;12106:33;;12180:9;12150:7;12175:1;12158:7;:14;:18;12150:27;;;;;;;;;;;;;;;;;:39;12214:11;;:15;;12200:226;12231:5;;12200:226;;12259:14;12275:15;12294:42;12306:7;12315:4;12324:1;12320;:5;12315:11;;;;;;;;;;;;;;12328:4;12333:1;12328:7;;;;;;;12294:42;12258:78;;;;12368:46;12380:7;12388:1;12380:10;;;;;;;;;;;;;;12392:9;12403:10;12368:11;:46::i;:::-;12351:7;12363:1;12359;:5;12351:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;12238:3:0;;12200:226;;28980:1214;29093:6;29088:1099;29119:1;29105:4;:11;:15;29101:1;:19;29088:1099;;;29143:13;29158:14;29177:4;29182:1;29177:7;;;;;;;;;;;;;;29186:4;29191:1;29195;29191:5;29186:11;;;;;;;;;;;;;;29142:56;;;;29214:14;29233:42;29261:5;29268:6;29233:27;:42::i;:::-;29213:62;;;29290:19;29327:48;29352:7;29361:5;29368:6;29327:24;:48::i;:::-;29290:86;;29391:16;29422:17;29510:13;29525;29543:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29543:18:0;;;;;;;29509:52;;;;;-1:-1:-1;29509:52:0;;-1:-1:-1;29577:17:0;;29618:15;;;;;;;;:61;;29660:8;29670;29618:61;;;29637:8;29647;29618:61;29576:103;;;;29708:56;29751:12;29715:5;29708:23;;;29740:4;29708:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:56;29694:70;;29794:71;29824:11;29837:12;29851:13;29794:29;:71::i;:::-;29779:86;;29088:1099;;;;29896:15;29913;29941:6;29932:15;;:5;:15;;;:67;;29977:12;29996:1;29932:67;;;29956:1;29960:12;29932:67;29895:104;;;;30014:10;30045:1;30031:4;:11;:15;30027:1;:19;:82;;30106:3;30027:82;;;30049:54;30074:7;30083:6;30091:4;30096:1;30100;30096:5;30091:11;;;;;;;30049:54;30162:12;;;30172:1;30162:12;;;;;;;;;;30124:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;30014:95;;-1:-1:-1;30124:9:0;;;;;;30134:10;;30146;;30014:95;;30162:12;;30124:51;;;;;;;;30162:12;;30124:51;;;;30162:12;;30124:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29122:3:0;;;;;-1:-1:-1;29088:1099:0;;-1:-1:-1;;;;;;;;;;29088:1099:0;14089:129;14173:5;;;14168:16;;;;14160:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10755:472;10848:13;10894:1;10882:9;:13;10874:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10975:1;10963:9;:13;:31;;;;;10993:1;10980:10;:14;10963:31;10955:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11050:14;11067:34;11096:4;11067:24;:9;11081;11067:13;:24::i;:::-;:28;;:34::i;:::-;11050:51;-1:-1:-1;11112:16:0;11131:34;11161:3;11131:25;:10;11146:9;11131:14;:25::i;:34::-;11112:53;;11187:32;11217:1;11200:11;11188:9;:23;;;;;;;11187:29;:32::i;:::-;11176:43;10755:472;-1:-1:-1;;;;;;10755:472:0:o;9674:321::-;9756:12;9799:1;9789:7;:11;9781:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9872:1;9861:8;:12;:28;;;;;9888:1;9877:8;:12;9861:28;9853:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9979:8;9955:21;:7;9967:8;9955:11;:21::i;:::-;:32;;;;;;;9674:321;-1:-1:-1;;;;9674:321:0:o;8193:349::-;8268:14;8284;8329:6;8319:16;;:6;:16;;;;8311:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8416:6;8407:15;;:6;:15;;;:53;;8445:6;8453;8407:53;;;8426:6;8434;8407:53;8388:72;;-1:-1:-1;8388:72:0;-1:-1:-1;8479:20:0;;;8471:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:349;;;;;:::o;15970:1390::-;16188:12;16202;16345:1;16283:64;;16301:7;16283:34;;;16318:6;16326;16283:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16283:50:0;:64;;;16279:150;;;16382:7;16364:37;;;16402:6;16410;16364:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16279:150:0;16440:13;16455;16472:53;16501:7;16510:6;16518;16472:28;:53::i;:::-;16439:86;;;;16540:8;16552:1;16540:13;:30;;;;-1:-1:-1;16557:13:0;;16540:30;16536:817;;;16609:14;;-1:-1:-1;16625:14:0;;-1:-1:-1;16536:817:0;;;16673:19;16695:58;16718:14;16734:8;16744;16695:22;:58::i;:::-;16673:80;;16790:14;16772;:32;16768:574;;16851:10;16833:14;:28;;16825:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16945:14;;-1:-1:-1;16961:14:0;-1:-1:-1;16961:14:0;16768:574;;;17017:19;17039:58;17062:14;17078:8;17088;17039:22;:58::i;:::-;17017:80;;17141:14;17123;:32;;17116:40;;;;17201:10;17183:14;:28;;17175:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17295:14;-1:-1:-1;17311:14:0;;-1:-1:-1;16768:574:0;16536:817;;15970:1390;;;;;;;;;;;:::o;14226:142::-;14278:6;14305;;;:30;;-1:-1:-1;;14320:5:0;;;14334:1;14329;14320:5;14329:1;14315:15;;;;;:20;14305:30;14297:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13953:128;14037:5;;;14032:16;;;;14024:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9170:391;9263:13;9278;9305:14;9324:26;9335:6;9343;9324:10;:26::i;:::-;9304:46;;;9362:13;9377;9410:32;9418:7;9427:6;9435;9410:7;:32::i;:::-;9395:60;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9395:62:0;;;;;;;9361:96;;;;;-1:-1:-1;9361:96:0;;-1:-1:-1;9491:16:0;;;;;;;;:62;;9534:8;9544;9491:62;;;9511:8;9521;9491:62;9468:85;;;;-1:-1:-1;9170:391:0;-1:-1:-1;;;;;;;9170:391:0:o

Swarm Source

ipfs://e14b722fb587ead5fa5d4f483865f4692687582d680f187213266621e4e49944
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.