Contract 0x1c2ddb78f1fbde389d15acd275ce6b51eafbba14

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9e3c8cb6a09b9b5e1ec5be2aae5199af5faf2e6263cbb475d3885fa922cb165bSwap Exact Token...155744822022-10-12 2:06:42237 days 13 hrs ago0xe927163c7bdc40e9594c0a44a4fc42d2b3660700 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0000662575
0xef3d14ec69101a04b0d95bb096526afd90cdb3ea39b58edfb414c329368b4a72Add Liquidity155725152022-10-11 23:22:47237 days 16 hrs ago0x52f778a1e1c12c5520be9a31511a8a256f0b1065 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0001001635
0xdb7e43d328ffa0cd2779246abaa19c2bfbdd0ea95ead88c8ab7d4c011aed75c8Add Liquidity150812662022-09-13 13:04:08266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.000097463
0xf552818bf317f62b9a800f6267ebf86e1d99f461bea7cbf9f9a45ef190ecd460Add Liquidity150812612022-09-13 13:03:43266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.000096226
0x5a0186ec9114459c1befd7664eb9af4802790dd15859970bb7be33299b270b7dAdd Liquidity150812572022-09-13 13:03:23266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.000125272
0x56ca856a345622d5623be827decf9092bbfbc6b7628dcc9da9c3768cf5365beeAdd Liquidity150812512022-09-13 13:02:53266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0000968165
0xa2085eef3cf45b13add20280577e271755ada1f2b91c213664118330e877755fAdd Liquidity150811982022-09-13 12:58:28266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0010864815
0xafeb1c6cbf4a84270c10db5ae0873ca2f5a36e2b8edd602c4f432d82ba49cc09Add Liquidity150811752022-09-13 12:56:33266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001124693
0xb54eaa61a36d55ab49a686cc22c6c333986042410e05e2c78336ec3f44e9ed81Add Liquidity150811552022-09-13 12:54:53266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001238532751
0x4527d0ed6a4823c4f8809cd737c31a19d20d7fc6c0f1c020163dc3c85c51caeaAdd Liquidity150811332022-09-13 12:53:03266 days 2 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001224345044
0x0350c21a03dc804b7c45b7fd1a2c5733b253df6e679ac905ba197eb7555479eeAdd Liquidity145704092022-08-14 23:31:40295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001075496
0x026df3388378d157571a9c6e6c6f3bd765f1bc6ba273b7a88cb47abbad033e8dAdd Liquidity145702272022-08-14 23:16:30295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001078042
0xe864bb91eb2b4d3f2a90f7af0364cf2cfde16f0b74756ac521d887d1ea3d1b35Add Liquidity145702112022-08-14 23:15:10295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0010806745
0x58c072700c50ecdf48b07da1b349cc90808f2c707be76669c8275722afa7c205Add Liquidity145701422022-08-14 23:09:25295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001114004
0xb8ea979a4f6c96fca6345aacbbe84debf21e98bcc45f0d44e0d4646705b49852Add Liquidity145700952022-08-14 23:05:30295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001084149
0x6ee197a6508134107a1e736d91ce0b05973da4fece29623f9c6dc3e4ca8af82bAdd Liquidity145699902022-08-14 22:56:45295 days 16 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001084759
0xe19d20a999d301b7cff9af2d9513b834f1b9401f9dea7e386b5bb2a61ca03e28Add Liquidity145639682022-08-14 14:34:55296 days 1 hr ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0011103435
0x815b2625fc5670d62886712f28a926480fcbf3523ffd9965edd14d6fcf21f5d1Swap Exact Token...142547662022-07-27 17:07:26313 days 22 hrs ago0x52f778a1e1c12c5520be9a31511a8a256f0b1065 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0000842825
0x95525e1906ca89a69c7ed533ed20a17677be3ad36ec16c456e302bc81f246261Swap Exact Token...142547392022-07-27 17:05:11313 days 22 hrs ago0x52f778a1e1c12c5520be9a31511a8a256f0b1065 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.000084833
0x88514808bb199d7683fb513625c9c440ad97f72e1d986f37280b0da35734968bSwap Exact Token...142547242022-07-27 17:03:56313 days 22 hrs ago0x52f778a1e1c12c5520be9a31511a8a256f0b1065 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.000084845
0x9e6f2f5e679f0b9d25a8e00675359e9b3086dafbe4c001fa39785933feaf7928Swap Exact Token...142546962022-07-27 17:01:36313 days 22 hrs ago0x52f778a1e1c12c5520be9a31511a8a256f0b1065 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.00008421
0x21ea62b2340a326544d2452f23edf451adeb51b38be2d58ecb761272ccbdf5d6Swap Exact Token...142545742022-07-27 16:51:26313 days 22 hrs ago0x8d2704e7fcac342c413962117a4698122d28a7dc IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0000652045
0x21e4870fc674df78021cac66f6003d02a8aafa478b42327779525edb7991a5b2Swap Exact Token...142545542022-07-27 16:49:46313 days 22 hrs ago0x8d2704e7fcac342c413962117a4698122d28a7dc IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0001142305
0x0b9901d07478da2ebc3cd8971bfbeaf874a44dd3197442c504be9818f25ca8bcAdd Liquidity141164432022-07-19 17:00:13321 days 22 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.001106336
0x214484696a7cc3c2739bbfcbb4cba7130d777a36eebf4813be3106e43836f87eAdd Liquidity141162332022-07-19 16:42:43321 days 22 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x1c2ddb78f1fbde389d15acd275ce6b51eafbba140 CELO0.0011150615
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PadiRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2022-07-19
*/

pragma solidity =0.6.6;


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

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

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

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

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

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

interface IPadiRouter01 {
    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 IPadiRouter02 is IPadiRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

interface IPadiPair {
    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;
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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

library PadiLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'PadiLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'PadiLibrary: 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'956dcbe9b4fb6f7108d6d2b979983b70fa53be0604be386445f5150f79890964' // 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);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IPadiPair(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, 'PadiLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'PadiLibrary: 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, 'PadiLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'PadiLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'PadiLibrary: 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, 'PadiLibrary: 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 IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

contract PadiRouter is IPadiRouter02 {
    using SafeMath for uint;

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

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

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

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

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

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = PadiLibrary.pairFor(factory, tokenA, tokenB);
        IPadiPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IPadiPair(pair).burn(to);
        (address token0,) = PadiLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'PadiRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'PadiRouter: 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 = PadiLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IPadiPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = PadiLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IPadiPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

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

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = PadiLibrary.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 ? PadiLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IPadiPair(PadiLibrary.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 = PadiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PadiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PadiLibrary.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 = PadiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PadiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PadiLibrary.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, 'PadiRouter: INVALID_PATH');
        amounts = PadiLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PadiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PadiLibrary.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, 'PadiRouter: INVALID_PATH');
        amounts = PadiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PadiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PadiLibrary.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, 'PadiRouter: INVALID_PATH');
        amounts = PadiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PadiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PadiLibrary.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, 'PadiRouter: INVALID_PATH');
        amounts = PadiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'PadiRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PadiLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

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

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

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

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

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

Contract ABI

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

