Contract 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429 5

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9be0fc5b717d52ff280804accf64fce1dd165d681b15cc59377da600327b1fddAdd Liquidity221094422021-12-04 2:22:0441 secs ago0x82347734f465c616eebf9ce72a815ddb458c3828 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00567411
0xa9798a4bb28b2c0df8845be93487f3b6adcd3ad7a3a77a684c1338d8bbc2cd9eSwap Exact Token...221094182021-12-04 2:21:121 min ago0xcd63f2af9b4e8f68e4589f9f015779f50af03bbf IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00497985
0x570184bb2e6dac10445dc915704985e49fd99c5ed72fadf0a92b0d3e3bdcfe5fSwap Exact Token...221093752021-12-04 2:19:423 mins ago0xa9984bb9251d03781677ad543729374a6eb72d41 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00325347
0xb8ae02abde59d053dd5f74001720143c2553e666276af39c973be6063d7b0443Add Liquidity221093662021-12-04 2:19:243 mins ago0x5f6ab6f911ccb0574ad0020136f7a79bc03313cd IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00529548
0x91531d1402bbe9536d1b40cf317b4ad04fe1cb37d232225a547fe4181f511f90Add Liquidity221093602021-12-04 2:19:123 mins ago0xf250273974098061c4aad347ad4e452330052b99 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00591306
0xaa754bbaea6ba80e68b2414ab473708c036742c99f4ee9b662674aeb42c75cf8Remove Liquidity...221093402021-12-04 2:18:324 mins ago0x82347734f465c616eebf9ce72a815ddb458c3828 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00120483
0x62f5a116568a3b8e9624ebfccaa3066e280a73e7b7713ce6d75f5c3d26fdc188Swap Exact Token...221093382021-12-04 2:18:284 mins ago0x5f6ab6f911ccb0574ad0020136f7a79bc03313cd IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00408453
0x2b2573de39cf1be6d0e37c1cef1afe7f37aa09e723772772d462475c3256b037Swap Exact Token...221093362021-12-04 2:18:244 mins ago0x814e2b1a73ed097631e0abdfcf16df44a93510d8 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00140643
0x5549ff43baec9333f875762bbd05e4dd9f1963b28a58b7231caedf429eeab060Add Liquidity ET...221093352021-12-04 2:18:224 mins ago0x58e3cf1c699630db5b12173ea4c4badebcb4770b IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c5742952.8695367031728 MATIC0.00548022
0x5e214b097bc35b1874fc278adb7aa7e14b20eba2909a85ff22feaee0e03d57d0Remove Liquidity...221093342021-12-04 2:18:204 mins ago0x14fdbab1c203b08fae40dee74ce0736e57a18a3a IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.006858522
0xc71cf9ec0982e7bf126c3abd944c2b98084c175d5e3b740061feac68aab97794Swap Exact Token...221093342021-12-04 2:18:204 mins ago0x29417d1823b63a504ce8ef05e194885d07e4fd1f IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.0080619715
0x224784a2736dfaf7d2775dc9ec5d3b8e76ebb6f934296bad7a148505375ee65bRemove Liquidity...221093332021-12-04 2:18:184 mins ago0x82347734f465c616eebf9ce72a815ddb458c3828 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.008503872
0x0ecb3b0ce39bebd1187d1a6a9ad529fc89d13e2140e511d3d1da08d9f0a3b11aSwap Exact Token...221093312021-12-04 2:18:144 mins ago0x0c5d87272c22e396fea5bae06aa917dceabdce72 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.031030659
0xbe54b66352d42a9e747c94a8e0cad8b206e59acec5fe648c10b4369d2470efb7Swap Exact Token...221093252021-12-04 2:18:024 mins ago0x4d57992020336b7875920a147f556ba97069c5eb IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.0054522
0x7191b7315b1d4f7ef40400c26e0a932414eba64b850403ed3e92d078c5e3fecbSwap Exact Token...221093142021-12-04 2:17:405 mins ago0x29417d1823b63a504ce8ef05e194885d07e4fd1f IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00777222472
0x353901751296d349446d9e6524c58e9a45ef7c7a2dc423d9f51813ea90c27dbbSwap Exact Token...221093142021-12-04 2:17:405 mins ago0x29417d1823b63a504ce8ef05e194885d07e4fd1f IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.0066662222
0xd9dd4e119a9c83352ab6f831bdcf6c8e948e2ee14cffa3e667294d7de28aecd4Swap Exact Token...221093142021-12-04 2:17:405 mins ago0x29417d1823b63a504ce8ef05e194885d07e4fd1f IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.007711451
0x4e0a62ef2eb790b268d23db6aa68ddc1cad76f18e8d1415b376ca15302433d5cSwap Exact Token...221093142021-12-04 2:17:405 mins ago0x29417d1823b63a504ce8ef05e194885d07e4fd1f IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.001592063
0x72b9ec848ac9371ecca2854efa735897787677be7a1722dbab9759d63a146027Swap Exact ETH F...221092942021-12-04 2:15:486 mins ago0xaca93f003ee84d42beb18882da5e0ba23ad06881 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574291 MATIC0.00324546
0xe4375fea1c2f08f8ecaf415733d0c24c9b7e898f666d95148d6936650b795e5dSwap Exact Token...221092932021-12-04 2:15:427 mins ago0x58e3cf1c699630db5b12173ea4c4badebcb4770b IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.003294
0xd896242eaf7f8d7a7848a0b2e037b0c90b755e603f74548d2eceffc9f62fd5afSwap Exact Token...221092912021-12-04 2:15:307 mins ago0x9f3c44a7331ca9da2d3432bcb0df91186a27e3d7 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.006200799
0xde2e87936e5d03d017f940b2d49d02a47045c47065fd8730c610921e6b054aaeSwap Exact Token...221092722021-12-04 2:13:369 mins ago0xe4724b6686dc792a816c229deb067e390b006ee2 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.02842387955
0xfbc638cb3682554d59355b97bb9cbf2e17cda68b3e955ece923f22e42f30dbc1Swap Exact Token...221092582021-12-04 2:12:1210 mins ago0x9f3c44a7331ca9da2d3432bcb0df91186a27e3d7 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.01427088
0xbfacbb60fcad225423b7839086a115cd36267cc1665e6bf525f0fa033ecb76e9Swap Exact Token...221092572021-12-04 2:12:0610 mins ago0xe4724b6686dc792a816c229deb067e390b006ee2 IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.00866082272
0x4ed56fc1a4f3dcb9407207b1d12be16d45ef66f52ef8d3f5cffe009362ca53c7Swap Exact Token...221092572021-12-04 2:12:0610 mins ago0xe898563caf3b8ed945bd23e9f1a5eca1f395180e IN  0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290 MATIC0.033690267
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa9798a4bb28b2c0df8845be93487f3b6adcd3ad7a3a77a684c1338d8bbc2cd9e221094182021-12-04 2:21:121 min ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290xcd63f2af9b4e8f68e4589f9f015779f50af03bbf109.808934484779535551 MATIC
0xa9798a4bb28b2c0df8845be93487f3b6adcd3ad7a3a77a684c1338d8bbc2cd9e221094182021-12-04 2:21:121 min ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429109.808934484779535551 MATIC
0x1328c84189dbd44a87f7862ef8a2640533b38a411eeefe90b6c81492f3805b8b221093992021-12-04 2:20:342 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.000310678330417819 MATIC
0x1328c84189dbd44a87f7862ef8a2640533b38a411eeefe90b6c81492f3805b8b221093992021-12-04 2:20:342 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.000310678330417819 MATIC
0x6cf97e07d1290ca9d08ba16aa86eb522c1c451af0771896995c0a756a1fc3ea9221093942021-12-04 2:20:242 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.000997425918246941 MATIC
0x6cf97e07d1290ca9d08ba16aa86eb522c1c451af0771896995c0a756a1fc3ea9221093942021-12-04 2:20:242 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.000997425918246941 MATIC
0xa51dc2b3e41087eeb0eb75cf154edfb3fd192678f609c7181b736638f045207a221093892021-12-04 2:20:142 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.000246910760043307 MATIC
0xa51dc2b3e41087eeb0eb75cf154edfb3fd192678f609c7181b736638f045207a221093892021-12-04 2:20:142 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.000246910760043307 MATIC
0x5549ff43baec9333f875762bbd05e4dd9f1963b28a58b7231caedf429eeab060221093352021-12-04 2:18:224 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429 0x4c28f48448720e9000907bc2611f73022fdce1fa52.869536703172800694 MATIC
0x72b9ec848ac9371ecca2854efa735897787677be7a1722dbab9759d63a146027221092942021-12-04 2:15:486 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429 0x4c28f48448720e9000907bc2611f73022fdce1fa1 MATIC
0xe4375fea1c2f08f8ecaf415733d0c24c9b7e898f666d95148d6936650b795e5d221092932021-12-04 2:15:427 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290x58e3cf1c699630db5b12173ea4c4badebcb4770b54.031755078044120742 MATIC
0xe4375fea1c2f08f8ecaf415733d0c24c9b7e898f666d95148d6936650b795e5d221092932021-12-04 2:15:427 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c5742954.031755078044120742 MATIC
0xd896242eaf7f8d7a7848a0b2e037b0c90b755e603f74548d2eceffc9f62fd5af221092912021-12-04 2:15:307 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290x9f3c44a7331ca9da2d3432bcb0df91186a27e3d727.912658398373284947 MATIC
0xd896242eaf7f8d7a7848a0b2e037b0c90b755e603f74548d2eceffc9f62fd5af221092912021-12-04 2:15:307 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c5742927.912658398373284947 MATIC
0xfbc638cb3682554d59355b97bb9cbf2e17cda68b3e955ece923f22e42f30dbc1221092582021-12-04 2:12:1210 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290x9f3c44a7331ca9da2d3432bcb0df91186a27e3d73.162382610103981725 MATIC
0xfbc638cb3682554d59355b97bb9cbf2e17cda68b3e955ece923f22e42f30dbc1221092582021-12-04 2:12:1210 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574293.162382610103981725 MATIC
0xe1ca9aae87686c8231b060c08cc89f1dc3f71be342bc9d90e958d77b08b67fac221092532021-12-04 2:11:4211 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290x9f3c44a7331ca9da2d3432bcb0df91186a27e3d71.974946978316584946 MATIC
0xe1ca9aae87686c8231b060c08cc89f1dc3f71be342bc9d90e958d77b08b67fac221092532021-12-04 2:11:4211 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574291.974946978316584946 MATIC
0x3160652289e373a5cd86cfc1ba47319deaefd10329ea07a324dd749dc5951c73221092382021-12-04 2:10:4412 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.000309762329848071 MATIC
0x3160652289e373a5cd86cfc1ba47319deaefd10329ea07a324dd749dc5951c73221092382021-12-04 2:10:4412 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.000309762329848071 MATIC
0x5df614ec4a7037b077bd825afe8b87c8ba5a4e4cfa66a89a1194f7b35c6f5404221092322021-12-04 2:10:3212 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.00099096554147898 MATIC
0x5df614ec4a7037b077bd825afe8b87c8ba5a4e4cfa66a89a1194f7b35c6f5404221092322021-12-04 2:10:3212 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.00099096554147898 MATIC
0xcd853248a62b412a5af48c73b0c68436ca38a3e91a166cf394bcadb7db4fe656221092322021-12-04 2:10:3212 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429Polycat Finance: Deployer0.000253566565805635 MATIC
0xcd853248a62b412a5af48c73b0c68436ca38a3e91a166cf394bcadb7db4fe656221092322021-12-04 2:10:3212 mins ago 0x4c28f48448720e9000907bc2611f73022fdce1fa 0xa102072a4c07f06ec3b4900fdc4c7b80b6c574290.000253566565805635 MATIC
0x5f873ff8cadf48b697910e633a35b2b2e17dd11bf53a261d82acf7619564a5a6221090632021-12-04 2:04:4617 mins ago 0xa102072a4c07f06ec3b4900fdc4c7b80b6c57429 0x4c28f48448720e9000907bc2611f73022fdce1fa46.62842042 MATIC
[ 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, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-11
*/

pragma solidity >= 0.6.6;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}// SPDX-License-Identifier: MIT


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