60c060405234801561001057600080fd5b50604051620047e1380380620047e18339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61465c620001856000398061019f5280610d245280610d5f5280610e565280611081528061140b528061157e52806119455280611a4c5280611b025280611bd05280611d235280611dab5280611ff0528061206b528061211a52806121e6528061228852806122fc52806127fa5280612a6d5280612ac35280612af75280612b6b5280612d0b5280612e5b5280612ee3525080610ef15280610fc85280611147528061118052806112bb52806114a6528061155c52806116cc5280611c705280611ddd5280611f40528061232e5280612587528061277f52806127a852806127d852806129455280612aa15280612dab5280612f1552806137d452806138175280613afa5280613c8052806140e452806141925280614212525061465c6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610b8d578063f305d71914610c0d578063fb3bdb4114610c53576101c8565b8063c45a015514610a50578063d06ca61f14610a65578063ded9382a14610b1a576101c8565b8063af2979eb116100b0578063af2979eb1461091c578063b6f9de951461096f578063baa2abde146109f3576101c8565b80638803dbee1461081f578063ad5c4648146108b5578063ad615dec146108e6576101c8565b80634a25d94a11610138578063791ac94711610112578063791ac947146106cf5780637ff36ab51461076557806385f8c259146107e9576101c8565b80634a25d94a146105305780635b0d5984146105c65780635c11d79514610639576101c8565b80631f00ca74116101695780631f00ca74146103675780632195995c1461041c57806338ed17391461049a576101c8565b806302751cec146101cd578063054d50d41461023957806318cbafe514610281576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c657fe5b005b600080fd5b3480156101d957600080fd5b50610220600480360360c08110156101f057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610cd7565b6040805192835260208301919091528051918290030190f35b34801561024557600080fd5b5061026f6004803603606081101561025c57600080fd5b5080359060208101359060400135610df1565b60408051918252519081900360200190f35b34801561028d57600080fd5b50610317600480360360a08110156102a457600080fd5b813591602081013591810190606081016040820135600160201b8111156102ca57600080fd5b8201836020820111156102dc57600080fd5b803590602001918460208302840111600160201b831117156102fd57600080fd5b91935091506001600160a01b038135169060200135610e06565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561035357818101518382015260200161033b565b505050509050019250505060405180910390f35b34801561037357600080fd5b506103176004803603604081101561038a57600080fd5b81359190810190604081016020820135600160201b8111156103ab57600080fd5b8201836020820111156103bd57600080fd5b803590602001918460208302840111600160201b831117156103de57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611140945050505050565b34801561042857600080fd5b50610220600480360361016081101561044057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611176565b3480156104a657600080fd5b50610317600480360360a08110156104bd57600080fd5b813591602081013591810190606081016040820135600160201b8111156104e357600080fd5b8201836020820111156104f557600080fd5b803590602001918460208302840111600160201b8311171561051657600080fd5b91935091506001600160a01b038135169060200135611270565b34801561053c57600080fd5b50610317600480360360a081101561055357600080fd5b813591602081013591810190606081016040820135600160201b81111561057957600080fd5b82018360208201111561058b57600080fd5b803590602001918460208302840111600160201b831117156105ac57600080fd5b91935091506001600160a01b0381351690602001356113bb565b3480156105d257600080fd5b5061026f60048036036101408110156105ea57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611554565b34801561064557600080fd5b506101c6600480360360a081101561065c57600080fd5b813591602081013591810190606081016040820135600160201b81111561068257600080fd5b82018360208201111561069457600080fd5b803590602001918460208302840111600160201b831117156106b557600080fd5b91935091506001600160a01b038135169060200135611662565b3480156106db57600080fd5b506101c6600480360360a08110156106f257600080fd5b813591602081013591810190606081016040820135600160201b81111561071857600080fd5b82018360208201111561072a57600080fd5b803590602001918460208302840111600160201b8311171561074b57600080fd5b91935091506001600160a01b0381351690602001356118f7565b6103176004803603608081101561077b57600080fd5b81359190810190604081016020820135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460208302840111600160201b831117156107cf57600080fd5b91935091506001600160a01b038135169060200135611b88565b3480156107f557600080fd5b5061026f6004803603606081101561080c57600080fd5b5080359060208101359060400135611ee8565b34801561082b57600080fd5b50610317600480360360a081101561084257600080fd5b813591602081013591810190606081016040820135600160201b81111561086857600080fd5b82018360208201111561087a57600080fd5b803590602001918460208302840111600160201b8311171561089b57600080fd5b91935091506001600160a01b038135169060200135611ef5565b3480156108c157600080fd5b506108ca611fee565b604080516001600160a01b039092168252519081900360200190f35b3480156108f257600080fd5b5061026f6004803603606081101561090957600080fd5b5080359060208101359060400135612012565b34801561092857600080fd5b5061026f600480360360c081101561093f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561201f565b6101c66004803603608081101561098557600080fd5b81359190810190604081016020820135600160201b8111156109a657600080fd5b8201836020820111156109b857600080fd5b803590602001918460208302840111600160201b831117156109d957600080fd5b91935091506001600160a01b0381351690602001356121a0565b3480156109ff57600080fd5b50610220600480360360e0811015610a1657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612539565b348015610a5c57600080fd5b506108ca61277d565b348015610a7157600080fd5b5061031760048036036040811015610a8857600080fd5b81359190810190604081016020820135600160201b811115610aa957600080fd5b820183602082011115610abb57600080fd5b803590602001918460208302840111600160201b83111715610adc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506127a1945050505050565b348015610b2657600080fd5b506102206004803603610140811015610b3e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356127ce565b348015610b9957600080fd5b50610bef6004803603610100811015610bb157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128e2565b60408051938452602084019290925282820152519081900360600190f35b610bef600480360360c0811015610c2357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a1e565b61031760048036036080811015610c6957600080fd5b81359190810190604081016020820135600160201b811115610c8a57600080fd5b820183602082011115610c9c57600080fd5b803590602001918460208302840111600160201b83111715610cbd57600080fd5b91935091506001600160a01b038135169060200135612cc3565b6000808242811015610d1e576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b610d4d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612539565b9093509150610d5d898685613052565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b50505050610de585836131bc565b50965096945050505050565b6000610dfe8484846132b4565b949350505050565b60608142811015610e4c576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e8657fe5b905060200201356001600160a01b03166001600160a01b031614610eec576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b610f4a7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a492505050565b91508682600184510381518110610f5d57fe5b60200260200101511015610fa25760405162461bcd60e51b81526004018080602001828103825260268152602001806145ba6026913960400191505060405180910390fd5b61104086866000818110610fb257fe5b905060200201356001600160a01b0316336110267f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ff457fe5b905060200201356001600160a01b03168b8b600181811061101157fe5b905060200201356001600160a01b03166134f0565b8560008151811061103357fe5b60200260200101516135c8565b61107f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613725915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110be57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110fc57600080fd5b505af1158015611110573d6000803e3d6000fd5b50505050611135848360018551038151811061112857fe5b60200260200101516131bc565b509695505050505050565b606061116d7f0000000000000000000000000000000000000000000000000000000000000000848461396b565b90505b92915050565b60008060006111a67f00000000000000000000000000000000000000000000000000000000000000008f8f6134f0565b90506000876111b5578c6111b9565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561122f57600080fd5b505af1158015611243573d6000803e3d6000fd5b505050506112568f8f8f8f8f8f8f612539565b809450819550505050509b509b9950505050505050505050565b606081428110156112b6576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b6113147f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a492505050565b9150868260018451038151811061132757fe5b6020026020010151101561136c5760405162461bcd60e51b81526004018080602001828103825260268152602001806145ba6026913960400191505060405180910390fd5b61137c86866000818110610fb257fe5b61113582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613725915050565b60608142811015611401576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061143b57fe5b905060200201356001600160a01b03166001600160a01b0316146114a1576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b6114ff7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061396b92505050565b9150868260008151811061150f57fe5b60200260200101511115610fa25760405162461bcd60e51b815260040180806020018281038252602281526020018061454b6022913960400191505060405180910390fd5b6000806115a27f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006134f0565b90506000866115b1578b6115b5565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506116518d8d8d8d8d8d61201f565b9d9c50505050505050505050505050565b80428110156116a6576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b61171b858560008181106116b657fe5b905060200201356001600160a01b0316336117157f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f857fe5b905060200201356001600160a01b03168a8a600181811061101157fe5b8a6135c8565b60008585600019810181811061172d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561179257600080fd5b505afa1580156117a6573d6000803e3d6000fd5b505050506040513d60208110156117bc57600080fd5b505160408051602088810282810182019093528882529293506117fe929091899189918291850190849080828437600092019190915250889250613aa3915050565b866118b0828888600019810181811061181357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d60208110156118a257600080fd5b50519063ffffffff613db516565b10156118ed5760405162461bcd60e51b81526004018080602001828103825260268152602001806145ba6026913960400191505060405180910390fd5b5050505050505050565b804281101561193b576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061197557fe5b905060200201356001600160a01b03166001600160a01b0316146119db576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b6119eb858560008181106116b657fe5b611a29858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613aa3915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d6020811015611abd57600080fd5b5051905086811015611b005760405162461bcd60e51b81526004018080602001828103825260268152602001806145ba6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b505050506118ed84826131bc565b60608142811015611bce576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c0557fe5b905060200201356001600160a01b03166001600160a01b031614611c6b576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b611cc97f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a492505050565b91508682600184510381518110611cdc57fe5b60200260200101511015611d215760405162461bcd60e51b81526004018080602001828103825260268152602001806145ba6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d5d57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e097f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f857fe5b84600081518110611e1657fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e6d57600080fd5b505af1158015611e81573d6000803e3d6000fd5b505050506040513d6020811015611e9757600080fd5b5051611e9f57fe5b611ede82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613725915050565b5095945050505050565b6000610dfe848484613e0d565b60608142811015611f3b576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b611f997f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061396b92505050565b91508682600081518110611fa957fe5b6020026020010151111561136c5760405162461bcd60e51b815260040180806020018281038252602281526020018061454b6022913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dfe848484613efd565b60008142811015612065576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b612094887f00000000000000000000000000000000000000000000000000000000000000008989893089612539565b604080516370a0823160e01b8152306004820152905191945061211892508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120e757600080fd5b505afa1580156120fb573d6000803e3d6000fd5b505050506040513d602081101561211157600080fd5b5051613052565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561217e57600080fd5b505af1158015612192573d6000803e3d6000fd5b5050505061113584836131bc565b80428110156121e4576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061221b57fe5b905060200201356001600160a01b03166001600160a01b031614612281576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e157600080fd5b505af11580156122f5573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61235a7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156123aa57600080fd5b505af11580156123be573d6000803e3d6000fd5b505050506040513d60208110156123d457600080fd5b50516123dc57fe5b6000868660001981018181106123ee57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561245357600080fd5b505afa158015612467573d6000803e3d6000fd5b505050506040513d602081101561247d57600080fd5b505160408051602089810282810182019093528982529293506124bf9290918a918a918291850190849080828437600092019190915250899250613aa3915050565b876118b082898960001981018181106124d457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187857600080fd5b6000808242811015612580576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b60006125ad7f00000000000000000000000000000000000000000000000000000000000000008c8c6134f0565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561260857600080fd5b505af115801561261c573d6000803e3d6000fd5b505050506040513d602081101561263257600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b505050506040513d60408110156126a957600080fd5b508051602090910151909250905060006126c38e8e613fbf565b509050806001600160a01b03168e6001600160a01b0316146126e65781836126e9565b82825b90975095508a87101561272d5760405162461bcd60e51b81526004018080602001828103825260218152602001806145076021913960400191505060405180910390fd5b8986101561276c5760405162461bcd60e51b81526004018080602001828103825260218152602001806144e66021913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061116d7f000000000000000000000000000000000000000000000000000000000000000084846133a4565b600080600061281e7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006134f0565b905060008761282d578c612831565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156128a757600080fd5b505af11580156128bb573d6000803e3d6000fd5b505050506128cd8e8e8e8e8e8e610cd7565b909f909e509c50505050505050505050505050565b6000806000834281101561292b576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b6129398c8c8c8c8c8c6140b3565b9094509250600061296b7f00000000000000000000000000000000000000000000000000000000000000008e8e6134f0565b90506129798d3383886135c8565b6129858c3383876135c8565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156129dd57600080fd5b505af11580156129f1573d6000803e3d6000fd5b505050506040513d6020811015612a0757600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a67576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b612a958a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6140b3565b90945092506000612ae77f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006134f0565b9050612af58b3383886135c8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b5057600080fd5b505af1158015612b64573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612be957600080fd5b505af1158015612bfd573d6000803e3d6000fd5b505050506040513d6020811015612c1357600080fd5b5051612c1b57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c7357600080fd5b505af1158015612c87573d6000803e3d6000fd5b505050506040513d6020811015612c9d57600080fd5b5051925034841015612cb557612cb5338534036131bc565b505096509650969350505050565b60608142811015612d09576040805162461bcd60e51b815260206004820152601360248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d4057fe5b905060200201356001600160a01b03166001600160a01b031614612da6576040805162461bcd60e51b81526020600482015260186024820152770a0c2c8d2a4deeae8cae47440929cac82989288bea082a8960431b604482015290519081900360640190fd5b612e047f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061396b92505050565b91503482600081518110612e1457fe5b60200260200101511115612e595760405162461bcd60e51b815260040180806020018281038252602281526020018061454b6022913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e9557fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ec857600080fd5b505af1158015612edc573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f417f0000000000000000000000000000000000000000000000000000000000000000898960008181106116f857fe5b84600081518110612f4e57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612fa557600080fd5b505af1158015612fb9573d6000803e3d6000fd5b505050506040513d6020811015612fcf57600080fd5b5051612fd757fe5b61301682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613725915050565b8160008151811061302357fe5b6020026020010151341115611ede57611ede338360008151811061304357fe5b602002602001015134036131bc565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130cf5780518252601f1990920191602091820191016130b0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613131576040519150601f19603f3d011682016040523d82523d6000602084013e613136565b606091505b5091509150818015613164575080511580613164575080806020019051602081101561316157600080fd5b50515b6131b5576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106132085780518252601f1990920191602091820191016131e9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461326a576040519150601f19603f3d011682016040523d82523d6000602084013e61326f565b606091505b50509050806132af5760405162461bcd60e51b81526004018080602001828103825260238152602001806145e06023913960400191505060405180910390fd5b505050565b60008084116132f45760405162461bcd60e51b81526004018080602001828103825260268152602001806145946026913960400191505060405180910390fd5b6000831180156133045750600082115b61333f5760405162461bcd60e51b81526004018080602001828103825260238152602001806145286023913960400191505060405180910390fd5b6000613353856103e663ffffffff61432716565b90506000613367828563ffffffff61432716565b9050600061338d83613381886103e863ffffffff61432716565b9063ffffffff61439316565b905080828161339857fe5b04979650505050505050565b60606002825110156133fd576040805162461bcd60e51b815260206004820152601960248201527f506164694c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561341557600080fd5b5060405190808252806020026020018201604052801561343f578160200160208202803683370190505b509050828160008151811061345057fe5b60200260200101818152505060005b60018351038110156134e8576000806134a28786858151811061347e57fe5b602002602001015187866001018151811061349557fe5b60200260200101516143eb565b915091506134c48484815181106134b557fe5b602002602001015183836132b4565b8484600101815181106134d357fe5b6020908102919091010152505060010161345f565b509392505050565b60008060006134ff8585613fbf565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f956dcbe9b4fb6f7108d6d2b979983b70fa53be0604be386445f5150f79890964609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061364d5780518252601f19909201916020918201910161362e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136af576040519150601f19603f3d011682016040523d82523d6000602084013e6136b4565b606091505b50915091508180156136e25750805115806136e257508080602001905160208110156136df57600080fd5b50515b61371d5760405162461bcd60e51b81526004018080602001828103825260248152602001806146036024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139655760008084838151811061374357fe5b602002602001015185846001018151811061375a57fe5b60200260200101519150915060006137728383613fbf565b509050600087856001018151811061378657fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137b4578260006137b8565b6000835b91509150600060028a510388106137cf5788613810565b6138107f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061380357fe5b60200260200101516134f0565b905061383d7f000000000000000000000000000000000000000000000000000000000000000088886134f0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561387a576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138eb5781810151838201526020016138d3565b50505050905090810190601f1680156139185780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561393a57600080fd5b505af115801561394e573d6000803e3d6000fd5b505060019099019850613728975050505050505050565b50505050565b60606002825110156139c4576040805162461bcd60e51b815260206004820152601960248201527f506164694c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139dc57600080fd5b50604051908082528060200260200182016040528015613a06578160200160208202803683370190505b5090508281600183510381518110613a1a57fe5b60209081029190910101528151600019015b80156134e857600080613a5c87866001860381518110613a4857fe5b602002602001015187868151811061349557fe5b91509150613a7e848481518110613a6f57fe5b60200260200101518383613e0d565b846001850381518110613a8d57fe5b6020908102919091010152505060001901613a2c565b60005b60018351038110156132af57600080848381518110613ac157fe5b6020026020010151858460010181518110613ad857fe5b6020026020010151915091506000613af08383613fbf565b5090506000613b207f000000000000000000000000000000000000000000000000000000000000000085856134f0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b6157600080fd5b505afa158015613b75573d6000803e3d6000fd5b505050506040513d6060811015613b8b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613bc8578284613bcb565b83835b91509150613c29828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561187857600080fd5b9550613c368683836132b4565b945050505050600080856001600160a01b0316886001600160a01b031614613c6057826000613c64565b6000835b91509150600060028c51038a10613c7b578a613caf565b613caf7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061380357fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613d39578181015183820152602001613d21565b50505050905090810190601f168015613d665780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613d8857600080fd5b505af1158015613d9c573d6000803e3d6000fd5b50506001909b019a50613aa69950505050505050505050565b80820382811115611170576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613e4d5760405162461bcd60e51b815260040180806020018281038252602781526020018061456d6027913960400191505060405180910390fd5b600083118015613e5d5750600082115b613e985760405162461bcd60e51b81526004018080602001828103825260238152602001806145286023913960400191505060405180910390fd5b6000613ebc6103e8613eb0868863ffffffff61432716565b9063ffffffff61432716565b90506000613ed66103e6613eb0868963ffffffff613db516565b9050613ef36001828481613ee657fe5b049063ffffffff61439316565b9695505050505050565b6000808411613f53576040805162461bcd60e51b815260206004820181905260248201527f506164694c6962726172793a20494e53554646494349454e545f414d4f554e54604482015290519081900360640190fd5b600083118015613f635750600082115b613f9e5760405162461bcd60e51b81526004018080602001828103825260238152602001806145286023913960400191505060405180910390fd5b82613faf858463ffffffff61432716565b81613fb657fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415614029576040805162461bcd60e51b815260206004820181905260248201527f506164694c6962726172793a204944454e544943414c5f414444524553534553604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b03161061404957828461404c565b83835b90925090506001600160a01b0382166140ac576040805162461bcd60e51b815260206004820152601960248201527f506164694c6962726172793a205a45524f5f4144445245535300000000000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561412d57600080fd5b505afa158015614141573d6000803e3d6000fd5b505050506040513d602081101561415757600080fd5b50516001600160a01b0316141561420a57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156141dd57600080fd5b505af11580156141f1573d6000803e3d6000fd5b505050506040513d602081101561420757600080fd5b50505b6000806142387f00000000000000000000000000000000000000000000000000000000000000008b8b6143eb565b9150915081600014801561424a575080155b1561425a5787935086925061431a565b6000614267898484613efd565b90508781116142ba57858110156142af5760405162461bcd60e51b81526004018080602001828103825260218152602001806144e66021913960400191505060405180910390fd5b889450925082614318565b60006142c7898486613efd565b9050898111156142d357fe5b878110156143125760405162461bcd60e51b81526004018080602001828103825260218152602001806145076021913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806143425750508082028282828161433f57fe5b04145b611170576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820182811015611170576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006143fa8585613fbf565b5090506144088686866134f0565b506000806144178888886134f0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561444f57600080fd5b505afa158015614463573d6000803e3d6000fd5b505050506040513d606081101561447957600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b03878116908416146144b35780826144b6565b81815b9099909850965050505050505056fe50616469526f757465723a20455850495245440000000000000000000000000050616469526f757465723a20494e53554646494349454e545f425f414d4f554e5450616469526f757465723a20494e53554646494349454e545f415f414d4f554e54506164694c6962726172793a20494e53554646494349454e545f4c495155494449545950616469526f757465723a204558434553534956455f494e5055545f414d4f554e54506164694c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54506164694c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5450616469526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212203ab088fefe68b4299ad2520d4d00c6129571bdb7ef871c716b97480419b8979964736f6c6343000606003300000000000000000000000078491c44fc63067b19e1ba4eef379f358123b552000000000000000000000000471ece3750da237f93b8e339c536989b8978a438

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

00000000000000000000000078491c44fc63067b19e1ba4eef379f358123b552000000000000000000000000471ece3750da237f93b8e339c536989b8978a438

-----Decoded View---------------
Arg [0] : _factory (address): 0x78491c44fc63067b19e1ba4eef379f358123b552
Arg [1] : _WETH (address): 0x471ece3750da237f93b8e339c536989b8978a438

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000078491c44fc63067b19e1ba4eef379f358123b552
Arg [1] : 000000000000000000000000471ece3750da237f93b8e339c536989b8978a438


Deployed ByteCode Sourcemap

15394:18192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15859:10;-1:-1:-1;;;;;15873:4:0;15859:18;;15852:26;;;;15394:18192;;12:1:-1;9;2:12;19924:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19924:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19924:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32550:257;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32550:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32550:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26973:830;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26973:830:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26973:830:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26973:830:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26973:830:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26973:830:0;;-1:-1:-1;26973:830:0;-1:-1:-1;;;;;;26973:830:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26973:830:0;;;;;;;;;;;;;;;;;33335:248;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33335:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33335:248:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33335:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33335:248:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33335:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33335:248:0;;-1:-1:-1;33335:248:0;;-1:-1:-1;;;;;33335:248:0:i;20603:667::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20603:667:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20603:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24260:613::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24260:613:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;24260:613:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;24260:613:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;24260:613:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24260:613:0;;-1:-1:-1;24260:613:0;-1:-1:-1;;;;;;24260:613:0;;;;;;;;:::i;26159:808::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26159:808:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26159:808:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26159:808:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26159:808:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26159:808:0;;-1:-1:-1;26159:808:0;-1:-1:-1;;;;;;26159:808:0;;;;;;;;:::i;22720:708::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22720:708:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22720:708:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29936:704::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29936:704:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29936:704:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;29936:704:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29936:704:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29936:704:0;;-1:-1:-1;29936:704:0;-1:-1:-1;;;;;;29936:704:0;;;;;;;;:::i;31487:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31487:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31487:828:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31487:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31487:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31487:828:0;;-1:-1:-1;31487:828:0;-1:-1:-1;;;;;;31487:828:0;;;;;;;;:::i;25476:677::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25476:677:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25476:677:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25476:677:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25476:677:0;;-1:-1:-1;25476:677:0;-1:-1:-1;;;;;;25476:677:0;;;;;;;;:::i;32815:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32815:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32815:256:0;;;;;;;;;;;;:::i;24879:591::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24879:591:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;24879:591:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;24879:591:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;24879:591:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24879:591:0;;-1:-1:-1;24879:591:0;-1:-1:-1;;;;;;24879:591:0;;;;;;;;:::i;15518:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15518:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;15518:38:0;;;;;;;;;;;;;;32359:183;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32359:183:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32359:183:0;;;;;;;;;;;;:::i;22014:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22014:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22014:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30646:835::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30646:835:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30646:835:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30646:835:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30646:835:0;;-1:-1:-1;30646:835:0;-1:-1:-1;;;;;;30646:835:0;;;;;;;;:::i;19083:::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19083:835:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19083:835:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15470:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15470:41:0;;;:::i;33079:248::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33079:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33079:248:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33079:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33079:248:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33079:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33079:248:0;;-1:-1:-1;33079:248:0;;-1:-1:-1;;;;;33079:248:0:i;21276:659::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21276:659:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21276:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17342:728::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17342:728:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;17342:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18076:964;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18076:964:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27809:790::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27809:790:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27809:790:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27809:790:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27809:790:0;;-1:-1:-1;27809:790:0;-1:-1:-1;;;;;;27809:790:0;;;;;;;;:::i;19924:673::-;20161:16;20179:14;20142:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;20233:196:::1;20263:5;20283:4;20302:9;20326:14;20355:12;20390:4;20410:8;20233:15;:196::i;:::-;20206:223:::0;;-1:-1:-1;20206:223:0;-1:-1:-1;20440:51:0::1;20468:5:::0;20475:2;20206:223;20440:27:::1;:51::i;:::-;20508:4;-1:-1:-1::0;;;;;20502:20:0::1;;20523:9;20502:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20502:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20502:31:0;;;;20544:45;20575:2;20579:9;20544:30;:45::i;:::-;19924:673:::0;;;;;;;;;;:::o;32550:257::-;32703:14;32742:57;32767:8;32777:9;32788:10;32742:24;:57::i;:::-;32735:64;32550:257;-1:-1:-1;;;;32550:257:0:o;26973:830::-;27187:21;27159:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27259:4:0::1;27234:29;:4:::0;;-1:-1:-1;;27239:15:0;;27234:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27234:21:0::1;-1:-1:-1::0;;;;;27234:29:0::1;;27226:66;;;::::0;;-1:-1:-1;;;27226:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27226:66:0;;;;;;;;;;;;;::::1;;27313:50;27339:7;27348:8;27358:4;;27313:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27313:25:0::1;::::0;-1:-1:-1;;;27313:50:0:i:1;:::-;27303:60;;27413:12;27382:7;27407:1;27390:7;:14;:18;27382:27;;;;;;;;;;;;;;:43;;27374:94;;;;-1:-1:-1::0;;;27374:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27479:136;27525:4;;27530:1;27525:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27525:7:0::1;27534:10;27546:46;27566:7;27575:4;;27580:1;27575:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27575:7:0::1;27584:4;;27589:1;27584:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27584:7:0::1;27546:19;:46::i;:::-;27594:7;27602:1;27594:10;;;;;;;;;;;;;;27479:31;:136::i;:::-;27626:35;27632:7;27641:4;;27626:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27655:4:0::1;::::0;-1:-1:-1;27626:5:0::1;::::0;-1:-1:-1;;27626:35:0:i:1;:::-;27678:4;-1:-1:-1::0;;;;;27672:20:0::1;;27693:7;27718:1;27701:7;:14;:18;27693:27;;;;;;;;;;;;;;27672:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27672:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27672:49:0;;;;27732:63;27763:2;27767:7;27792:1;27775:7;:14;:18;27767:27;;;;;;;;;;;;;;27732:30;:63::i;:::-;26973:830:::0;;;;;;;;;:::o;33335:248::-;33479:21;33525:50;33550:7;33559:9;33570:4;33525:24;:50::i;:::-;33518:57;;33335:248;;;;;:::o;20603:667::-;20909:12;20923;20948;20963:44;20983:7;20992:6;21000;20963:19;:44::i;:::-;20948:59;;21018:10;21031;:33;;21055:9;21031:33;;;-1:-1:-1;;21031:33:0;21075:75;;;-1:-1:-1;;;21075:75:0;;21098:10;21075:75;;;;21118:4;21075:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21018:46;;-1:-1:-1;;;;;;21075:22:0;;;;;:75;;;;;-1:-1:-1;;21075:75:0;;;;;;;;-1:-1:-1;21075:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;21075:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21075:75:0;;;;21182:80;21198:6;21206;21214:9;21225:10;21237;21249:2;21253:8;21182:15;:80::i;:::-;21161:101;;;;;;;;20603:667;;;;;;;;;;;;;;;;:::o;24260:613::-;24484:21;24465:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;24528:50:::1;24554:7;24563:8;24573:4;;24528:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;24528:25:0::1;::::0;-1:-1:-1;;;24528:50:0:i:1;:::-;24518:60;;24628:12;24597:7;24622:1;24605:7;:14;:18;24597:27;;;;;;;;;;;;;;:43;;24589:94;;;;-1:-1:-1::0;;;24589:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24694:136;24740:4;;24745:1;24740:7;;;;;;24694:136;24841:24;24847:7;24856:4;;24841:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;24862:2:0;;-1:-1:-1;24841:5:0::1;::::0;-1:-1:-1;;24841:24:0:i:1;26159:808::-:0;26373:21;26345:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26445:4:0::1;26420:29;:4:::0;;-1:-1:-1;;26425:15:0;;26420:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;26420:21:0::1;-1:-1:-1::0;;;;;26420:29:0::1;;26412:66;;;::::0;;-1:-1:-1;;;26412:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26412:66:0;;;;;;;;;;;;;::::1;;26499:50;26524:7;26533:9;26544:4;;26499:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26499:24:0::1;::::0;-1:-1:-1;;;26499:50:0:i:1;:::-;26489:60;;26582:11;26568:7;26576:1;26568:10;;;;;;;;;;;;;;:25;;26560:72;;;;-1:-1:-1::0;;;26560:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22720:708:::0;23038:14;23065:12;23080:41;23100:7;23109:5;23116:4;23080:19;:41::i;:::-;23065:56;;23132:10;23145;:33;;23169:9;23145:33;;;-1:-1:-1;;23145:33:0;23189:75;;;-1:-1:-1;;;23189:75:0;;23212:10;23189:75;;;;23232:4;23189:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23132:46;;-1:-1:-1;;;;;;23189:22:0;;;;;:75;;;;;-1:-1:-1;;23189:75:0;;;;;;;;-1:-1:-1;23189:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;23189:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23189:75:0;;;;23287:133;23349:5;23356:9;23367:14;23383:12;23397:2;23401:8;23287:47;:133::i;:::-;23275:145;22720:708;-1:-1:-1;;;;;;;;;;;;;22720:708:0:o;29936:704::-;30170:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;30191:134:::1;30237:4;;30242:1;30237:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30237:7:0::1;30246:10;30258:46;30278:7;30287:4;;30292:1;30287:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30287:7:0::1;30296:4;;30301:1;30296:7;;;;;;30258:46;30306:8;30191:31;:134::i;:::-;30336:18;30364:4:::0;;-1:-1:-1;;30369:15:0;;30364:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30364:21:0::1;-1:-1:-1::0;;;;;30357:39:0::1;;30397:2;30357:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30357:43:0::1;-1:-1:-1::0;;;;;30357:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30357:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30357:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30357:43:0;30411:44:::1;::::0;;30357:43:::1;30411:44:::0;;::::1;::::0;;;;;;;;;;;30357:43;;-1:-1:-1;30411:44:0::1;::::0;;;30446:4;;;;;;30411:44;::::1;::::0;30446:4;;30411:44;30446:4;30411:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30452:2:0;;-1:-1:-1;30411:34:0::1;::::0;-1:-1:-1;;30411:44:0:i:1;:::-;30554:12:::0;30488:62:::1;30536:13:::0;30495:4;;-1:-1:-1;;30500:15:0;;30495:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30495:21:0::1;-1:-1:-1::0;;;;;30488:39:0::1;;30528:2;30488:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30488:43:0::1;-1:-1:-1::0;;;;;30488:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30488:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30488:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30488:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;30466:166;;;;-1:-1:-1::0;;;30466:166:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15677:1;29936:704:::0;;;;;;;:::o;31487:828::-;31754:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31813:4:0::1;31788:29;:4:::0;;-1:-1:-1;;31793:15:0;;31788:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31788:21:0::1;-1:-1:-1::0;;;;;31788:29:0::1;;31780:66;;;::::0;;-1:-1:-1;;;31780:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31780:66:0;;;;;;;;;;;;;::::1;;31857:134;31903:4;;31908:1;31903:7;;;;;;31857:134;32002:55;32037:4;;32002:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32051:4:0::1;::::0;-1:-1:-1;32002:34:0::1;::::0;-1:-1:-1;;32002:55:0:i:1;:::-;32085:37;::::0;;-1:-1:-1;;;32085:37:0;;32116:4:::1;32085:37;::::0;::::1;::::0;;;32068:14:::1;::::0;-1:-1:-1;;;;;32092:4:0::1;32085:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32085:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32085:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32085:37:0;;-1:-1:-1;32141:25:0;;::::1;;32133:76;;;;-1:-1:-1::0;;;32133:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32226:4;-1:-1:-1::0;;;;;32220:20:0::1;;32241:9;32220:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32220:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32220:31:0;;;;32262:45;32293:2;32297:9;32262:30;:45::i;25476:677::-:0;25692:21;25664:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;25750:4:::1;-1:-1:-1::0;;;;;25739:15:0::1;:4;;25744:1;25739:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;25739:7:0::1;-1:-1:-1::0;;;;;25739:15:0::1;;25731:52;;;::::0;;-1:-1:-1;;;25731:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25731:52:0;;;;;;;;;;;;;::::1;;25804:51;25830:7;25839:9;25850:4;;25804:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25804:25:0::1;::::0;-1:-1:-1;;;25804:51:0:i:1;:::-;25794:61;;25905:12;25874:7;25899:1;25882:7;:14;:18;25874:27;;;;;;;;;;;;;;:43;;25866:94;;;;-1:-1:-1::0;;;25866:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25977:4;-1:-1:-1::0;;;;;25971:19:0::1;;25998:7;26006:1;25998:10;;;;;;;;;;;;;;25971:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;25971:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25971:40:0;;;;;26035:4;-1:-1:-1::0;;;;;26029:20:0::1;;26050:46;26070:7;26079:4;;26084:1;26079:7;;;;;;26050:46;26098:7;26106:1;26098:10;;;;;;;;;;;;;;26029:80;;;;;;;;;;;;;-1:-1:-1::0;;;;;26029:80:0::1;-1:-1:-1::0;;;;;26029:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26029:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26029:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26029:80:0;26022:88:::1;;;;26121:24;26127:7;26136:4;;26121:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26142:2:0;;-1:-1:-1;26121:5:0::1;::::0;-1:-1:-1;;26121:24:0:i:1;:::-;25476:677:::0;;;;;;;;:::o;32815:256::-;32968:13;33006:57;33030:9;33041;33052:10;33006:23;:57::i;24879:591::-;25103:21;25084:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;25147:50:::1;25172:7;25181:9;25192:4;;25147:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25147:24:0::1;::::0;-1:-1:-1;;;25147:50:0:i:1;:::-;25137:60;;25230:11;25216:7;25224:1;25216:10;;;;;;;;;;;;;;:25;;25208:72;;;;-1:-1:-1::0;;;25208:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15518:38:::0;;;:::o;32359:183::-;32456:12;32488:46;32506:7;32515:8;32525;32488:17;:46::i;22014:700::-;22280:14;22261:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;22323:196:::1;22353:5;22373:4;22392:9;22416:14;22445:12;22480:4;22500:8;22323:15;:196::i;:::-;22569:38;::::0;;-1:-1:-1;;;22569:38:0;;22601:4:::1;22569:38;::::0;::::1;::::0;;;22307:212;;-1:-1:-1;22530:78:0::1;::::0;-1:-1:-1;22558:5:0;;22565:2;;-1:-1:-1;;;;;22569:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22569:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22569:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22569:38:0;22530:27:::1;:78::i;:::-;22625:4;-1:-1:-1::0;;;;;22619:20:0::1;;22640:9;22619:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22619:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22619:31:0;;;;22661:45;22692:2;22696:9;22661:30;:45::i;30646:835::-:0;30906:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;30951:4:::1;-1:-1:-1::0;;;;;30940:15:0::1;:4;;30945:1;30940:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30940:7:0::1;-1:-1:-1::0;;;;;30940:15:0::1;;30932:52;;;::::0;;-1:-1:-1;;;30932:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30932:52:0;;;;;;;;;;;;;::::1;;30995:13;31011:9;30995:25;;31037:4;-1:-1:-1::0;;;;;31031:19:0::1;;31058:8;31031:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31031:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31031:38:0;;;;;31093:4;-1:-1:-1::0;;;;;31087:20:0::1;;31108:46;31128:7;31137:4;;31142:1;31137:7;;;;;;31108:46;31156:8;31087:78;;;;;;;;;;;;;-1:-1:-1::0;;;;;31087:78:0::1;-1:-1:-1::0;;;;;31087:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31087:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31087:78:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31087:78:0;31080:86:::1;;;;31177:18;31205:4:::0;;-1:-1:-1;;31210:15:0;;31205:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31205:21:0::1;-1:-1:-1::0;;;;;31198:39:0::1;;31238:2;31198:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31198:43:0::1;-1:-1:-1::0;;;;;31198:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31198:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31198:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31198:43:0;31252:44:::1;::::0;;31198:43:::1;31252:44:::0;;::::1;::::0;;;;;;;;;;;31198:43;;-1:-1:-1;31252:44:0::1;::::0;;;31287:4;;;;;;31252:44;::::1;::::0;31287:4;;31252:44;31287:4;31252:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31293:2:0;;-1:-1:-1;31252:34:0::1;::::0;-1:-1:-1;;31252:44:0:i:1;:::-;31395:12:::0;31329:62:::1;31377:13:::0;31336:4;;-1:-1:-1;;31341:15:0;;31336:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31336:21:0::1;-1:-1:-1::0;;;;;31329:39:0::1;;31369:2;31329:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31329:43:0::1;-1:-1:-1::0;;;;;31329:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19083:835:0::0;19337:12;19351;19318:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;19376:12:::1;19391:44;19411:7;19420:6;19428;19391:19;:44::i;:::-;19446:57;::::0;;-1:-1:-1;;;19446:57:0;;19475:10:::1;19446:57;::::0;::::1;::::0;-1:-1:-1;;;;;19446:28:0;::::1;:57:::0;;;;;;;;;;;;;;19376:59;;-1:-1:-1;19446:28:0;;::::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19446:28:0;:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19446:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19446:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;19571:24:0::1;::::0;;-1:-1:-1;;;19571:24:0;;-1:-1:-1;;;;;19571:24:0;;::::1;;::::0;::::1;::::0;;;19541:12:::1;::::0;;;19571:20;;::::1;::::0;::::1;::::0;:24;;;;;;;;;;;19541:12;19571:20;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19571:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19571:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19571:24:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19571:24:0;-1:-1:-1;19607:14:0::1;19626:38;19649:6:::0;19657;19626:22:::1;:38::i;:::-;19606:58;;;19706:6;-1:-1:-1::0;;;;;19696:16:0::1;:6;-1:-1:-1::0;;;;;19696:16:0::1;;:58;;19737:7;19746;19696:58;;;19716:7;19725;19696:58;19675:79:::0;;-1:-1:-1;19675:79:0;-1:-1:-1;19773:21:0;;::::1;;19765:67;;;;-1:-1:-1::0;;;19765:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19862:10;19851:7;:21;;19843:67;;;;-1:-1:-1::0;;;19843:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15677:1;;;;19083:835:::0;;;;;;;;;;;:::o;15470:41::-;;;:::o;33079:248::-;33223:21;33269:50;33295:7;33304:8;33314:4;33269:25;:50::i;21276:659::-;21565:16;21583:14;21610:12;21625:41;21645:7;21654:5;21661:4;21625:19;:41::i;:::-;21610:56;;21677:10;21690;:33;;21714:9;21690:33;;;-1:-1:-1;;21690:33:0;21734:75;;;-1:-1:-1;;;21734:75:0;;21757:10;21734:75;;;;21777:4;21734:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21677:46;;-1:-1:-1;;;;;;21734:22:0;;;;;:75;;;;;-1:-1:-1;;21734:75:0;;;;;;;;-1:-1:-1;21734:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;21734:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21734:75:0;;;;21847:80;21866:5;21873:9;21884:14;21900:12;21914:2;21918:8;21847:18;:80::i;:::-;21820:107;;;;-1:-1:-1;21276:659:0;-1:-1:-1;;;;;;;;;;;;;21276:659:0:o;17342:728::-;17630:12;17644;17658:14;17611:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;17706:85:::1;17720:6;17728;17736:14;17752;17768:10;17780;17706:13;:85::i;:::-;17685:106:::0;;-1:-1:-1;17685:106:0;-1:-1:-1;17802:12:0::1;17817:44;17837:7;17846:6:::0;17854;17817:19:::1;:44::i;:::-;17802:59;;17872:66;17904:6;17912:10;17924:4;17930:7;17872:31;:66::i;:::-;17949;17981:6;17989:10;18001:4;18007:7;17949:31;:66::i;:::-;18048:4;-1:-1:-1::0;;;;;18038:20:0::1;;18059:2;18038:24;;;;;;;;;;;;;-1:-1:-1::0;;;;;18038:24:0::1;-1:-1:-1::0;;;;;18038:24:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18038:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18038:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18038:24:0;17342:728;;;;-1:-1:-1;18038:24:0;;-1:-1:-1;17342:728:0;;-1:-1:-1;;;;;;;;;17342:728:0:o;18076:964::-;18329:16;18347:14;18363;18310:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;18417:176:::1;18445:5;18465:4;18484:18;18517:9;18541:14;18570:12;18417:13;:176::i;:::-;18390:203:::0;;-1:-1:-1;18390:203:0;-1:-1:-1;18604:12:0::1;18619:41;18639:7;18648:5:::0;18655:4:::1;18619:19;:41::i;:::-;18604:56;;18671:69;18703:5;18710:10;18722:4;18728:11;18671:31;:69::i;:::-;18757:4;-1:-1:-1::0;;;;;18751:19:0::1;;18778:9;18751:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18751:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18751:39:0;;;;;18814:4;-1:-1:-1::0;;;;;18808:20:0::1;;18829:4;18835:9;18808:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;18808:37:0::1;-1:-1:-1::0;;;;;18808:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18808:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18808:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18808:37:0;18801:45:::1;;;;18879:4;-1:-1:-1::0;;;;;18869:20:0::1;;18890:2;18869:24;;;;;;;;;;;;;-1:-1:-1::0;;;;;18869:24:0::1;-1:-1:-1::0;;;;;18869:24:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18869:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18869:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18869:24:0;;-1:-1:-1;18944:9:0::1;:21:::0;-1:-1:-1;18940:92:0::1;;;18967:65;18998:10;19022:9;19010;:21;18967:30;:65::i;:::-;15677:1;18076:964:::0;;;;;;;;;;;:::o;27809:790::-;28022:21;27994:8;15627:15;15615:8;:27;;15607:59;;;;;-1:-1:-1;;;15607:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15607:59:0;;;;;;;;;;;;;;;28080:4:::1;-1:-1:-1::0;;;;;28069:15:0::1;:4;;28074:1;28069:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28069:7:0::1;-1:-1:-1::0;;;;;28069:15:0::1;;28061:52;;;::::0;;-1:-1:-1;;;28061:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28061:52:0;;;;;;;;;;;;;::::1;;28134:50;28159:7;28168:9;28179:4;;28134:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28134:24:0::1;::::0;-1:-1:-1;;;28134:50:0:i:1;:::-;28124:60;;28217:9;28203:7;28211:1;28203:10;;;;;;;;;;;;;;:23;;28195:70;;;;-1:-1:-1::0;;;28195:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28282:4;-1:-1:-1::0;;;;;28276:19:0::1;;28303:7;28311:1;28303:10;;;;;;;;;;;;;;28276:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28276:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28276:40:0;;;;;28340:4;-1:-1:-1::0;;;;;28334:20:0::1;;28355:46;28375:7;28384:4;;28389:1;28384:7;;;;;;28355:46;28403:7;28411:1;28403:10;;;;;;;;;;;;;;28334:80;;;;;;;;;;;;;-1:-1:-1::0;;;;;28334:80:0::1;-1:-1:-1::0;;;;;28334:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28334:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28334:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28334:80:0;28327:88:::1;;;;28426:24;28432:7;28441:4;;28426:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28447:2:0;;-1:-1:-1;28426:5:0::1;::::0;-1:-1:-1;;28426:24:0:i:1;:::-;28513:7;28521:1;28513:10;;;;;;;;;;;;;;28501:9;:22;28497:94;;;28525:66;28556:10;28580:7;28588:1;28580:10;;;;;;;;;;;;;;28568:9;:22;28525:30;:66::i;1184:361::-:0;1379:45;;;-1:-1:-1;;;;;1379:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1379:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1368:57:0;;;;1333:12;;1347:17;;1368:10;;;;1379:45;1368:57;;;25:18:-1;1368:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1368:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1332:93:0;;;;1444:7;:57;;;;-1:-1:-1;1456:11:0;;:16;;:44;;;1487:4;1476:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1476:24:0;1456:44;1436:101;;;;;-1:-1:-1;;;1436:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1184:361;;;;;:::o;1963:195::-;2071:12;;;2033;2071;;;;;;;;;-1:-1:-1;;;;;2050:7:0;;;2064:5;;2050:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2050:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2032:52:0;;;2103:7;2095:55;;;;-1:-1:-1;;;2095:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1963:195;;;:::o;12110:507::-;12203:14;12249:1;12238:8;:12;12230:63;;;;-1:-1:-1;;;12230:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12324:1;12312:9;:13;:31;;;;;12342:1;12329:10;:14;12312:31;12304:79;;;;-1:-1:-1;;;12304:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12394:20;12417:17;:8;12430:3;12417:17;:12;:17;:::i;:::-;12394:40;-1:-1:-1;12445:14:0;12462:31;12394:40;12482:10;12462:31;:19;:31;:::i;:::-;12445:48;-1:-1:-1;12504:16:0;12523:40;12547:15;12523:19;:9;12537:4;12523:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12504:59;;12598:11;12586:9;:23;;;;;;;12110:507;-1:-1:-1;;;;;;;12110:507:0:o;13282:506::-;13383:21;13440:1;13425:4;:11;:16;;13417:54;;;;;-1:-1:-1;;;13417:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13503:4;:11;13492:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13492:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13492:23:0;;13482:33;;13539:8;13526:7;13534:1;13526:10;;;;;;;;;;;;;:21;;;;;13563:6;13558:223;13589:1;13575:4;:11;:15;13571:1;:19;13558:223;;;13613:14;13629:15;13648:42;13660:7;13669:4;13674:1;13669:7;;;;;;;;;;;;;;13678:4;13683:1;13687;13683:5;13678:11;;;;;;;;;;;;;;13648;:42::i;:::-;13612:78;;;;13722:47;13735:7;13743:1;13735:10;;;;;;;;;;;;;;13747:9;13758:10;13722:12;:47::i;:::-;13705:7;13713:1;13717;13713:5;13705:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13592:3:0;;13558:223;;;;13282:506;;;;;:::o;10599:478::-;10688:12;10714:14;10730;10748:26;10759:6;10767;10748:10;:26::i;:::-;10912:32;;;-1:-1:-1;;10912:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;10912:32:0;;;;;10902:43;;;;;;10815:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10815:251:0;;;;;;;10805:262;;;;;;;;;10599:478;-1:-1:-1;;;;;10599:478:0:o;1553:402::-;1778:51;;;-1:-1:-1;;;;;1778:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1778:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1767:63:0;;;;1732:12;;1746:17;;1767:10;;;;1778:51;1767:63;;;25:18:-1;1767:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1767:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1731:99:0;;;;1849:7;:57;;;;-1:-1:-1;1861:11:0;;:16;;:44;;;1892:4;1881:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1881:24:0;1861:44;1841:106;;;;-1:-1:-1;;;1841:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1553:402;;;;;;:::o;23539:715::-;23646:6;23641:606;23672:1;23658:4;:11;:15;23654:1;:19;23641:606;;;23696:13;23711:14;23730:4;23735:1;23730:7;;;;;;;;;;;;;;23739:4;23744:1;23748;23744:5;23739:11;;;;;;;;;;;;;;23695:56;;;;23767:14;23786:37;23809:5;23816:6;23786:22;:37::i;:::-;23766:57;;;23838:14;23855:7;23863:1;23867;23863:5;23855:14;;;;;;;;;;;;;;23838:31;;23885:15;23902;23930:6;-1:-1:-1;;;;;23921:15:0;:5;-1:-1:-1;;;;;23921:15:0;;:61;;23963:9;23979:1;23921:61;;;23945:1;23949:9;23921:61;23884:98;;;;23997:10;24028:1;24014:4;:11;:15;24010:1;:19;:77;;24084:3;24010:77;;;24032:49;24052:7;24061:6;24069:4;24074:1;24078;24074:5;24069:11;;;;;;;;;;;;;;24032:19;:49::i;:::-;23997:90;;24112:43;24132:7;24141:5;24148:6;24112:19;:43::i;:::-;-1:-1:-1;;;;;24102:59:0;;24180:10;24192;24204:2;24218:1;24208:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;24208:12:0;87:42:-1;143:17;;-1:-1;24208:12:0;;24102:133;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24102:133:0;-1:-1:-1;;;;;24102:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24102:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24102:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23675:3:0;;;;;-1:-1:-1;23641:606:0;;-1:-1:-1;;;;;;;;23641:606:0;;;23539:715;;;:::o;13869:527::-;13970:21;14027:1;14012:4;:11;:16;;14004:54;;;;;-1:-1:-1;;;14004:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14090:4;:11;14079:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14079:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14079:23:0;;14069:33;;14143:9;14113:7;14138:1;14121:7;:14;:18;14113:27;;;;;;;;;;;;;;;;;:39;14177:11;;-1:-1:-1;;14177:15:0;14163:226;14194:5;;14163:226;;14222:14;14238:15;14257:42;14269:7;14278:4;14287:1;14283;:5;14278:11;;;;;;;;;;;;;;14291:4;14296:1;14291:7;;;;;;;14257:42;14221:78;;;;14331:46;14343:7;14351:1;14343:10;;;;;;;;;;;;;;14355:9;14366:10;14331:11;:46::i;:::-;14314:7;14326:1;14322;:5;14314:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14201:3:0;14163:226;;28746:1184;28859:6;28854:1069;28885:1;28871:4;:11;:15;28867:1;:19;28854:1069;;;28909:13;28924:14;28943:4;28948:1;28943:7;;;;;;;;;;;;;;28952:4;28957:1;28961;28957:5;28952:11;;;;;;;;;;;;;;28908:56;;;;28980:14;28999:37;29022:5;29029:6;28999:22;:37::i;:::-;28979:57;;;29051:14;29078:43;29098:7;29107:5;29114:6;29078:19;:43::i;:::-;29051:71;;29137:16;29168:17;29256:13;29271;29289:4;-1:-1:-1;;;;;29289:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29289:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29289:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29289:18:0;;;;;;;29255:52;;;;;-1:-1:-1;29255:52:0;;-1:-1:-1;29323:17:0;;-1:-1:-1;;;;;29364:15:0;;;;;;;:61;;29406:8;29416;29364:61;;;29383:8;29393;29364:61;29322:103;;;;29454:56;29497:12;29461:5;-1:-1:-1;;;;;29454:23:0;;29486:4;29454:38;;;;;;;;;;;;;-1:-1:-1;;;;;29454:38:0;-1:-1:-1;;;;;29454:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;29454:56:0;29440:70;;29540:66;29565:11;29578:12;29592:13;29540:24;:66::i;:::-;29525:81;;28854:1069;;;;29637:15;29654;29682:6;-1:-1:-1;;;;;29673:15:0;:5;-1:-1:-1;;;;;29673:15:0;;:67;;29718:12;29737:1;29673:67;;;29697:1;29701:12;29673:67;29636:104;;;;29755:10;29786:1;29772:4;:11;:15;29768:1;:19;:77;;29842:3;29768:77;;;29790:49;29810:7;29819:6;29827:4;29832:1;29836;29832:5;29827:11;;;;;;;29790:49;29898:12;;;29908:1;29898:12;;;;;;;;;;-1:-1:-1;;;29860:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29860:51:0;;;;;;;;;;;;;;;;;;;;;;29755:90;;-1:-1:-1;29860:9:0;;;;;;29870:10;;29882;;29755:90;;29898:12;;29860:51;;;;;;;;29898:12;;29860:51;;;;29898:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29860:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29860:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28888:3:0;;;;;-1:-1:-1;28854:1069:0;;-1:-1:-1;;;;;;;;;;28854:1069:0;9722:129;9806:5;;;9801:16;;;;9793:50;;;;;-1:-1:-1;;;9793:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12738:462;12831:13;12877:1;12865:9;:13;12857:65;;;;-1:-1:-1;;;12857:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12953:1;12941:9;:13;:31;;;;;12971:1;12958:10;:14;12941:31;12933:79;;;;-1:-1:-1;;;12933:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13023:14;13040:34;13069:4;13040:24;:9;13054;13040:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13023:51;-1:-1:-1;13085:16:0;13104:34;13134:3;13104:25;:10;13119:9;13104:25;:14;:25;:::i;:34::-;13085:53;;13160:32;13190:1;13173:11;13161:9;:23;;;;;;;13160:32;:29;:32;:::i;:::-;13149:43;12738:462;-1:-1:-1;;;;;;12738:462:0:o;11677:311::-;11759:12;11802:1;11792:7;:11;11784:56;;;;;-1:-1:-1;;;11784:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11870:1;11859:8;:12;:28;;;;;11886:1;11875:8;:12;11859:28;11851:76;;;;-1:-1:-1;;;11851:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11972:8;11948:21;:7;11960:8;11948:21;:11;:21;:::i;:::-;:32;;;;;;;11677:311;-1:-1:-1;;;;11677:311:0:o;10168:339::-;10243:14;10259;10304:6;-1:-1:-1;;;;;10294:16:0;:6;-1:-1:-1;;;;;10294:16:0;;;10286:61;;;;;-1:-1:-1;;;10286:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10386:6;-1:-1:-1;;;;;10377:15:0;:6;-1:-1:-1;;;;;10377:15:0;;:53;;10415:6;10423;10377:53;;;10396:6;10404;10377:53;10358:72;;-1:-1:-1;10358:72:0;-1:-1:-1;;;;;;10449:20:0;;10441:58;;;;;-1:-1:-1;;;10441:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10168:339;;;;;:::o;15981:1355::-;16294:45;;;-1:-1:-1;;;16294:45:0;;-1:-1:-1;;;;;16294:45:0;;;;;;;;;;;;;;;;16199:12;;;;;;16307:7;16294:29;;;;;;:45;;;;;;;;;;;;;;;:29;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;16294:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16294:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16294:45:0;-1:-1:-1;;;;;16294:59:0;;16290:140;;;16370:48;;;-1:-1:-1;;;16370:48:0;;-1:-1:-1;;;;;16370:48:0;;;;;;;;;;;;;;;;16383:7;16370:32;;;;;;:48;;;;;;;;;;;;;;;-1:-1:-1;16370:32:0;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;16370:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16370:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;16290:140:0;16441:13;16456;16473:48;16497:7;16506:6;16514;16473:23;:48::i;:::-;16440:81;;;;16536:8;16548:1;16536:13;:30;;;;-1:-1:-1;16553:13:0;;16536:30;16532:797;;;16605:14;;-1:-1:-1;16621:14:0;;-1:-1:-1;16532:797:0;;;16669:19;16691:53;16709:14;16725:8;16735;16691:17;:53::i;:::-;16669:75;;16781:14;16763;:32;16759:559;;16842:10;16824:14;:28;;16816:74;;;;-1:-1:-1;;;16816:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16931:14;;-1:-1:-1;16947:14:0;-1:-1:-1;16947:14:0;16759:559;;;17003:19;17025:53;17043:14;17059:8;17069;17025:17;:53::i;:::-;17003:75;;17122:14;17104;:32;;17097:40;;;;17182:10;17164:14;:28;;17156:74;;;;-1:-1:-1;;;17156:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17271:14;-1:-1:-1;17287:14:0;;-1:-1:-1;16759:559:0;16532:797;;15981:1355;;;;;;;;;;;:::o;9859:142::-;9911:6;9938;;;:30;;-1:-1:-1;;9953:5:0;;;9967:1;9962;9953:5;9962:1;9948:15;;;;;:20;9938:30;9930:63;;;;;-1:-1:-1;;;9930:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9586:128;9670:5;;;9665:16;;;;9657:49;;;;;-1:-1:-1;;;9657:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11135:429;11228:13;11243;11270:14;11289:26;11300:6;11308;11289:10;:26::i;:::-;11269:46;;;11326:32;11334:7;11343:6;11351;11326:7;:32::i;:::-;;11370:13;11385;11413:32;11421:7;11430:6;11438;11413:7;:32::i;:::-;-1:-1:-1;;;;;11403:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11403:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11403:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11403:57:0;;;;;;;11369:91;;;;;-1:-1:-1;11369:91:0;;-1:-1:-1;;;;;;11494:16:0;;;;;;;:62;;11537:8;11547;11494:62;;;11514:8;11524;11494:62;11471:85;;;;-1:-1:-1;11135:429:0;-1:-1:-1;;;;;;;11135:429:0:o

Swarm Source

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