library SafeMathUniswap {
    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 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 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;
}


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


interface IERC20Uniswap {
    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 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 migrator() 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;
    function setMigrator(address) external;
}



// 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 UniswapV2Library {
    using SafeMathUniswap 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'f187ed688403aa4f7acfada758d8d53698753b998a3071b06f1b777f4330eaf3' // init code hash
            ))));
    }

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

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

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

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

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

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












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










contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        uint256 chainId;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,uint256 chainId)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                getChainId()
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public pure returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

contract NativeMetaTransaction is EIP712Base {
    using SafeMathUniswap for uint;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            msg.sender,
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }

    function _msgSender() internal view returns (address payable sender) {
        if(msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }

}

contract UniswapV2Router02 is IUniswapV2Router02, NativeMetaTransaction{
    using SafeMathUniswap 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;
        _initializeEIP712("UniswapV2Router02");
    }

    receive() external payable {
        assert(_msgSender() == 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) {
        address sender = _msgSender();
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, 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 sender = _msgSender();
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, 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(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(_msgSender(), 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(_msgSender(), 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(_msgSender(), 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, IERC20Uniswap(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(_msgSender(), 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], _msgSender(), 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], _msgSender(), 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], _msgSender(), 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], _msgSender(), 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(_msgSender(), 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 = IERC20Uniswap(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], _msgSender(), UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(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 = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(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], _msgSender(), UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","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"}]

60c06040526000805460ff191690553480156200001b57600080fd5b506040516200622b3803806200622b833981810160405260408110156200004157600080fd5b5080516020918201516001600160601b0319606083811b821660805282901b1660a0526040805180820190915260118152702ab734b9bbb0b82b192937baba32b9181960791b9381019390935290916200009b90620000a3565b5050620001ce565b60005460ff1615620000ed576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b620000f88162000108565b506000805460ff19166001179055565b604051806080016040528060528152602001620061d96052913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc63062000176620001ca565b60405160200180868152602001858152602001848152602001836001600160a01b03168152602001828152602001955050505050506040516020818303038152906040528051906020012060018190555050565b4690565b60805160601c60a05160601c615edd620002fc600039806101cd52806110e1528061111c528061167752806119415280611ded5280611fd1528061250e528061264d528061275b52806128625280612a155280612aaa5280612d465280612ded5280612ebb5280612fc052806130a85280613129528061378d5280613ada5280613b3c5280613b705280613bf15280613de05280613f905280614025525080611769528061186e5280611a145280611a535280611c4a5280611edf5280611faf52806121c352806129485280612ae95280612c7c528061316852806134695280613712528061373b528061376b52806139745280613b1a5280613ec652806140645280614c495280614c8c5280614fd652806151a152806156c452806157b1528061588b5250615edd6000f3fe6080604052600436106101c65760003560e01c8063791ac947116100f7578063b6f9de9511610095578063ded9382a11610064578063ded9382a14610e0a578063e8e3370014610e8a578063f305d71914610f17578063fb3bdb4114610f6a57610229565b8063b6f9de9514610c41578063baa2abde14610cd4578063c45a015514610d3e578063d06ca61f14610d5357610229565b80638803dbee116100d15780638803dbee14610ac8578063ad5c464814610b6d578063ad615dec14610bab578063af2979eb14610be157610229565b8063791ac9471461095a5780637ff36ab5146109ff57806385f8c25914610a9257610229565b80632195995c1161016457806338ed17391161013e57806338ed1739146106eb5780634a25d94a146107905780635b0d5984146108355780635c11d795146108b557610229565b80632195995c1461060b5780632d0335ab146106965780633408e470146106d657610229565b80630f7e5970116101a05780630f7e59701461043557806318cbafe51461044a5780631f00ca741461053f57806320379ee5146105f657610229565b806302751cec1461022e578063054d50d4146102a75780630c53c51c146102ef57610229565b36610229577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661020a610ffd565b73ffffffffffffffffffffffffffffffffffffffff161461022757fe5b005b600080fd5b34801561023a57600080fd5b5061028e600480360360c081101561025157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135611068565b6040805192835260208301919091528051918290030190f35b3480156102b357600080fd5b506102dd600480360360608110156102ca57600080fd5b50803590602081013590604001356111bb565b60408051918252519081900360200190f35b6103c0600480360360a081101561030557600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561033d57600080fd5b82018360208201111561034f57600080fd5b8035906020019184600183028401116401000000008311171561037157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020810135906040013560ff166111d0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fa5781810151838201526020016103e2565b50505050905090810190601f1680156104275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044157600080fd5b506103c06115b5565b34801561045657600080fd5b506104ef600480360360a081101561046d57600080fd5b81359160208101359181019060608101604082013564010000000081111561049457600080fd5b8201836020820111156104a657600080fd5b803590602001918460208302840111640100000000831117156104c857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356115ee565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561052b578181015183820152602001610513565b505050509050019250505060405180910390f35b34801561054b57600080fd5b506104ef6004803603604081101561056257600080fd5b8135919081019060408101602082013564010000000081111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460208302840111640100000000831117156105b857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a0d945050505050565b34801561060257600080fd5b506102dd611a43565b34801561061757600080fd5b5061028e600480360361016081101561062f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611a49565b3480156106a257600080fd5b506102dd600480360360208110156106b957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ba7565b3480156106e257600080fd5b506102dd611bcf565b3480156106f757600080fd5b506104ef600480360360a081101561070e57600080fd5b81359160208101359181019060608101604082013564010000000081111561073557600080fd5b82018360208201111561074757600080fd5b8035906020019184602083028401116401000000008311171561076957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611bd3565b34801561079c57600080fd5b506104ef600480360360a08110156107b357600080fd5b8135916020810135918101906060810160408201356401000000008111156107da57600080fd5b8201836020820111156107ec57600080fd5b8035906020019184602083028401116401000000008311171561080e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d64565b34801561084157600080fd5b506102dd600480360361014081101561085957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611fa7565b3480156108c157600080fd5b50610227600480360360a08110156108d857600080fd5b8135916020810135918101906060810160408201356401000000008111156108ff57600080fd5b82018360208201111561091157600080fd5b8035906020019184602083028401116401000000008311171561093357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612119565b34801561096657600080fd5b50610227600480360360a081101561097d57600080fd5b8135916020810135918101906060810160408201356401000000008111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460208302840111640100000000831117156109d857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612487565b6104ef60048036036080811015610a1557600080fd5b81359190810190604081016020820135640100000000811115610a3757600080fd5b820183602082011115610a4957600080fd5b80359060200191846020830284011164010000000083111715610a6b57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356127ee565b348015610a9e57600080fd5b506102dd60048036036060811015610ab557600080fd5b5080359060208101359060400135612bf8565b348015610ad457600080fd5b506104ef600480360360a0811015610aeb57600080fd5b813591602081013591810190606081016040820135640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846020830284011164010000000083111715610b4657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612c05565b348015610b7957600080fd5b50610b82612d44565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610bb757600080fd5b506102dd60048036036060811015610bce57600080fd5b5080359060208101359060400135612d68565b348015610bed57600080fd5b506102dd600480360360c0811015610c0457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612d75565b61022760048036036080811015610c5757600080fd5b81359190810190604081016020820135640100000000811115610c7957600080fd5b820183602082011115610c8b57600080fd5b80359060200191846020830284011164010000000083111715610cad57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612f4e565b348015610ce057600080fd5b5061028e600480360360e0811015610cf757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356133ef565b348015610d4a57600080fd5b50610b82613710565b348015610d5f57600080fd5b506104ef60048036036040811015610d7657600080fd5b81359190810190604081016020820135640100000000811115610d9857600080fd5b820183602082011115610daa57600080fd5b80359060200191846020830284011164010000000083111715610dcc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613734945050505050565b348015610e1657600080fd5b5061028e6004803603610140811015610e2e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613761565b348015610e9657600080fd5b50610ef96004803603610100811015610eae57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356138d9565b60408051938452602084019290925282820152519081900360600190f35b610ef9600480360360c0811015610f2d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135613a5f565b6104ef60048036036080811015610f8057600080fd5b81359190810190604081016020820135640100000000811115610fa257600080fd5b820183602082011115610fb457600080fd5b80359060200191846020830284011164010000000083111715610fd657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135613d6c565b6000333014156110625760606000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff1691506110659050565b50335b90565b60008082428110156110db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61110a897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6133ef565b909350915061111a8986856141ac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561118d57600080fd5b505af11580156111a1573d6000803e3d6000fd5b505050506111af8583614389565b50965096945050505050565b60006111c88484846144c6565b949350505050565b60606111da615c39565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff88166000818152600260209081529084902054835282015290810186905261122587828787876145d2565b61127a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615d786021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600260205260409020546112ab9060016146ed565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561138757818101518382015260200161136f565b50505050905090810190601f1680156113b45780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600060603073ffffffffffffffffffffffffffffffffffffffff16888a6040516020018083805190602001908083835b6020831061143057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016113f3565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106114d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611494565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611533576040519150601f19603f3d011682016040523d82523d6000602084013e611538565b606091505b5091509150816115a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604482015290519081900360640190fd5b98975050505050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6060814281101561166057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106116c557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461176457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6117c27f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061475f92505050565b915086826001845103815181106117d557fe5b60200260200101511015611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e2e602b913960400191505060405180910390fd5b6119008686600081811061184457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16611869610ffd565b6118e67f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061189a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b60018181106118c457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166148c5565b856000815181106118f357fe5b60200260200101516149b0565b61193f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614b80915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551038151811061198b57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119c957600080fd5b505af11580156119dd573d6000803e3d6000fd5b50505050611a0284836001855103815181106119f557fe5b6020026020010151614389565b509695505050505050565b6060611a3a7f00000000000000000000000000000000000000000000000000000000000000008484614df1565b90505b92915050565b60015490565b6000806000611a797f00000000000000000000000000000000000000000000000000000000000000008f8f6148c5565b9050600087611a88578c611aaa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf611ad0610ffd565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015230602483015260448201859052606482018d905260ff8b16608483015260a482018a905260c482018990525160e480830192600092919082900301818387803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050611b8d8f8f8f8f8f8f8f6133ef565b809450819550505050509b509b9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b4690565b60608142811015611c4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611ca37f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061475f92505050565b91508682600184510381518110611cb657fe5b60200260200101511015611d15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e2e602b913960400191505060405180910390fd5b611d258686600081811061184457fe5b611a0282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614b80915050565b60608142811015611dd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eda57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611f387f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250614df192505050565b91508682600081518110611f4857fe5b60200260200101511115611834576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615dbe6027913960400191505060405180910390fd5b600080611ff57f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006148c5565b9050600086612004578b612026565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf61204c610ffd565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015230602483015260448201859052606482018c905260ff8a16608483015260a4820189905260c482018890525160e480830192600092919082900301818387803b1580156120e257600080fd5b505af11580156120f6573d6000803e3d6000fd5b505050506121088d8d8d8d8d8d612d75565b9d9c50505050505050505050505050565b804281101561218957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61221f8585600081811061219957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166121be610ffd565b6122197f0000000000000000000000000000000000000000000000000000000000000000898960008181106121ef57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a60018181106118c457fe5b8a6149b0565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061224f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156122d257600080fd5b505afa1580156122e6573d6000803e3d6000fd5b505050506040513d60208110156122fc57600080fd5b5051604080516020888102828101820190935288825292935061233e929091899189918291850190849080828437600092019190915250889250614f7f915050565b866124268288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061237157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123f457600080fd5b505afa158015612408573d6000803e3d6000fd5b505050506040513d602081101561241e57600080fd5b5051906152fc565b101561247d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e2e602b913960400191505060405180910390fd5b5050505050505050565b80428110156124f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061255c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61260b8585600081811061219957fe5b612649858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614f7f915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126d257600080fd5b505afa1580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b5051905086811015612759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e2e602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b5050505061247d8482614389565b6060814281101561286057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106128a457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461294357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6129a17f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061475f92505050565b915086826001845103815181106129b457fe5b60200260200101511015612a13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e2e602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110612a5c57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612b157f0000000000000000000000000000000000000000000000000000000000000000898960008181106121ef57fe5b84600081518110612b2257fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b7d57600080fd5b505af1158015612b91573d6000803e3d6000fd5b505050506040513d6020811015612ba757600080fd5b5051612baf57fe5b612bee82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614b80915050565b5095945050505050565b60006111c884848461536e565b60608142811015612c7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612cd57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250614df192505050565b91508682600081518110612ce557fe5b60200260200101511115611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615dbe6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006111c884848461547a565b60008142811015612de757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612e16887f000000000000000000000000000000000000000000000000000000000000000089898930896133ef565b905080925050612eb988858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b50516141ac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f2c57600080fd5b505af1158015612f40573d6000803e3d6000fd5b50505050611a028483614389565b8042811015612fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061300257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131947f0000000000000000000000000000000000000000000000000000000000000000898960008181106121ef57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131e857600080fd5b505af11580156131fc573d6000803e3d6000fd5b505050506040513d602081101561321257600080fd5b505161321a57fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061324a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156132cd57600080fd5b505afa1580156132e1573d6000803e3d6000fd5b505050506040513d60208110156132f757600080fd5b505160408051602089810282810182019093528982529293506133399290918a918a918291850190849080828437600092019190915250899250614f7f915050565b876124268289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061336c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123f457600080fd5b600080824281101561346257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b600061348f7f00000000000000000000000000000000000000000000000000000000000000008c8c6148c5565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd6134b5610ffd565b838c6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561352757600080fd5b505af115801561353b573d6000803e3d6000fd5b505050506040513d602081101561355157600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156135c457600080fd5b505af11580156135d8573d6000803e3d6000fd5b505050506040513d60408110156135ee57600080fd5b508051602090910151909250905060006136088e8e615554565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614613645578183613648565b82825b90975095508a8710156136a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615de56026913960400191505060405180910390fd5b898610156136ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d056026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060611a3a7f0000000000000000000000000000000000000000000000000000000000000000848461475f565b60008060006137b17f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006148c5565b90506000876137c0578c6137e2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508173ffffffffffffffffffffffffffffffffffffffff1663d505accf613808610ffd565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015230602483015260448201859052606482018d905260ff8b16608483015260a482018a905260c482018990525160e480830192600092919082900301818387803b15801561389e57600080fd5b505af11580156138b2573d6000803e3d6000fd5b505050506138c48e8e8e8e8e8e611068565b909f909e509c50505050505050505050505050565b6000806000834281101561394e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000613958610ffd565b90506139688d8d8d8d8d8d6156a7565b9095509350600061399a7f00000000000000000000000000000000000000000000000000000000000000008f8f6148c5565b90506139a88e8383896149b0565b6139b48d8383886149b0565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015613a1d57600080fd5b505af1158015613a31573d6000803e3d6000fd5b505050506040513d6020811015613a4757600080fd5b5051959e949d50949b50929950505050505050505050565b60008060008342811015613ad457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b613b028a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6156a7565b90945092506000613b11610ffd565b90506000613b607f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006148c5565b9050613b6e8c8383896149b0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015613bd657600080fd5b505af1158015613bea573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c8057600080fd5b505af1158015613c94573d6000803e3d6000fd5b505050506040513d6020811015613caa57600080fd5b5051613cb257fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015613d1b57600080fd5b505af1158015613d2f573d6000803e3d6000fd5b505050506040513d6020811015613d4557600080fd5b5051935034851015613d5d57613d5d82863403614389565b50505096509650969350505050565b60608142811015613dde57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110613e2257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ec157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b613f1f7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250614df192505050565b91503482600081518110613f2f57fe5b60200260200101511115613f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615dbe6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613fd757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561400a57600080fd5b505af115801561401e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6140907f0000000000000000000000000000000000000000000000000000000000000000898960008181106121ef57fe5b8460008151811061409d57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156140f857600080fd5b505af115801561410c573d6000803e3d6000fd5b505050506040513d602081101561412257600080fd5b505161412a57fe5b61416982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614b80915050565b8160008151811061417657fe5b6020026020010151341115612bee57612bee614190610ffd565b8360008151811061419d57fe5b60200260200101513403614389565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061428257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614245565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142e4576040519150601f19603f3d011682016040523d82523d6000602084013e6142e9565b606091505b5091509150818015614317575080511580614317575080806020019051602081101561431457600080fd5b50515b61438257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b6020831061440057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016143c3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614462576040519150601f19603f3d011682016040523d82523d6000602084013e614467565b606091505b50509050806144c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615e0b6023913960400191505060405180910390fd5b505050565b6000808411614520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615e7d602b913960400191505060405180910390fd5b6000831180156145305750600082115b614585576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615d506028913960400191505060405180910390fd5b6000614593856103e56159d4565b905060006145a182856159d4565b905060006145bb836145b5886103e86159d4565b906146ed565b90508082816145c657fe5b04979650505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8616614640576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d2b6025913960400191505060405180910390fd5b600161465361464e87615a5a565b615aea565b83868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156146aa573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b80820182811015611a3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60606002825110156147d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156147ea57600080fd5b50604051908082528060200260200182016040528015614814578160200160208202803683370190505b509050828160008151811061482557fe5b60200260200101818152505060005b60018351038110156148bd576000806148778786858151811061485357fe5b602002602001015187866001018151811061486a57fe5b6020026020010151615b51565b9150915061489984848151811061488a57fe5b602002602001015183836144c6565b8484600101815181106148a857fe5b60209081029190910101525050600101614834565b509392505050565b60008060006148d48585615554565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527ff187ed688403aa4f7acfada758d8d53698753b998a3071b06f1b777f4330eaf3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b60208310614a8e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614a51565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614af0576040519150601f19603f3d011682016040523d82523d6000602084013e614af5565b606091505b5091509150818015614b23575080511580614b235750808060200190516020811015614b2057600080fd5b50515b614b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e596024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015614deb57600080848381518110614b9e57fe5b6020026020010151858460010181518110614bb557fe5b6020026020010151915091506000614bcd8383615554565b5090506000878560010181518110614be157fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614c2957826000614c2d565b6000835b91509150600060028a51038810614c445788614c85565b614c857f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110614c7857fe5b60200260200101516148c5565b9050614cb27f000000000000000000000000000000000000000000000000000000000000000088886148c5565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614cfc576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614d71578181015183820152602001614d59565b50505050905090810190601f168015614d9e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614dc057600080fd5b505af1158015614dd4573d6000803e3d6000fd5b505060019099019850614b83975050505050505050565b50505050565b6060600282511015614e6457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015614e7c57600080fd5b50604051908082528060200260200182016040528015614ea6578160200160208202803683370190505b5090508281600183510381518110614eba57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156148bd57600080614f1a87866001860381518110614f0657fe5b602002602001015187868151811061486a57fe5b91509150614f3c848481518110614f2d57fe5b6020026020010151838361536e565b846001850381518110614f4b57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614eea565b60005b60018351038110156144c157600080848381518110614f9d57fe5b6020026020010151858460010181518110614fb457fe5b6020026020010151915091506000614fcc8383615554565b5090506000614ffc7f000000000000000000000000000000000000000000000000000000000000000085856148c5565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561504a57600080fd5b505afa15801561505e573d6000803e3d6000fd5b505050506040513d606081101561507457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146150be5782846150c1565b83835b91509150615130828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123f457600080fd5b955061513d8683836144c6565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461518157826000615185565b6000835b91509150600060028c51038a1061519c578a6151d0565b6151d07f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110614c7857fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015615280578181015183820152602001615268565b50505050905090810190601f1680156152ad5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156152cf57600080fd5b505af11580156152e3573d6000803e3d6000fd5b50506001909b019a50614f829950505050505050505050565b80820382811115611a3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b60008084116153c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615cb4602c913960400191505060405180910390fd5b6000831180156153d85750600082115b61542d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615d506028913960400191505060405180910390fd5b60006154456103e861543f86886159d4565b906159d4565b905060006154596103e561543f86896152fc565b9050615470600182848161546957fe5b04906146ed565b9695505050505050565b60008084116154d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d996025913960400191505060405180910390fd5b6000831180156154e45750600082115b615539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615d506028913960400191505060405180910390fd5b8261554485846159d4565b8161554b57fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156155dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ce06025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610615616578284615619565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166156a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561576757600080fd5b505afa15801561577b573d6000803e3d6000fd5b505050506040513d602081101561579157600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415615883577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561585657600080fd5b505af115801561586a573d6000803e3d6000fd5b505050506040513d602081101561588057600080fd5b50505b6000806158b17f00000000000000000000000000000000000000000000000000000000000000008b8b615b51565b915091508160001480156158c3575080155b156158d3578793508692506159c7565b60006158e089848461547a565b905087811161594d5785811015615942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d056026913960400191505060405180910390fd5b8894509250826159c5565b600061595a89848661547a565b90508981111561596657fe5b878110156159bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615de56026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806159ef575050808202828282816159ec57fe5b04145b611a3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b6000604051806080016040528060438152602001615c71604391398051906020012082600001518360200151846040015180519060200120604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b6000615af4611a43565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b6000806000615b608585615554565b509050600080615b718888886148c5565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015615bb657600080fd5b505afa158015615bca573d6000803e3d6000fd5b505050506040513d6060811015615be057600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615c27578082615c2a565b81815b90999098509650505050505050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152509056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e544e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5349474e4552556e697377617056324c6962726172793a20494e53554646494349454e545f4c49515549444954595369676e657220616e64207369676e617475726520646f206e6f74206d61746368556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a26469706673582212208a85a2c626c46b43f0f3538c4ee88221533487d0ee9b7dd021e490e433d3a93a64736f6c634300060c0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c75696e7432353620636861696e496429000000000000000000000000e7fb3e833efe5f9c441105eb65ef8b261266423b0000000000000000000000004c28f48448720e9000907bc2611f73022fdce1fa

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

000000000000000000000000e7fb3e833efe5f9c441105eb65ef8b261266423b0000000000000000000000004c28f48448720e9000907bc2611f73022fdce1fa

-----Decoded View---------------
Arg [0] : _factory (address): 0xe7fb3e833efe5f9c441105eb65ef8b261266423b
Arg [1] : _WETH (address): 0x4c28f48448720e9000907bc2611f73022fdce1fa

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e7fb3e833efe5f9c441105eb65ef8b261266423b
Arg [1] : 0000000000000000000000004c28f48448720e9000907bc2611f73022fdce1fa


Deployed ByteCode Sourcemap

21497:18764:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22073:4;22057:20;;:12;:10;:12::i;:::-;:20;;;22050:28;;;;21497:18764;;;;;26275:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26275:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39205:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39205:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18763:1142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18763:1142:0;;-1:-1:-1;;18763:1142:0;;;-1:-1:-1;;;18763:1142:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16029:43;;;;;;;;;;;;;:::i;33463:852::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33463:852:0;-1:-1:-1;33463:852:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40005:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40005:253:0;;-1:-1:-1;40005:253:0;;-1:-1:-1;;;;;40005:253:0:i;17033:101::-;;;;;;;;;;;;;:::i;26954:679::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26954:679:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20331:107::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20331:107:0;;;;:::i;17142:161::-;;;;;;;;;;;;;:::i;30674:630::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30674:630:0;-1:-1:-1;30674:630:0;;;;;;;;;:::i;32627:830::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32627:830:0;-1:-1:-1;32627:830:0;;;;;;;;;:::i;29102:720::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29102:720:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36507:730::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36507:730:0;-1:-1:-1;36507:730:0;;;;;;;;;:::i;38113:852::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38113:852:0;-1:-1:-1;38113:852:0;;;;;;;;;:::i;31924:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31924:697:0;-1:-1:-1;31924:697:0;;;;;;;;;:::i;39475:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39475:261:0;;;;;;;;;;;;:::i;31310:608::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31310:608:0;-1:-1:-1;31310:608:0;;;;;;;;;:::i;21662:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39009:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39009:188:0;;;;;;;;;;;;:::i;28389:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28389:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37243:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37243:864:0;-1:-1:-1;37243:864:0;;;;;;;;;:::i;25402:867::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25402:867:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21614:41::-;;;;;;;;;;;;;:::i;39744:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39744:253:0;;-1:-1:-1;39744:253:0;;-1:-1:-1;;;;;39744:253:0:i;27639:671::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27639:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23577:770::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23577:770:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;24353:1006;;;;;;;;;;;;;;;;-1:-1:-1;24353:1006:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34321:812::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34321:812:0;-1:-1:-1;34321:812:0;;;;;;;;;:::i;20940:548::-;20985:22;21023:10;21045:4;21023:27;21020:437;;;21067:18;21088:8;;21067:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;21127:8:0;21316:17;21310:24;21336:42;21306:73;;-1:-1:-1;21166:228:0;;-1:-1:-1;21166:228:0;;-1:-1:-1;21435:10:0;21020:437;20940:548;:::o;26275:673::-;26512:16;26530:14;26493:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26584:196:::1;26614:5;26634:4;26653:9;26677:14;26706:12;26741:4;26761:8;26584:15;:196::i;:::-;26557:223:::0;;-1:-1:-1;26557:223:0;-1:-1:-1;26791:51:0::1;26819:5:::0;26826:2;26557:223;26791:27:::1;:51::i;:::-;26859:4;26853:20;;;26874:9;26853:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26895:45;26926:2;26930:9;26895:30;:45::i;:::-;26275:673:::0;;;;;;;;;;:::o;39205:262::-;39358:14;39397:62;39427:8;39437:9;39448:10;39397:29;:62::i;:::-;39390:69;39205:262;-1:-1:-1;;;;39205:262:0:o;18763:1142::-;18964:12;18989:29;;:::i;:::-;-1:-1:-1;19021:152:0;;;;;;;;19059:19;;;-1:-1:-1;19059:19:0;;;:6;:19;;;;;;;;;19021:152;;;;;;;;;;;19208:45;19066:11;19021:152;19236:4;19242;19248;19208:6;:45::i;:::-;19186:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19403:19;;;;;;;:6;:19;;;;;;:26;;19427:1;19403:23;:26::i;:::-;19381:6;:19;19388:11;19381:19;;;;;;;;;;;;;;;:48;;;;19447:117;19485:11;19511:10;19536:17;19447:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19675:12;19689:23;19724:4;19716:18;;19766:17;19785:11;19749:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19716:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19674:134;;;;19827:7;19819:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19887:10;18763:1142;-1:-1:-1;;;;;;;;18763:1142:0:o;16029:43::-;;;;;;;;;;;;;;;;;;;:::o;33463:852::-;33677:21;33649:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33724:29:::1;33749:4;33724:29;:4:::0;;33729:15;;;33724:21;;::::1;;;;;;;;;;;;;:29;;;33716:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33808:55;33839:7;33848:8;33858:4;;33808:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33808:30:0::1;::::0;-1:-1:-1;;;33808:55:0:i:1;:::-;33798:65;;33913:12;33882:7;33907:1;33890:7;:14;:18;33882:27;;;;;;;;;;;;;;:43;;33874:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33984:143;34030:4;;34035:1;34030:7;;;;;;;;;;;;;;;34039:12;:10;:12::i;:::-;34053:51;34078:7;34087:4;;34092:1;34087:7;;;;;;;;;;;;;;;34096:4;;34101:1;34096:7;;;;;;;;;;;;;;;34053:24;:51::i;:::-;34106:7;34114:1;34106:10;;;;;;;;;;;;;;33984:31;:143::i;:::-;34138:35;34144:7;34153:4;;34138:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34167:4:0::1;::::0;-1:-1:-1;34138:5:0::1;::::0;-1:-1:-1;;34138:35:0:i:1;:::-;34190:4;34184:20;;;34205:7;34230:1;34213:7;:14;:18;34205:27;;;;;;;;;;;;;;34184:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34244:63;34275:2;34279:7;34304:1;34287:7;:14;:18;34279:27;;;;;;;;;;;;;;34244:30;:63::i;:::-;33463:852:::0;;;;;;;;;:::o;40005:253::-;40149:21;40195:55;40225:7;40234:9;40245:4;40195:29;:55::i;:::-;40188:62;;40005:253;;;;;:::o;17033:101::-;17111:15;;17033:101;:::o;26954:679::-;27260:12;27274;27299;27314:49;27339:7;27348:6;27356;27314:24;:49::i;:::-;27299:64;;27374:10;27387;:33;;27411:9;27387:33;;;27405:2;27387:33;27374:46;;27446:4;27431:27;;;27459:12;:10;:12::i;:::-;27431:82;;;;;;;;;;;;;;;;;;;27481:4;27431:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27431:82:0;;;;;;;-1:-1:-1;27431:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27545:80;27561:6;27569;27577:9;27588:10;27600;27612:2;27616:8;27545:15;:80::i;:::-;27524:101;;;;;;;;26954:679;;;;;;;;;;;;;;;;:::o;20331:107::-;20418:12;;20384:13;20418:12;;;:6;:12;;;;;;;20331:107::o;17142:161::-;17256:9;17142:161;:::o;30674:630::-;30898:21;30879:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30942:55:::1;30973:7;30982:8;30992:4;;30942:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30942:30:0::1;::::0;-1:-1:-1;;;30942:55:0:i:1;:::-;30932:65;;31047:12;31016:7;31041:1;31024:7;:14;:18;31016:27;;;;;;;;;;;;;;:43;;31008:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31118:143;31164:4;;31169:1;31164:7;;;;;;31118:143;31272:24;31278:7;31287:4;;31272:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31293:2:0;;-1:-1:-1;31272:5:0::1;::::0;-1:-1:-1;;31272:24:0:i:1;32627:830::-:0;32841:21;32813:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32888:29:::1;32913:4;32888:29;:4:::0;;32893:15;;;32888:21;;::::1;;;;;;;;;;;;;:29;;;32880:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32972:55;33002:7;33011:9;33022:4;;32972:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32972:29:0::1;::::0;-1:-1:-1;;;32972:55:0:i:1;:::-;32962:65;;33060:11;33046:7;33054:1;33046:10;;;;;;;;;;;;;;:25;;33038:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29102:720:::0;29420:14;29447:12;29462:46;29487:7;29496:5;29503:4;29462:24;:46::i;:::-;29447:61;;29519:10;29532;:33;;29556:9;29532:33;;;29550:2;29532:33;29519:46;;29591:4;29576:27;;;29604:12;:10;:12::i;:::-;29576:82;;;;;;;;;;;;;;;;;;;29626:4;29576:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29576:82:0;;;;;;;-1:-1:-1;29576:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29681:133;29743:5;29750:9;29761:14;29777:12;29791:2;29795:8;29681:47;:133::i;:::-;29669:145;29102:720;-1:-1:-1;;;;;;;;;;;;;29102:720:0:o;36507:730::-;36741:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36762:141:::1;36808:4;;36813:1;36808:7;;;;;;;;;;;;;;;36817:12;:10;:12::i;:::-;36831:51;36856:7;36865:4;;36870:1;36865:7;;;;;;;;;;;;;;;36874:4;;36879:1;36874:7;;;;;;36831:51;36884:8;36762:31;:141::i;:::-;36914:18;36949:4:::0;;36954:15;;;36949:21;;::::1;;;;;;;;;;;;;36935:46;;;36982:2;36935:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36935:50:0;36996:44:::1;::::0;;36935:50:::1;36996:44:::0;;::::1;::::0;;;;;;;;;;;36935:50;;-1:-1:-1;36996:44:0::1;::::0;;;37031:4;;;;;;36996:44;::::1;::::0;37031:4;;36996:44;37031:4;36996:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37037:2:0;;-1:-1:-1;36996:34:0::1;::::0;-1:-1:-1;;36996:44:0:i:1;:::-;37146:12:::0;37073:69:::1;37128:13:::0;37087:4;;37092:15;;;37087:21;;::::1;;;;;;;;;;;;;37073:46;;;37120:2;37073:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37073:50:0;;:54:::1;:69::i;:::-;:85;;37051:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21826:1;36507:730:::0;;;;;;;:::o;38113:852::-;38380:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38414:29:::1;38439:4;38414:29;:4:::0;;38419:15;;;38414:21;;::::1;;;;;;;;;;;;;:29;;;38406:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38488:141;38534:4;;38539:1;38534:7;;;;;;38488:141;38640:55;38675:4;;38640:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38689:4:0::1;::::0;-1:-1:-1;38640:34:0::1;::::0;-1:-1:-1;;38640:55:0:i:1;:::-;38706:14;38737:4;38723:29;;;38761:4;38723:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38723:44:0;;-1:-1:-1;38786:25:0;;::::1;;38778:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38876:4;38870:20;;;38891:9;38870:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38912:45;38943:2;38947:9;38912:30;:45::i;31924:697::-:0;32140:21;32112:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32198:4:::1;32187:15;;:4;;32192:1;32187:7;;;;;;;;;;;;;;;:15;;;32179:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32257:56;32288:7;32297:9;32308:4;;32257:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32257:30:0::1;::::0;-1:-1:-1;;;32257:56:0:i:1;:::-;32247:66;;32363:12;32332:7;32357:1;32340:7;:14;:18;32332:27;;;;;;;;;;;;;;:43;;32324:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32440:4;32434:19;;;32461:7;32469:1;32461:10;;;;;;;;;;;;;;32434:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32498:4;32492:20;;;32513:51;32538:7;32547:4;;32552:1;32547:7;;;;;;32513:51;32566:7;32574:1;32566:10;;;;;;;;;;;;;;32492:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32492:85:0;32485:93:::1;;;;32589:24;32595:7;32604:4;;32589:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32610:2:0;;-1:-1:-1;32589:5:0::1;::::0;-1:-1:-1;;32589:24:0:i:1;:::-;31924:697:::0;;;;;;;;:::o;39475:261::-;39628:13;39666:62;39695:9;39706;39717:10;39666:28;:62::i;31310:608::-;31534:21;31515:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31578:55:::1;31608:7;31617:9;31628:4;;31578:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31578:29:0::1;::::0;-1:-1:-1;;;31578:55:0:i:1;:::-;31568:65;;31666:11;31652:7;31660:1;31652:10;;;;;;;;;;;;;;:25;;31644:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21662:38:::0;;;:::o;39009:188::-;39106:12;39138:51;39161:7;39170:8;39180;39138:22;:51::i;28389:707::-;28655:14;28636:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28698:196:::1;28728:5;28748:4;28767:9;28791:14;28820:12;28855:4;28875:8;28698:15;:196::i;:::-;28682:212;;;;;;28905:85;28933:5;28940:2;28958:5;28944:30;;;28983:4;28944:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28944:45:0;28905:27:::1;:85::i;:::-;29007:4;29001:20;;;29022:9;29001:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29043:45;29074:2;29078:9;29043:30;:45::i;37243:864::-:0;37503:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37548:4:::1;37537:15;;:4;;37542:1;37537:7;;;;;;;;;;;;;;;:15;;;37529:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37597:13;37613:9;37597:25;;37639:4;37633:19;;;37660:8;37633:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37695:4;37689:20;;;37710:51;37735:7;37744:4;;37749:1;37744:7;;;;;;37710:51;37763:8;37689:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37689:83:0;37682:91:::1;;;;37784:18;37819:4:::0;;37824:15;;;37819:21;;::::1;;;;;;;;;;;;;37805:46;;;37852:2;37805:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37805:50:0;37866:44:::1;::::0;;37805:50:::1;37866:44:::0;;::::1;::::0;;;;;;;;;;;37805:50;;-1:-1:-1;37866:44:0::1;::::0;;;37901:4;;;;;;37866:44;::::1;::::0;37901:4;;37866:44;37901:4;37866:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37907:2:0;;-1:-1:-1;37866:34:0::1;::::0;-1:-1:-1;;37866:44:0:i:1;:::-;38016:12:::0;37943:69:::1;37998:13:::0;37957:4;;37962:15;;;37957:21;;::::1;;;;;;;;;;;;;37943:46;;;37990:2;37943:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;25402:867:::0;25656:12;25670;25637:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25695:12:::1;25710:49;25735:7;25744:6;25752;25710:24;:49::i;:::-;25695:64;;25785:4;25770:33;;;25804:12;:10;:12::i;:::-;25818:4;25824:9;25770:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;25902:29:0::1;::::0;;;;;:25:::1;:29:::0;;::::1;;::::0;::::1;::::0;;;25872:12:::1;::::0;;;25902:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;25872:12;25902:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25902:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;25902:29:0;-1:-1:-1;25943:14:0::1;25962:43;25990:6:::0;25998;25962:27:::1;:43::i;:::-;25942:63;;;26047:6;26037:16;;:6;:16;;;:58;;26078:7;26087;26037:58;;;26057:7;26066;26037:58;26016:79:::0;;-1:-1:-1;26016:79:0;-1:-1:-1;26114:21:0;;::::1;;26106:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26208:10;26197:7;:21;;26189:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21826:1;;;;25402:867:::0;;;;;;;;;;;:::o;21614:41::-;;;:::o;39744:253::-;39888:21;39934:55;39965:7;39974:8;39984:4;39934:30;:55::i;27639:671::-;27928:16;27946:14;27973:12;27988:46;28013:7;28022:5;28029:4;27988:24;:46::i;:::-;27973:61;;28045:10;28058;:33;;28082:9;28058:33;;;28076:2;28058:33;28045:46;;28117:4;28102:27;;;28130:12;:10;:12::i;:::-;28102:82;;;;;;;;;;;;;;;;;;;28152:4;28102:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28102:82:0;;;;;;;-1:-1:-1;28102:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28222:80;28241:5;28248:9;28259:14;28275:12;28289:2;28293:8;28222:18;:80::i;:::-;28195:107;;;;-1:-1:-1;27639:671:0;-1:-1:-1;;;;;;;;;;;;;27639:671:0:o;23577:770::-;23865:12;23879;23893:14;23846:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23920:14:::1;23937:12;:10;:12::i;:::-;23920:29;;23981:85;23995:6;24003;24011:14;24027;24043:10;24055;23981:13;:85::i;:::-;23960:106:::0;;-1:-1:-1;23960:106:0;-1:-1:-1;24077:12:0::1;24092:49;24117:7;24126:6:::0;24134;24092:24:::1;:49::i;:::-;24077:64;;24152:62;24184:6;24192;24200:4;24206:7;24152:31;:62::i;:::-;24225;24257:6;24265;24273:4;24279:7;24225:31;:62::i;:::-;24325:4;24310:25;;;24336:2;24310:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24310:29:0;23577:770;;;;-1:-1:-1;24310:29:0;;-1:-1:-1;23577:770:0;;-1:-1:-1;;;;;;;;;;23577:770:0:o;24353:1006::-;24606:16;24624:14;24640;24587:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24694:176:::1;24722:5;24742:4;24761:18;24794:9;24818:14;24847:12;24694:13;:176::i;:::-;24667:203:::0;;-1:-1:-1;24667:203:0;-1:-1:-1;24881:14:0::1;24898:12;:10;:12::i;:::-;24881:29;;24921:12;24936:46;24961:7;24970:5;24977:4;24936:24;:46::i;:::-;24921:61;;24993:65;25025:5;25032:6;25040:4;25046:11;24993:31;:65::i;:::-;25075:4;25069:19;;;25096:9;25069:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25132:4;25126:20;;;25147:4;25153:9;25126:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25126:37:0;25119:45:::1;;;;25202:4;25187:25;;;25213:2;25187:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25187:29:0;;-1:-1:-1;25267:9:0::1;:21:::0;-1:-1:-1;25263:88:0::1;;;25290:61;25321:6;25341:9;25329;:21;25290:30;:61::i;:::-;21826:1;;24353:1006:::0;;;;;;;;;;;:::o;34321:812::-;34534:21;34506:8;21771:15;21759:8;:27;;21751:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34592:4:::1;34581:15;;:4;;34586:1;34581:7;;;;;;;;;;;;;;;:15;;;34573:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34651:55;34681:7;34690:9;34701:4;;34651:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34651:29:0::1;::::0;-1:-1:-1;;;34651:55:0:i:1;:::-;34641:65;;34739:9;34725:7;34733:1;34725:10;;;;;;;;;;;;;;:23;;34717:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34809:4;34803:19;;;34830:7;34838:1;34830:10;;;;;;;;;;;;;;34803:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34867:4;34861:20;;;34882:51;34907:7;34916:4;;34921:1;34916:7;;;;;;34882:51;34935:7;34943:1;34935:10;;;;;;;;;;;;;;34861:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34861:85:0;34854:93:::1;;;;34958:24;34964:7;34973:4;;34958:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34979:2:0;;-1:-1:-1;34958:5:0::1;::::0;-1:-1:-1;;34958:24:0:i:1;:::-;35045:7;35053:1;35045:10;;;;;;;;;;;;;;35033:9;:22;35029:96;;;35057:68;35088:12;:10;:12::i;:::-;35114:7;35122:1;35114:10;;;;;;;;;;;;;;35102:9;:22;35057:30;:68::i;9124:361::-:0;9319:45;;;9308:10;9319:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9308:57;;;;9273:12;;9287:17;;9308:10;;;;9319:45;9308:57;;;9319:45;9308:57;;9319:45;9308:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:93;;;;9384:7;:57;;;;-1:-1:-1;9396:11:0;;:16;;:44;;;9427:4;9416:24;;;;;;;;;;;;;;;-1:-1:-1;9416:24:0;9396:44;9376:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9124:361;;;;;:::o;9903:195::-;10011:12;;;9973;10011;;;;;;;;;9990:7;;;;10004:5;;9990:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9972:52;;;10043:7;10035:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9903:195;;;:::o;12211:517::-;12304:14;12350:1;12339:8;:12;12331:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12430:1;12418:9;:13;:31;;;;;12448:1;12435:10;:14;12418:31;12410:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12505:20;12528:17;:8;12541:3;12528:12;:17::i;:::-;12505:40;-1:-1:-1;12556:14:0;12573:31;12505:40;12593:10;12573:19;:31::i;:::-;12556:48;-1:-1:-1;12615:16:0;12634:40;12658:15;12634:19;:9;12648:4;12634:13;:19::i;:::-;:23;;:40::i;:::-;12615:59;;12709:11;12697:9;:23;;;;;;;12211:517;-1:-1:-1;;;;;;;12211:517:0:o;20446:486::-;20624:4;20649:20;;;20641:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20765:159;20793:47;20812:27;20832:6;20812:19;:27::i;:::-;20793:18;:47::i;:::-;20859:4;20882;20905;20765:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20742:182;;:6;:182;;;20722:202;;20446:486;;;;;;;:::o;378:128::-;462:5;;;457:16;;;;449:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13403:511;13504:21;13561:1;13546:4;:11;:16;;13538:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13629:4;:11;13618:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13618:23:0;;13608:33;;13665:8;13652:7;13660:1;13652:10;;;;;;;;;;;;;:21;;;;;13689:6;13684:223;13715:1;13701:4;:11;:15;13697:1;:19;13684:223;;;13739:14;13755:15;13774:42;13786:7;13795:4;13800:1;13795:7;;;;;;;;;;;;;;13804:4;13809:1;13813;13809:5;13804:11;;;;;;;;;;;;;;13774;:42::i;:::-;13738:78;;;;13848:47;13861:7;13869:1;13861:10;;;;;;;;;;;;;;13873:9;13884:10;13848:12;:47::i;:::-;13831:7;13839:1;13843;13839:5;13831:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13718:3:0;;13684:223;;;;13403:511;;;;;:::o;10728:478::-;10817:12;10843:14;10859;10877:26;10888:6;10896;10877:10;:26::i;:::-;11041:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11031:43;;;;;;10944:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10934:262;;;;;;;;;10728:478;-1:-1:-1;;;;;10728:478:0:o;9493:402::-;9718:51;;;9707:10;9718:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9707:63;;;;9672:12;;9686:17;;9707:10;;;;9718:51;9707:63;;;9718:51;9707:63;;9718:51;9707:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9671:99;;;;9789:7;:57;;;;-1:-1:-1;9801:11:0;;:16;;:44;;;9832:4;9821:24;;;;;;;;;;;;;;;-1:-1:-1;9821:24:0;9801:44;9781:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9493:402;;;;;;:::o;29933:735::-;30040:6;30035:626;30066:1;30052:4;:11;:15;30048:1;:19;30035:626;;;30090:13;30105:14;30124:4;30129:1;30124:7;;;;;;;;;;;;;;30133:4;30138:1;30142;30138:5;30133:11;;;;;;;;;;;;;;30089:56;;;;30161:14;30180:42;30208:5;30215:6;30180:27;:42::i;:::-;30160:62;;;30237:14;30254:7;30262:1;30266;30262:5;30254:14;;;;;;;;;;;;;;30237:31;;30284:15;30301;30329:6;30320:15;;:5;:15;;;:61;;30362:9;30378:1;30320:61;;;30344:1;30348:9;30320:61;30283:98;;;;30396:10;30427:1;30413:4;:11;:15;30409:1;:19;:82;;30488:3;30409:82;;;30431:54;30456:7;30465:6;30473:4;30478:1;30482;30478:5;30473:11;;;;;;;;;;;;;;30431:24;:54::i;:::-;30396:95;;30521:48;30546:7;30555:5;30562:6;30521:24;:48::i;:::-;30506:69;;;30594:10;30606;30618:2;30632:1;30622:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30622:12:0;;30506:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30069:3:0;;;;;-1:-1:-1;30035:626:0;;-1:-1:-1;;;;;;;;30035:626:0;;;29933:735;;;:::o;13995:532::-;14096:21;14153:1;14138:4;:11;:16;;14130:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14221:4;:11;14210:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14210:23:0;;14200:33;;14274:9;14244:7;14269:1;14252:7;:14;:18;14244:27;;;;;;;;;;;;;;;;;:39;14308:11;;:15;;14294:226;14325:5;;14294:226;;14353:14;14369:15;14388:42;14400:7;14409:4;14418:1;14414;:5;14409:11;;;;;;;;;;;;;;14422:4;14427:1;14422:7;;;;;;;14388:42;14352:78;;;;14462:46;14474:7;14482:1;14474:10;;;;;;;;;;;;;;14486:9;14497:10;14462:11;:46::i;:::-;14445:7;14457:1;14453;:5;14445:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14332:3:0;;14294:226;;35280:1221;35393:6;35388:1106;35419:1;35405:4;:11;:15;35401:1;:19;35388:1106;;;35443:13;35458:14;35477:4;35482:1;35477:7;;;;;;;;;;;;;;35486:4;35491:1;35495;35491:5;35486:11;;;;;;;;;;;;;;35442:56;;;;35514:14;35533:42;35561:5;35568:6;35533:27;:42::i;:::-;35513:62;;;35590:19;35627:48;35652:7;35661:5;35668:6;35627:24;:48::i;:::-;35590:86;;35691:16;35722:17;35810:13;35825;35843:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35843:18:0;;;;;;;35809:52;;;;;-1:-1:-1;35809:52:0;;-1:-1:-1;35877:17:0;;35918:15;;;;;;;;:61;;35960:8;35970;35918:61;;;35937:8;35947;35918:61;35876:103;;;;36008:63;36058:12;36022:5;36008:30;;;36047:4;36008:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:63;35994:77;;36101:71;36131:11;36144:12;36158:13;36101:29;:71::i;:::-;36086:86;;35388:1106;;;;36203:15;36220;36248:6;36239:15;;:5;:15;;;:67;;36284:12;36303:1;36239:67;;;36263:1;36267:12;36239:67;36202:104;;;;36321:10;36352:1;36338:4;:11;:15;36334:1;:19;:82;;36413:3;36334:82;;;36356:54;36381:7;36390:6;36398:4;36403:1;36407;36403:5;36398:11;;;;;;;36356:54;36469:12;;;36479:1;36469:12;;;;;;;;;;36431:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;36321:95;;-1:-1:-1;36431:9:0;;;;;;36441:10;;36453;;36321:95;;36469:12;;36431:51;;;;;;;;36469:12;;36431:51;;;;36469:12;;36431:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35422:3:0;;;;;-1:-1:-1;35388:1106:0;;-1:-1:-1;;;;;;;;;;35388:1106:0;514:129;598:5;;;593:16;;;;585:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12849:472;12942:13;12988:1;12976:9;:13;12968:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13069:1;13057:9;:13;:31;;;;;13087:1;13074:10;:14;13057:31;13049:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13144:14;13161:34;13190:4;13161:24;:9;13175;13161:13;:24::i;:::-;:28;;:34::i;:::-;13144:51;-1:-1:-1;13206:16:0;13225:34;13255:3;13225:25;:10;13240:9;13225:14;:25::i;:34::-;13206:53;;13281:32;13311:1;13294:11;13282:9;:23;;;;;;;13281:29;:32::i;:::-;13270:43;12849:472;-1:-1:-1;;;;;;12849:472:0:o;11768:321::-;11850:12;11893:1;11883:7;:11;11875:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11966:1;11955:8;:12;:28;;;;;11982:1;11971:8;:12;11955:28;11947:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12073:8;12049:21;:7;12061:8;12049:11;:21::i;:::-;:32;;;;;;;11768:321;-1:-1:-1;;;;11768:321:0:o;10287:349::-;10362:14;10378;10423:6;10413:16;;:6;:16;;;;10405:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10510:6;10501:15;;:6;:15;;;:53;;10539:6;10547;10501:53;;;10520:6;10528;10501:53;10482:72;;-1:-1:-1;10482:72:0;-1:-1:-1;10573:20:0;;;10565:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10287:349;;;;;:::o;22181:1390::-;22399:12;22413;22556:1;22494:64;;22512:7;22494:34;;;22529:6;22537;22494:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22494:50:0;:64;;;22490:150;;;22593:7;22575:37;;;22613:6;22621;22575:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22490:150:0;22651:13;22666;22683:53;22712:7;22721:6;22729;22683:28;:53::i;:::-;22650:86;;;;22751:8;22763:1;22751:13;:30;;;;-1:-1:-1;22768:13:0;;22751:30;22747:817;;;22820:14;;-1:-1:-1;22836:14:0;;-1:-1:-1;22747:817:0;;;22884:19;22906:58;22929:14;22945:8;22955;22906:22;:58::i;:::-;22884:80;;23001:14;22983;:32;22979:574;;23062:10;23044:14;:28;;23036:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23156:14;;-1:-1:-1;23172:14:0;-1:-1:-1;23172:14:0;22979:574;;;23228:19;23250:58;23273:14;23289:8;23299;23250:22;:58::i;:::-;23228:80;;23352:14;23334;:32;;23327:40;;;;23412:10;23394:14;:28;;23386:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23506:14;-1:-1:-1;23522:14:0;;-1:-1:-1;22979:574:0;22747:817;;22181:1390;;;;;;;;;;;:::o;651:142::-;703:6;730;;;:30;;-1:-1:-1;;745:5:0;;;759:1;754;745:5;754:1;740:15;;;;;:20;730:30;722:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19913:410;20023:7;18099:100;;;;;;;;;;;;;;;;;18079:127;;;;;;20177:6;:12;;;20212:6;:11;;;20256:6;:24;;;20246:35;;;;;;20096:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20068:247;;;;;;20048:267;;19913:410;;;:::o;17672:258::-;17771:7;17873:20;:18;:20::i;:::-;17895:11;17844:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17816:106;;;;;;17796:126;;17672:258;;;:::o;11264:391::-;11357:13;11372;11399:14;11418:26;11429:6;11437;11418:10;:26::i;:::-;11398:46;;;11456:13;11471;11504:32;11512:7;11521:6;11529;11504:7;:32::i;:::-;11489:60;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11489:62:0;;;;;;;11455:96;;;;;-1:-1:-1;11455:96:0;;-1:-1:-1;11585:16:0;;;;;;;;:62;;11628:8;11638;11585:62;;;11605:8;11615;11585:62;11562:85;;;;-1:-1:-1;11264:391:0;-1:-1:-1;;;;;;;11264:391:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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