Contract 0x145677fc4d9b8f19b5d56d1820c48e0443049a30 5

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0c3868db575941b1abb63e5a79cad061479491468c4c46dcf1daf05ba65864c0Swap Exact ETH F...28904382022-05-23 1:24:4115 secs ago0x2457152ede61c3413129d87b274d1ad746b5aa51 IN  Mad Meerkat Finance: Master Meerkat & Router7 CRO0.698590
0x2bd08ca6329ee5a32117a0e1d86bca6a512f8b9f688bc490b583e8c7755797a2Add Liquidity28904382022-05-23 1:24:4115 secs ago0xf78f38d6e7becce200db8abf78026a81ec440f70 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.0111416329250
0x71d03358d81f9445c9660d88c899b5614a570987b77578fe72ea5e231e615157Swap Exact Token...28904382022-05-23 1:24:4115 secs ago0x97a1a210b81cd9ef5642a40a24509212d45d7483 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.73677 5,000
0x415520674fa503f42e27feeb6b0c06fe3c8a46a34ab42741dc3308b12ecaa25dSwap Exact Token...28904372022-05-23 1:24:3620 secs ago0x559fe1d18ef500840464f47a3e2fb59e82b63a4e IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.1067 5,000
0xc489f05aa67623c53ab23c105650e888703d691cf06ab67381215fe7c15335b0Swap Exact ETH F...28904362022-05-23 1:24:3026 secs ago0xda6e81e8a55225a9712b0bd9222d6a4b935dcfa1 IN  Mad Meerkat Finance: Master Meerkat & Router250 CRO0.77410
0x993665262e85fae3e0b595206d2df3c8e5edfbb935b52871cb0d3e71580249f8Remove Liquidity...28904362022-05-23 1:24:3026 secs ago0xaeb4a92a1b9ab12a795777b4c06d8d5291a4ead0 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.328590
0x2b609814c535db6eec82c6981ffb78077147faa9ddb761991d7fee301a2528a8Remove Liquidity...28904352022-05-23 1:24:2432 secs ago0x2dc3b0ff8ca586377cb261dc22b95776c6915c6f IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.07794 5,000
0x5c54e9940ea3faa92018921566b6f6f2ffa61a995411de4083f4cdcfbf25c988Add Liquidity28904352022-05-23 1:24:2432 secs ago0x49f320a9921e41db32ba8adf2a457aafccd0d9ed IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.1439329666220
0x760e9a8ea8278714842b30b512c18f021b713509184ccaaaa6972770023f1edaSwap Exact Token...28904342022-05-23 1:24:1838 secs ago0xe9cec580c465c53156379b02cc7e936edb72ecb7 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.6549672949120
0x7cd59e89b65e439f24a78fb16def9797ab0707cb6a32d087bedde20de44eec0bSwap Exact Token...28904332022-05-23 1:24:1244 secs ago0xb98b42792d1e101821907eaac476ffe10b252c79 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.737490
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d0Swap Exact Token...28904332022-05-23 1:24:1244 secs ago0xb44edf4ceba18bf39a9445a23d6f8fd679b91206 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO5.537850
0xe9eda0d06ed4dd11e69443ee971b701e49b0c7a5230a28ab07881b8cb0b49f92Swap Exact ETH F...28904332022-05-23 1:24:1244 secs ago0xaa4a1af7e9c0c0bfe2ff942175bedc261d3143f5 IN  Mad Meerkat Finance: Master Meerkat & Router261.869425928666628 CRO0.9593835235190
0x935cc2a768b3243629eeb31230974030f3178a4feb8d9f5cec40f35db1e358d7Remove Liquidity...28904332022-05-23 1:24:1244 secs ago0x57b9263e06453187d3e0bd98de0603d04d522906 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.078360
0xa80ed2d00734df32eeb9b61c6dc0a33a836903559bac9ae5d9be660cc493cf43Swap Exact ETH F...28904332022-05-23 1:24:1244 secs ago0xf78f38d6e7becce200db8abf78026a81ec440f70 IN  Mad Meerkat Finance: Master Meerkat & Router5.7 CRO0.7726067243580
0x2a15d4c89d5b20021fbdddef0446c017ce94e799d8d7107d32375e74b6d3462dSwap Exact Token...28904322022-05-23 1:24:0749 secs ago0xe7705d03e63074c62d9fba10c9c2bc8d171f2398 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.845930
0xac7336a0e17a3af815a8f4bac592a42f3086ed3be3c58b47761a003c193eed1eSwap Exact Token...28904322022-05-23 1:24:0749 secs ago0x3f631444fce5785a282e49e90e5100e4a5c2ff0c IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.719580
0xec40f3644f6ddd01d86c5d33b7342879debd744df62b2aa31aceeffab5a3e919Swap Exact Token...28904322022-05-23 1:24:0749 secs ago0x8e6fe20b13e1753283c15e2182e4972cb2260bb9 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.4158 5,000
0xbd3efa42ba884ecb6c575afd6716ba56a9312ea752143a523f532955606448a0Swap Exact Token...28904322022-05-23 1:24:0749 secs ago0xd0b56d14ae45a59e0384d4b66f867337969d27af IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.662675 5,000
0x95b3b4933d934b9d453a077b4ef8048fef28b265b7165b6c69a91028a38d8e37Remove Liquidity...28904312022-05-23 1:24:0155 secs ago0x31391261bdfeba0ce0819532cab70c91cb08bf87 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.38580
0x61db171af37f9d9433e851f35877f4f018528299b7755f0e78c45470423565afSwap Exact Token...28904312022-05-23 1:24:0155 secs ago0xc0df417edd0dec6b55b99fe9fbc0c588e55fb290 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO2.008265 7,000
0xfabd4317d539877096e2f31cc814d185ba612ec3095d22aaa3c3e973d32f5bf0Remove Liquidity...28904312022-05-23 1:24:0155 secs ago0x72c3dee72505aa64820f129792efc5eb0b5d907b IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.13841 5,000
0x15074d93f32da1df2f1aed1be581bfceaf30f4638ce3e106422aca1b12c8adf0Swap Exact Token...28904292022-05-23 1:23:501 min ago0xb98b42792d1e101821907eaac476ffe10b252c79 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.147680
0x446b86cb4836c1968786bbaf508b7da54902d581f5765d1266d6c76de489fd54Add Liquidity ET...28904292022-05-23 1:23:501 min ago0xc9439f9d11bee50cb268522bd2a0590667925474 IN  Mad Meerkat Finance: Master Meerkat & Router250,000 CRO1.1408050
0xafdfa28056d98a91316d7b740529a5070b2fdb8939d0bc9200237667df7eaf4eSwap Exact Token...28904282022-05-23 1:23:441 min ago0xe7705d03e63074c62d9fba10c9c2bc8d171f2398 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.920930
0x227802ae898cf940a4b646b9f02f94231a67b033f67d5124ffe676742584044fSwap Exact ETH F...28904282022-05-23 1:23:441 min ago0x8e6fe20b13e1753283c15e2182e4972cb2260bb9 IN  Mad Meerkat Finance: Master Meerkat & Router3,900 CRO1.460985 5,000
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc489f05aa67623c53ab23c105650e888703d691cf06ab67381215fe7c15335b028904362022-05-23 1:24:3026 secs ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token250 CRO
0x993665262e85fae3e0b595206d2df3c8e5edfbb935b52871cb0d3e71580249f828904362022-05-23 1:24:3026 secs ago Mad Meerkat Finance: Master Meerkat & Router0xaeb4a92a1b9ab12a795777b4c06d8d5291a4ead0115.368792691237514532 CRO
0x993665262e85fae3e0b595206d2df3c8e5edfbb935b52871cb0d3e71580249f828904362022-05-23 1:24:3026 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router115.368792691237514532 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router0xb44edf4ceba18bf39a9445a23d6f8fd679b91206177.248509505365856964 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router177.248509505365856964 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token10.487231077664739376 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago 0xe8df768f30f1061973279d6772ec66d7c7c17110 Mad Meerkat Finance: Master Meerkat & Router10.487231077664739376 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token209.744621553294787524 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago 0xe80edacef73f5b568905e51b01337fc2d83e2deb Mad Meerkat Finance: Master Meerkat & Router209.744621553294787524 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router 0xe8df768f30f1061973279d6772ec66d7c7c17110293.642470174612702534 CRO
0xef990ee4cb79f13f72626f2732ba50cf11b4b203c86881bfd8bdd5f0c67b29d028904332022-05-23 1:24:1244 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router293.642470174612702534 CRO
0xe9eda0d06ed4dd11e69443ee971b701e49b0c7a5230a28ab07881b8cb0b49f9228904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token261.86942592866662813 CRO
0xa80ed2d00734df32eeb9b61c6dc0a33a836903559bac9ae5d9be660cc493cf4328904332022-05-23 1:24:1244 secs ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token5.7 CRO
0x2a15d4c89d5b20021fbdddef0446c017ce94e799d8d7107d32375e74b6d3462d28904322022-05-23 1:24:0749 secs ago Mad Meerkat Finance: Master Meerkat & Router0xe7705d03e63074c62d9fba10c9c2bc8d171f2398138.731607683825971402 CRO
0x2a15d4c89d5b20021fbdddef0446c017ce94e799d8d7107d32375e74b6d3462d28904322022-05-23 1:24:0749 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router138.731607683825971402 CRO
0x2a15d4c89d5b20021fbdddef0446c017ce94e799d8d7107d32375e74b6d3462d28904322022-05-23 1:24:0749 secs ago Mad Meerkat Finance: Master Meerkat & Router 0x4a115922c8985c48a7e51050dee5298ffa85d5f3111.651513489702517303 CRO
0x2a15d4c89d5b20021fbdddef0446c017ce94e799d8d7107d32375e74b6d3462d28904322022-05-23 1:24:0749 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router111.651513489702517303 CRO
0xac7336a0e17a3af815a8f4bac592a42f3086ed3be3c58b47761a003c193eed1e28904322022-05-23 1:24:0749 secs ago Mad Meerkat Finance: Master Meerkat & Router0x3f631444fce5785a282e49e90e5100e4a5c2ff0c2,134.449814081947893138 CRO
0xac7336a0e17a3af815a8f4bac592a42f3086ed3be3c58b47761a003c193eed1e28904322022-05-23 1:24:0749 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router2,134.449814081947893138 CRO
0x95b3b4933d934b9d453a077b4ef8048fef28b265b7165b6c69a91028a38d8e3728904312022-05-23 1:24:0155 secs ago Mad Meerkat Finance: Master Meerkat & Router0x31391261bdfeba0ce0819532cab70c91cb08bf8736.609373100831310202 CRO
0x95b3b4933d934b9d453a077b4ef8048fef28b265b7165b6c69a91028a38d8e3728904312022-05-23 1:24:0155 secs ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router36.609373100831310202 CRO
0x446b86cb4836c1968786bbaf508b7da54902d581f5765d1266d6c76de489fd5428904292022-05-23 1:23:501 min ago Mad Meerkat Finance: Master Meerkat & Router0xc9439f9d11bee50cb268522bd2a059066792547479 basecro
0x446b86cb4836c1968786bbaf508b7da54902d581f5765d1266d6c76de489fd5428904292022-05-23 1:23:501 min ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token249,999.999999999999999921 CRO
0xafdfa28056d98a91316d7b740529a5070b2fdb8939d0bc9200237667df7eaf4e28904282022-05-23 1:23:441 min ago Mad Meerkat Finance: Master Meerkat & Router0xe7705d03e63074c62d9fba10c9c2bc8d171f2398142.560702044858741556 CRO
0xafdfa28056d98a91316d7b740529a5070b2fdb8939d0bc9200237667df7eaf4e28904282022-05-23 1:23:441 min ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router142.560702044858741556 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MeerkatRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-02-22
*/

// File contracts/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 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::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 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::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}


// File contracts/interfaces/IMeerkatRouter02.sol

pragma solidity >=0.6.2;
interface IMeerkatRouter02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapFeeReward() 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, uint swapFee) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint swapFee) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

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

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


// File contracts/interfaces/IMeerkatPair.sol

pragma solidity >=0.5.0;

interface IMeerkatPair {
    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 swapFee() external view returns (uint32);

    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;
    function setSwapFee(uint32) external;
}


// File contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

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

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

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

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


// File contracts/libraries/MeerkatLibrary.sol

pragma solidity >=0.5.0;


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

    function getSwapFee(address factory, address tokenA, address tokenB) internal view returns (uint swapFee) {
        swapFee = IMeerkatPair(pairFor(factory, tokenA, tokenB)).swapFee();
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IMeerkatPair(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, 'MeerkatLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'MeerkatLibrary: 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, uint swapFee) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'MeerkatLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'MeerkatLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(uint(10000).sub(swapFee));
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).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, uint swapFee) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'MeerkatLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'MeerkatLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(uint(10000).sub(swapFee));
        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, 'MeerkatLibrary: 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, getSwapFee(factory, path[i], path[i + 1]));
        }
    }

    // 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, 'MeerkatLibrary: 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, getSwapFee(factory, path[i - 1], path[i]));
        }
    }
    
}


// File contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

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

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


// File contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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


// File contracts/libraries/Babylonian.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.4.0;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}


// File contracts/libraries/FullMath.sol

// SPDX-License-Identifier: CC-BY-4.0
pragma solidity >=0.4.0;

// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1
// license is CC-BY-4.0
library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);

        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, 'FullMath: FULLDIV_OVERFLOW');
        return fullDiv(l, h, d);
    }
}


// File contracts/MeerkatRouter02.sol

pragma solidity =0.6.6;

interface IMeerkatFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}








contract Ownable {
    address private _owner;

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
}

interface ISwapFeeReward {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

contract MeerkatRouter02 is IMeerkatRouter02, Ownable {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'MeerkatV2Router: 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
    }

    function setSwapFeeReward(address _swapFeeReward) public onlyOwner {
        swapFeeReward = _swapFeeReward;
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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"},{"internalType":"uint256","name":"swapFee","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"},{"internalType":"uint256","name":"swapFee","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":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeeReward","type":"address"}],"name":"setSwapFeeReward","outputs":[],"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":[],"name":"swapFeeReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162004e8d38038062004e8d8339818101604052604081101561003557600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614cbf620001ce600039806101e15280610e5e5280610e995280610f7b5280611199528061153752806116c25280611b2d5280611c275280611cdd5280611dab5280611ef15280611f7952806121cf5280612252528061230152806123cd528061246252806124d652806129d45280612cad5280612d035280612d375280612dab5280612f4b528061308e528061311652508061100952806110e0528061125f528061129852806113e752806115c552806116a052806118105280611e3e5280611fab5280612101528061250852806127615280612959528061298252806129b25280612b1f5280612ce15280612fde52806131485280613a3c5280613a7f5280613f8a52806142195280614559528061460752806146875250614cbf6000f3fe6080604052600436106101d15760003560e01c80638da5cb5b116100f7578063c45a015511610095578063f2fde38b11610064578063f2fde38b14610ce1578063f305d71914610d14578063fb3bdb4114610d5a578063fbbeedf114610dde5761020a565b8063c45a015514610b24578063d06ca61f14610b39578063ded9382a14610bee578063e8e3370014610c615761020a565b8063ad615dec116100d1578063ad615dec146109ba578063af2979eb146109f0578063b6f9de9514610a43578063baa2abde14610ac75761020a565b80638da5cb5b1461095f578063a3ddb30b14610990578063ad5c4648146109a55761020a565b806352707d8c1161016f578063715018a61161013e578063715018a61461079a578063791ac947146107af5780637ff36ab5146108455780638803dbee146108c95761020a565b806352707d8c14610607578063571fd012146106555780635b0d5984146106915780635c11d795146107045761020a565b80632195995c116101ab5780632195995c146104165780632f54bf6e1461049457806338ed1739146104db5780634a25d94a146105715761020a565b806302751cec1461020f57806318cbafe51461027b5780631f00ca74146103615761020a565b3661020a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020857fe5b005b600080fd5b34801561021b57600080fd5b50610262600480360360c081101561023257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610e11565b6040805192835260208301919091528051918290030190f35b34801561028757600080fd5b50610311600480360360a081101561029e57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c457600080fd5b8201836020820111156102d657600080fd5b803590602001918460208302840111600160201b831117156102f757600080fd5b91935091506001600160a01b038135169060200135610f2b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561034d578181015183820152602001610335565b505050509050019250505060405180910390f35b34801561036d57600080fd5b506103116004803603604081101561038457600080fd5b81359190810190604081016020820135600160201b8111156103a557600080fd5b8201836020820111156103b757600080fd5b803590602001918460208302840111600160201b831117156103d857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611258945050505050565b34801561042257600080fd5b50610262600480360361016081101561043a57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561128e565b3480156104a057600080fd5b506104c7600480360360208110156104b757600080fd5b50356001600160a01b0316611388565b604080519115158252519081900360200190f35b3480156104e757600080fd5b50610311600480360360a08110156104fe57600080fd5b813591602081013591810190606081016040820135600160201b81111561052457600080fd5b82018360208201111561053657600080fd5b803590602001918460208302840111600160201b8311171561055757600080fd5b91935091506001600160a01b03813516906020013561139c565b34801561057d57600080fd5b50610311600480360360a081101561059457600080fd5b813591602081013591810190606081016040820135600160201b8111156105ba57600080fd5b8201836020820111156105cc57600080fd5b803590602001918460208302840111600160201b831117156105ed57600080fd5b91935091506001600160a01b0381351690602001356114e7565b34801561061357600080fd5b506106436004803603608081101561062a57600080fd5b5080359060208101359060408101359060600135611673565b60408051918252519081900360200190f35b34801561066157600080fd5b506106436004803603608081101561067857600080fd5b508035906020810135906040810135906060013561168a565b34801561069d57600080fd5b5061064360048036036101408110156106b557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611698565b34801561071057600080fd5b50610208600480360360a081101561072757600080fd5b813591602081013591810190606081016040820135600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460208302840111600160201b8311171561078057600080fd5b91935091506001600160a01b0381351690602001356117a6565b3480156107a657600080fd5b50610208611a3b565b3480156107bb57600080fd5b50610208600480360360a08110156107d257600080fd5b813591602081013591810190606081016040820135600160201b8111156107f857600080fd5b82018360208201111561080a57600080fd5b803590602001918460208302840111600160201b8311171561082b57600080fd5b91935091506001600160a01b038135169060200135611adf565b6103116004803603608081101561085b57600080fd5b81359190810190604081016020820135600160201b81111561087c57600080fd5b82018360208201111561088e57600080fd5b803590602001918460208302840111600160201b831117156108af57600080fd5b91935091506001600160a01b038135169060200135611d63565b3480156108d557600080fd5b50610311600480360360a08110156108ec57600080fd5b813591602081013591810190606081016040820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460208302840111600160201b8311171561094557600080fd5b91935091506001600160a01b0381351690602001356120b6565b34801561096b57600080fd5b506109746121af565b604080516001600160a01b039092168252519081900360200190f35b34801561099c57600080fd5b506109746121be565b3480156109b157600080fd5b506109746121cd565b3480156109c657600080fd5b50610643600480360360608110156109dd57600080fd5b50803590602081013590604001356121f1565b3480156109fc57600080fd5b50610643600480360360c0811015610a1357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612206565b61020860048036036080811015610a5957600080fd5b81359190810190604081016020820135600160201b811115610a7a57600080fd5b820183602082011115610a8c57600080fd5b803590602001918460208302840111600160201b83111715610aad57600080fd5b91935091506001600160a01b038135169060200135612387565b348015610ad357600080fd5b50610262600480360360e0811015610aea57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612713565b348015610b3057600080fd5b50610974612957565b348015610b4557600080fd5b5061031160048036036040811015610b5c57600080fd5b81359190810190604081016020820135600160201b811115610b7d57600080fd5b820183602082011115610b8f57600080fd5b803590602001918460208302840111600160201b83111715610bb057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061297b945050505050565b348015610bfa57600080fd5b506102626004803603610140811015610c1257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356129a8565b348015610c6d57600080fd5b50610cc36004803603610100811015610c8557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612abc565b60408051938452602084019290925282820152519081900360600190f35b348015610ced57600080fd5b5061020860048036036020811015610d0457600080fd5b50356001600160a01b0316612bf8565b610cc3600480360360c0811015610d2a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c5e565b61031160048036036080811015610d7057600080fd5b81359190810190604081016020820135600160201b811115610d9157600080fd5b820183602082011115610da357600080fd5b803590602001918460208302840111600160201b83111715610dc457600080fd5b91935091506001600160a01b038135169060200135612f03565b348015610dea57600080fd5b5061020860048036036020811015610e0157600080fd5b50356001600160a01b0316613285565b6000808242811015610e58576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b610e87897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612713565b9093509150610e97898685613301565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610efd57600080fd5b505af1158015610f11573d6000803e3d6000fd5b50505050610f1f8583613455565b50965096945050505050565b60608142811015610f71576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610fab57fe5b905060200201356001600160a01b03166001600160a01b031614611004576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b6110627f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b9150868260018451038151811061107557fe5b602002602001015110156110ba5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b611158868660008181106110ca57fe5b905060200201356001600160a01b03163361113e7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061110c57fe5b905060200201356001600160a01b03168b8b600181811061112957fe5b905060200201356001600160a01b03166136cd565b8560008151811061114b57fe5b602002602001015161378d565b611197828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506138ea915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106111d657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561121457600080fd5b505af1158015611228573d6000803e3d6000fd5b5050505061124d848360018551038151811061124057fe5b6020026020010151613455565b509695505050505050565b60606112857f00000000000000000000000000000000000000000000000000000000000000008484613bd3565b90505b92915050565b60008060006112be7f00000000000000000000000000000000000000000000000000000000000000008f8f6136cd565b90506000876112cd578c6112d1565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505061136e8f8f8f8f8f8f8f612713565b809450819550505050509b509b9950505050505050505050565b6000546001600160a01b0390811691161490565b606081428110156113e2576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6114407f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b9150868260018451038151811061145357fe5b602002602001015110156114985760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b6114a8868660008181106110ca57fe5b61124d828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b6060814281101561152d576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061156757fe5b905060200201356001600160a01b03166001600160a01b0316146115c0576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b61161e7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150868260008151811061162e57fe5b602002602001015111156110ba5760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b600061168185858585613d32565b95945050505050565b600061168185858585613e33565b6000806116e67f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006136cd565b90506000866116f5578b6116f9565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561176f57600080fd5b505af1158015611783573d6000803e3d6000fd5b505050506117958d8d8d8d8d8d612206565b9d9c50505050505050505050505050565b80428110156117ea576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61185f858560008181106117fa57fe5b905060200201356001600160a01b0316336118597f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b905060200201356001600160a01b03168a8a600181811061112957fe5b8a61378d565b60008585600019810181811061187157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118d657600080fd5b505afa1580156118ea573d6000803e3d6000fd5b505050506040513d602081101561190057600080fd5b50516040805160208881028281018201909352888252929350611942929091899189918291850190849080828437600092019190915250889250613f33915050565b866119f4828888600019810181811061195757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d60208110156119e657600080fd5b50519063ffffffff61434e16565b1015611a315760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b5050505050505050565b611a4433611388565b611a95576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b8042811015611b23576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611b5d57fe5b905060200201356001600160a01b03166001600160a01b031614611bb6576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b611bc6858560008181106117fa57fe5b611c04858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f33915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611c6e57600080fd5b505afa158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b5051905086811015611cdb5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d4157600080fd5b505af1158015611d55573d6000803e3d6000fd5b50505050611a318482613455565b60608142811015611da9576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611de057fe5b905060200201356001600160a01b03166001600160a01b031614611e39576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b611e977f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b91508682600184510381518110611eaa57fe5b60200260200101511015611eef5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611f2b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611fd77f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b84600081518110611fe457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b505050506040513d602081101561206557600080fd5b505161206d57fe5b6120ac828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b5095945050505050565b606081428110156120fc576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61215a7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150868260008151811061216a57fe5b602002602001015111156114985760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b6000546001600160a01b031690565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006121fe84848461439e565b949350505050565b6000814281101561224c576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61227b887f00000000000000000000000000000000000000000000000000000000000000008989893089612713565b604080516370a0823160e01b815230600482015290519194506122ff92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156122ce57600080fd5b505afa1580156122e2573d6000803e3d6000fd5b505050506040513d60208110156122f857600080fd5b5051613301565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561236557600080fd5b505af1158015612379573d6000803e3d6000fd5b5050505061124d8483613455565b80428110156123cb576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061240257fe5b905060200201356001600160a01b03166001600160a01b03161461245b576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124bb57600080fd5b505af11580156124cf573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125347f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b505050506040513d60208110156125ae57600080fd5b50516125b657fe5b6000868660001981018181106125c857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561262d57600080fd5b505afa158015612641573d6000803e3d6000fd5b505050506040513d602081101561265757600080fd5b505160408051602089810282810182019093528982529293506126999290918a918a918291850190849080828437600092019190915250899250613f33915050565b876119f482898960001981018181106126ae57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b600080824281101561275a576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b60006127877f00000000000000000000000000000000000000000000000000000000000000008c8c6136cd565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156127e257600080fd5b505af11580156127f6573d6000803e3d6000fd5b505050506040513d602081101561280c57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561285957600080fd5b505af115801561286d573d6000803e3d6000fd5b505050506040513d604081101561288357600080fd5b5080516020909101519092509050600061289d8e8e61444a565b509050806001600160a01b03168e6001600160a01b0316146128c05781836128c3565b82825b90975095508a8710156129075760405162461bcd60e51b8152600401808060200182810382526026815260200180614b346026913960400191505060405180910390fd5b898610156129465760405162461bcd60e51b8152600401808060200182810382526026815260200180614b7d6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606112857f0000000000000000000000000000000000000000000000000000000000000000848461354d565b60008060006129f87f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006136cd565b9050600087612a07578c612a0b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612a8157600080fd5b505af1158015612a95573d6000803e3d6000fd5b50505050612aa78e8e8e8e8e8e610e11565b909f909e509c50505050505050505050505050565b60008060008342811015612b05576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b612b138c8c8c8c8c8c614528565b90945092506000612b457f00000000000000000000000000000000000000000000000000000000000000008e8e6136cd565b9050612b538d33838861378d565b612b5f8c33838761378d565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bb757600080fd5b505af1158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b5051949d939c50939a509198505050505050505050565b612c0133611388565b612c52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612c5b8161479c565b50565b60008060008342811015612ca7576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b612cd58a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614528565b90945092506000612d277f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006136cd565b9050612d358b33838861378d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d9057600080fd5b505af1158015612da4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050506040513d6020811015612e5357600080fd5b5051612e5b57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612eb357600080fd5b505af1158015612ec7573d6000803e3d6000fd5b505050506040513d6020811015612edd57600080fd5b5051925034841015612ef557612ef533853403613455565b505096509650969350505050565b60608142811015612f49576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612f8057fe5b905060200201356001600160a01b03166001600160a01b031614612fd9576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b6130377f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150348260008151811061304757fe5b6020026020010151111561308c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106130c857fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156130fb57600080fd5b505af115801561310f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6131747f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b8460008151811061318157fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156131d857600080fd5b505af11580156131ec573d6000803e3d6000fd5b505050506040513d602081101561320257600080fd5b505161320a57fe5b613249828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b8160008151811061325657fe5b60200260200101513411156120ac576120ac338360008151811061327657fe5b60200260200101513403613455565b61328e33611388565b6132df576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061337e5780518252601f19909201916020918201910161335f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133e0576040519150601f19603f3d011682016040523d82523d6000602084013e6133e5565b606091505b5091509150818015613413575080511580613413575080806020019051602081101561341057600080fd5b50515b61344e5760405162461bcd60e51b815260040180806020018281038252602d815260200180614c13602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134a15780518252601f199092019160209182019101613482565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613503576040519150601f19603f3d011682016040523d82523d6000602084013e613508565b606091505b50509050806135485760405162461bcd60e51b8152600401808060200182810382526034815260200180614ab56034913960400191505060405180910390fd5b505050565b60606002825110156135a6576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156135be57600080fd5b506040519080825280602002602001820160405280156135e8578160200160208202803683370190505b50905082816000815181106135f957fe5b60200260200101818152505060005b60018351038110156136c55760008061364b8786858151811061362757fe5b602002602001015187866001018151811061363e57fe5b602002602001015161483c565b915091506136a184848151811061365e57fe5b6020026020010151838361369c8b8a898151811061367857fe5b60200260200101518b8a6001018151811061368f57fe5b6020026020010151614903565b613d32565b8484600101815181106136b057fe5b60209081029190910101525050600101613608565b509392505050565b60008060006136dc858561444a565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f7ae6954210575e79ea2402d23bc6a59c4146a6e6296118aa8b99c747afec8acf609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138125780518252601f1990920191602091820191016137f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613874576040519150601f19603f3d011682016040523d82523d6000602084013e613879565b606091505b50915091508180156138a75750805115806138a757508080602001905160208110156138a457600080fd5b50515b6138e25760405162461bcd60e51b8152600401808060200182810382526031815260200180614a846031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bcd5760008084838151811061390857fe5b602002602001015185846001018151811061391f57fe5b6020026020010151915091506000613937838361444a565b509050600087856001018151811061394b57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139795782600061397d565b6000835b60015491935091506001600160a01b031615613a24576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018790529151919092169163a9678a189160848083019260209291908290030181600087803b1580156139f757600080fd5b505af1158015613a0b573d6000803e3d6000fd5b505050506040513d6020811015613a2157600080fd5b50505b600060028a51038810613a375788613a78565b613a787f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613a6b57fe5b60200260200101516136cd565b9050613aa57f000000000000000000000000000000000000000000000000000000000000000088886136cd565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ae2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b53578181015183820152602001613b3b565b50505050905090810190601f168015613b805780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613ba257600080fd5b505af1158015613bb6573d6000803e3d6000fd5b5050600190990198506138ed975050505050505050565b50505050565b6060600282511015613c2c576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c4457600080fd5b50604051908082528060200260200182016040528015613c6e578160200160208202803683370190505b5090508281600183510381518110613c8257fe5b60209081029190910101528151600019015b80156136c557600080613cc487866001860381518110613cb057fe5b602002602001015187868151811061363e57fe5b91509150613d0d848481518110613cd757fe5b60200260200101518383613d088b8a60018a0381518110613cf457fe5b60200260200101518b8a8151811061368f57fe5b613e33565b846001850381518110613d1c57fe5b6020908102919091010152505060001901613c94565b6000808511613d725760405162461bcd60e51b8152600401808060200182810382526029815260200180614a356029913960400191505060405180910390fd5b600084118015613d825750600083115b613dbd5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b6000613de1613dd46127108563ffffffff61434e16565b879063ffffffff61498216565b90506000613df5828663ffffffff61498216565b90506000613e1b83613e0f8961271063ffffffff61498216565b9063ffffffff6149e516565b9050808281613e2657fe5b0498975050505050505050565b6000808511613e735760405162461bcd60e51b815260040180806020018281038252602a815260200180614c40602a913960400191505060405180910390fd5b600084118015613e835750600083115b613ebe5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b6000613ee2612710613ed6878963ffffffff61498216565b9063ffffffff61498216565b90506000613f0b613efb6127108663ffffffff61434e16565b613ed6878a63ffffffff61434e16565b9050613f286001828481613f1b57fe5b049063ffffffff6149e516565b979650505050505050565b60005b600183510381101561354857600080848381518110613f5157fe5b6020026020010151858460010181518110613f6857fe5b6020026020010151915091506000613f80838361444a565b5090506000613fb07f000000000000000000000000000000000000000000000000000000000000000085856136cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613ff157600080fd5b505afa158015614005573d6000803e3d6000fd5b505050506040513d606081101561401b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614051578284614054565b83835b915091506140b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b955061412a8683838a6001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156140f357600080fd5b505afa158015614107573d6000803e3d6000fd5b505050506040513d602081101561411d57600080fd5b505163ffffffff16613d32565b6001549095506001600160a01b03161593506141d592505050576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b1580156141a857600080fd5b505af11580156141bc573d6000803e3d6000fd5b505050506040513d60208110156141d257600080fd5b50505b600080856001600160a01b0316886001600160a01b0316146141f9578260006141fd565b6000835b91509150600060028c51038a10614214578a614248565b6142487f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613a6b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142d25781810151838201526020016142ba565b50505050905090810190601f1680156142ff5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561432157600080fd5b505af1158015614335573d6000803e3d6000fd5b50506001909b019a50613f369950505050505050505050565b80820382811115611288576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116143de5760405162461bcd60e51b8152600401808060200182810382526023815260200180614b5a6023913960400191505060405180910390fd5b6000831180156143ee5750600082115b6144295760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b8261443a858463ffffffff61498216565b8161444157fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561449e5760405162461bcd60e51b8152600401808060200182810382526023815260200180614bc96023913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144be5782846144c1565b83835b90925090506001600160a01b038216614521576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a205a45524f5f4144445245535300000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156145a257600080fd5b505afa1580156145b6573d6000803e3d6000fd5b505050506040513d60208110156145cc57600080fd5b50516001600160a01b0316141561467f57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561465257600080fd5b505af1158015614666573d6000803e3d6000fd5b505050506040513d602081101561467c57600080fd5b50505b6000806146ad7f00000000000000000000000000000000000000000000000000000000000000008b8b61483c565b915091508160001480156146bf575080155b156146cf5787935086925061478f565b60006146dc89848461439e565b905087811161472f57858110156147245760405162461bcd60e51b8152600401808060200182810382526026815260200180614b7d6026913960400191505060405180910390fd5b88945092508261478d565b600061473c89848661439e565b90508981111561474857fe5b878110156147875760405162461bcd60e51b8152600401808060200182810382526026815260200180614b346026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6001600160a01b0381166147e15760405162461bcd60e51b8152600401808060200182810382526026815260200180614a5e6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600061484b858561444a565b50905060008061485c8888886136cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561489457600080fd5b505afa1580156148a8573d6000803e3d6000fd5b505050506040513d60608110156148be57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146148f15780826148f4565b81815b90999098509650505050505050565b60006149108484846136cd565b6001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561494857600080fd5b505afa15801561495c573d6000803e3d6000fd5b505050506040513d602081101561497257600080fd5b505163ffffffff16949350505050565b600081158061499d5750508082028282828161499a57fe5b04145b611288576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611288576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4d6565726b61744c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644d6565726b61745632526f757465723a20494e56414c49445f504154480000004d6565726b61745632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544d6565726b61745632526f757465723a20494e53554646494349454e545f415f414d4f554e544d6565726b61744c6962726172793a20494e53554646494349454e545f414d4f554e544d6565726b61745632526f757465723a20494e53554646494349454e545f425f414d4f554e544d6565726b61744c6962726172793a20494e53554646494349454e545f4c49515549444954594d6565726b61744c6962726172793a204944454e544943414c5f4144445245535345534d6565726b61745632526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c65644d6565726b61744c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544d6565726b61745632526f757465723a20455850495245440000000000000000a2646970667358221220a77e665997a36c71e166715a9e2a7bb9a1f2feff12650ece608a36d0823d697464736f6c63430006060033000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f40000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f40000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0xd590cc180601aecd6eeadd9b7f2b7611519544f4
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f4
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

20701:18997:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21232:10;-1:-1:-1;;;;;21246:4:0;21232:18;;21225:26;;;;20701:18997;;12:1:-1;9;2:12;25480:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25480:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;25480:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32767:846;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32767:846:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32767:846:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32767:846:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32767:846: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;32767:846:0;;-1:-1:-1;32767:846:0;-1:-1:-1;;;;;;32767:846: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;32767:846:0;;;;;;;;;;;;;;;;;39444:251;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39444:251:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;39444:251:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39444:251:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39444:251: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;39444:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39444:251:0;;-1:-1:-1;39444:251:0;;-1:-1:-1;;;;;39444:251:0:i;26159:673::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26159:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26159:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19729:104::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19729:104:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19729:104:0;-1:-1:-1;;;;;19729:104:0;;:::i;:::-;;;;;;;;;;;;;;;;;;30000:624;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30000:624:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30000:624:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30000:624:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30000:624: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;30000:624:0;;-1:-1:-1;30000:624:0;-1:-1:-1;;;;;;30000:624:0;;;;;;;;:::i;31937:824::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31937:824:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31937:824:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31937:824:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31937:824: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;31937:824:0;;-1:-1:-1;31937:824:0;-1:-1:-1;;;;;;31937:824:0;;;;;;;;:::i;38604:283::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38604:283:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;38604:283:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38895:282;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38895:282:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;38895:282:0;;;;;;;;;;;;;;;;;:::i;28288:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28288:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28288:714:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35953:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35953:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35953:712:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35953:712:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35953:712: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;35953:712:0;;-1:-1:-1;35953:712:0;-1:-1:-1;;;;;;35953:712:0;;;;;;;;:::i;19841:140::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19841:140:0;;;:::i;37525:841::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37525:841:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37525:841:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;37525:841:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37525:841: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;37525:841:0;;-1:-1:-1;37525:841:0;-1:-1:-1;;;;;;37525:841:0;;;;;;;;:::i;31238:693::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31238:693:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31238:693:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31238:693: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;31238:693:0;;-1:-1:-1;31238:693:0;-1:-1:-1;;;;;;31238:693:0;;;;;;;;:::i;30630:602::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30630:602:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30630:602:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30630:602:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30630:602: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;30630:602:0;;-1:-1:-1;30630:602:0;-1:-1:-1;;;;;;30630:602:0;;;;;;;;:::i;19642:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19642:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;19642:79:0;;;;;;;;;;;;;;20887:37;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20887:37:0;;;:::i;20842:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20842:38:0;;;:::i;38410:186::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38410:186:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38410:186:0;;;;;;;;;;;;:::i;27582:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27582:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27582:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36671:848::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36671:848:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36671:848:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36671:848: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;36671:848:0;;-1:-1:-1;36671:848:0;-1:-1:-1;;;;;;36671:848:0;;;;;;;;:::i;24617:857::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24617:857:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24617:857:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20794:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20794:41:0;;;:::i;39185:251::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39185:251:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;39185:251:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39185:251:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39185:251: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;39185:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39185:251:0;;-1:-1:-1;39185:251:0;;-1:-1:-1;;;;;39185:251:0:i;26838:665::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26838:665:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26838:665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22864:734::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22864:734:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22864:734:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20226:109;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20226:109:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20226:109:0;-1:-1:-1;;;;;20226:109:0;;:::i;23604:970::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23604:970:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33619:806::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33619:806:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33619:806:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33619:806: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;33619:806:0;;-1:-1:-1;33619:806:0;-1:-1:-1;;;;;;33619:806:0;;;;;;;;:::i;21322:116::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21322:116:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21322:116:0;-1:-1:-1;;;;;21322:116:0;;:::i;25480:673::-;25717:16;25735:14;25698:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;25789:196:::1;25819:5;25839:4;25858:9;25882:14;25911:12;25946:4;25966:8;25789:15;:196::i;:::-;25762:223:::0;;-1:-1:-1;25762:223:0;-1:-1:-1;25996:51:0::1;26024:5:::0;26031:2;25762:223;25996:27:::1;:51::i;:::-;26064:4;-1:-1:-1::0;;;;;26058:20:0::1;;26079:9;26058:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26058:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26058:31:0;;;;26100:45;26131:2;26135:9;26100:30;:45::i;:::-;25480:673:::0;;;;;;;;;;:::o;32767:846::-;32981:21;32953:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33053:4:0::1;33028:29;:4:::0;;-1:-1:-1;;33033:15:0;;33028:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33028:21:0::1;-1:-1:-1::0;;;;;33028:29:0::1;;33020:71;;;::::0;;-1:-1:-1;;;33020:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33020:71:0;;;;;;;;;;;;;::::1;;33112:53;33141:7;33150:8;33160:4;;33112:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33112:28:0::1;::::0;-1:-1:-1;;;33112:53:0:i:1;:::-;33102:63;;33215:12;33184:7;33209:1;33192:7;:14;:18;33184:27;;;;;;;;;;;;;;:43;;33176:99;;;;-1:-1:-1::0;;;33176:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33286:139;33332:4;;33337:1;33332:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33332:7:0::1;33341:10;33353:49;33376:7;33385:4;;33390:1;33385:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33385:7:0::1;33394:4;;33399:1;33394:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33394:7:0::1;33353:22;:49::i;:::-;33404:7;33412:1;33404:10;;;;;;;;;;;;;;33286:31;:139::i;:::-;33436:35;33442:7;33451:4;;33436:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33465:4:0::1;::::0;-1:-1:-1;33436:5:0::1;::::0;-1:-1:-1;;33436:35:0:i:1;:::-;33488:4;-1:-1:-1::0;;;;;33482:20:0::1;;33503:7;33528:1;33511:7;:14;:18;33503:27;;;;;;;;;;;;;;33482:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33482:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33482:49:0;;;;33542:63;33573:2;33577:7;33602:1;33585:7;:14;:18;33577:27;;;;;;;;;;;;;;33542:30;:63::i;:::-;32767:846:::0;;;;;;;;;:::o;39444:251::-;39588:21;39634:53;39662:7;39671:9;39682:4;39634:27;:53::i;:::-;39627:60;;39444:251;;;;;:::o;26159:673::-;26465:12;26479;26504;26519:47;26542:7;26551:6;26559;26519:22;:47::i;:::-;26504:62;;26577:10;26590;:33;;26614:9;26590:33;;;-1:-1:-1;;26590:33:0;26634:78;;;-1:-1:-1;;;26634:78:0;;26660:10;26634:78;;;;26680:4;26634:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:46;;-1:-1:-1;;;;;;26634:25:0;;;;;:78;;;;;-1:-1:-1;;26634:78:0;;;;;;;;-1:-1:-1;26634:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;26634:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26634:78:0;;;;26744:80;26760:6;26768;26776:9;26787:10;26799;26811:2;26815:8;26744:15;:80::i;:::-;26723:101;;;;;;;;26159:673;;;;;;;;;;;;;;;;:::o;19729:104::-;19784:4;19819:6;-1:-1:-1;;;;;19819:6:0;;;19808:17;;;;19729:104::o;30000:624::-;30224:21;30205:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;30268:53:::1;30297:7;30306:8;30316:4;;30268:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30268:28:0::1;::::0;-1:-1:-1;;;30268:53:0:i:1;:::-;30258:63;;30371:12;30340:7;30365:1;30348:7;:14;:18;30340:27;;;;;;;;;;;;;;:43;;30332:99;;;;-1:-1:-1::0;;;30332:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30442:139;30488:4;;30493:1;30488:7;;;;;;30442:139;30592:24;30598:7;30607:4;;30592:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30613:2:0;;-1:-1:-1;30592:5:0::1;::::0;-1:-1:-1;;30592:24:0:i:1;31937:824::-:0;32151:21;32123:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32223:4:0::1;32198:29;:4:::0;;-1:-1:-1;;32203:15:0;;32198:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32198:21:0::1;-1:-1:-1::0;;;;;32198:29:0::1;;32190:71;;;::::0;;-1:-1:-1;;;32190:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32190:71:0;;;;;;;;;;;;;::::1;;32282:53;32310:7;32319:9;32330:4;;32282:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32282:27:0::1;::::0;-1:-1:-1;;;32282:53:0:i:1;:::-;32272:63;;32368:11;32354:7;32362:1;32354:10;;;;;;;;;;;;;;:25;;32346:77;;;;-1:-1:-1::0;;;32346:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38604:283:::0;38771:14;38810:69;38838:8;38848:9;38859:10;38871:7;38810:27;:69::i;:::-;38803:76;38604:283;-1:-1:-1;;;;;38604:283:0:o;38895:282::-;39062:13;39100:69;39127:9;39138;39149:10;39161:7;39100:26;:69::i;28288:714::-;28606:14;28633:12;28648:44;28671:7;28680:5;28687:4;28648:22;:44::i;:::-;28633:59;;28703:10;28716;:33;;28740:9;28716:33;;;-1:-1:-1;;28716:33:0;28760:78;;;-1:-1:-1;;;28760:78:0;;28786:10;28760:78;;;;28806:4;28760:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28703:46;;-1:-1:-1;;;;;;28760:25:0;;;;;:78;;;;;-1:-1:-1;;28760:78:0;;;;;;;;-1:-1:-1;28760:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;28760:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28760:78:0;;;;28861:133;28923:5;28930:9;28941:14;28957:12;28971:2;28975:8;28861:47;:133::i;:::-;28849:145;28288:714;-1:-1:-1;;;;;;;;;;;;;28288:714:0:o;35953:712::-;36187:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;36208:137:::1;36254:4;;36259:1;36254:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36254:7:0::1;36263:10;36275:49;36298:7;36307:4;;36312:1;36307:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36307:7:0::1;36316:4;;36321:1;36316:7;;;;;;36275:49;36326:8;36208:31;:137::i;:::-;36356:18;36384:4:::0;;-1:-1:-1;;36389:15:0;;36384:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36384:21:0::1;-1:-1:-1::0;;;;;36377:39:0::1;;36417:2;36377:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36377:43:0::1;-1:-1:-1::0;;;;;36377:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36377:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36377:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36377:43:0;36431:44:::1;::::0;;36377:43:::1;36431:44:::0;;::::1;::::0;;;;;;;;;;;36377:43;;-1:-1:-1;36431:44:0::1;::::0;;;36466:4;;;;;;36431:44;::::1;::::0;36466:4;;36431:44;36466:4;36431:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36472:2:0;;-1:-1:-1;36431:34:0::1;::::0;-1:-1:-1;;36431:44:0:i:1;:::-;36574:12:::0;36508:62:::1;36556:13:::0;36515:4;;-1:-1:-1;;36520:15:0;;36515:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36515:21:0::1;-1:-1:-1::0;;;;;36508:39:0::1;;36548:2;36508:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36508:43:0::1;-1:-1:-1::0;;;;;36508:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36508:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36508:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36508:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;36486:171;;;;-1:-1:-1::0;;;36486:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21050:1;35953:712:::0;;;;;;;:::o;19841:140::-;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19940:1:::1;19924:6:::0;;19903:40:::1;::::0;-1:-1:-1;;;;;19924:6:0;;::::1;::::0;19903:40:::1;::::0;19940:1;;19903:40:::1;19971:1;19954:19:::0;;-1:-1:-1;;;;;;19954:19:0::1;::::0;;19841:140::o;37525:841::-;37792:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37851:4:0::1;37826:29;:4:::0;;-1:-1:-1;;37831:15:0;;37826:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37826:21:0::1;-1:-1:-1::0;;;;;37826:29:0::1;;37818:71;;;::::0;;-1:-1:-1;;;37818:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37818:71:0;;;;;;;;;;;;;::::1;;37900:137;37946:4;;37951:1;37946:7;;;;;;37900:137;38048:55;38083:4;;38048:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38097:4:0::1;::::0;-1:-1:-1;38048:34:0::1;::::0;-1:-1:-1;;38048:55:0:i:1;:::-;38131:37;::::0;;-1:-1:-1;;;38131:37:0;;38162:4:::1;38131:37;::::0;::::1;::::0;;;38114:14:::1;::::0;-1:-1:-1;;;;;38138:4:0::1;38131:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;38131:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38131:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38131:37:0;;-1:-1:-1;38187:25:0;;::::1;;38179:81;;;;-1:-1:-1::0;;;38179:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38277:4;-1:-1:-1::0;;;;;38271:20:0::1;;38292:9;38271:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38271:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38271:31:0;;;;38313:45;38344:2;38348:9;38313:30;:45::i;31238:693::-:0;31454:21;31426:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;31512:4:::1;-1:-1:-1::0;;;;;31501:15:0::1;:4;;31506:1;31501:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31501:7:0::1;-1:-1:-1::0;;;;;31501:15:0::1;;31493:57;;;::::0;;-1:-1:-1;;;31493:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31493:57:0;;;;;;;;;;;;;::::1;;31571:54;31600:7;31609:9;31620:4;;31571:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31571:28:0::1;::::0;-1:-1:-1;;;31571:54:0:i:1;:::-;31561:64;;31675:12;31644:7;31669:1;31652:7;:14;:18;31644:27;;;;;;;;;;;;;;:43;;31636:99;;;;-1:-1:-1::0;;;31636:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31752:4;-1:-1:-1::0;;;;;31746:19:0::1;;31773:7;31781:1;31773:10;;;;;;;;;;;;;;31746:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31746:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31746:40:0;;;;;31810:4;-1:-1:-1::0;;;;;31804:20:0::1;;31825:49;31848:7;31857:4;;31862:1;31857:7;;;;;;31825:49;31876:7;31884:1;31876:10;;;;;;;;;;;;;;31804:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31804:83:0::1;-1:-1:-1::0;;;;;31804:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31804:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31804:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31804:83:0;31797:91:::1;;;;31899:24;31905:7;31914:4;;31899:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31920:2:0;;-1:-1:-1;31899:5:0::1;::::0;-1:-1:-1;;31899:24:0:i:1;:::-;31238:693:::0;;;;;;;;:::o;30630:602::-;30854:21;30835:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;30898:53:::1;30926:7;30935:9;30946:4;;30898:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30898:27:0::1;::::0;-1:-1:-1;;;30898:53:0:i:1;:::-;30888:63;;30984:11;30970:7;30978:1;30970:10;;;;;;;;;;;;;;:25;;30962:77;;;;-1:-1:-1::0;;;30962:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19642:79:::0;19680:7;19707:6;-1:-1:-1;;;;;19707:6:0;19642:79;:::o;20887:37::-;;;-1:-1:-1;;;;;20887:37:0;;:::o;20842:38::-;;;:::o;38410:186::-;38507:12;38539:49;38560:7;38569:8;38579;38539:20;:49::i;:::-;38532:56;38410:186;-1:-1:-1;;;;38410:186:0:o;27582:700::-;27848:14;27829:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;27891:196:::1;27921:5;27941:4;27960:9;27984:14;28013:12;28048:4;28068:8;27891:15;:196::i;:::-;28137:38;::::0;;-1:-1:-1;;;28137:38:0;;28169:4:::1;28137:38;::::0;::::1;::::0;;;27875:212;;-1:-1:-1;28098:78:0::1;::::0;-1:-1:-1;28126:5:0;;28133:2;;-1:-1:-1;;;;;28137: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;28137:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28137:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28137:38:0;28098:27:::1;:78::i;:::-;28193:4;-1:-1:-1::0;;;;;28187:20:0::1;;28208:9;28187:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28187:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28187:31:0;;;;28229:45;28260:2;28264:9;28229:30;:45::i;36671:848::-:0;36931:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;36976:4:::1;-1:-1:-1::0;;;;;36965:15:0::1;:4;;36970:1;36965:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36965:7:0::1;-1:-1:-1::0;;;;;36965:15:0::1;;36957:57;;;::::0;;-1:-1:-1;;;36957:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36957:57:0;;;;;;;;;;;;;::::1;;37025:13;37041:9;37025:25;;37067:4;-1:-1:-1::0;;;;;37061:19:0::1;;37088:8;37061:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37061:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37061:38:0;;;;;37123:4;-1:-1:-1::0;;;;;37117:20:0::1;;37138:49;37161:7;37170:4;;37175:1;37170:7;;;;;;37138:49;37189:8;37117:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;37117:81:0::1;-1:-1:-1::0;;;;;37117:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37117:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37117:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37117:81:0;37110:89:::1;;;;37210:18;37238:4:::0;;-1:-1:-1;;37243:15:0;;37238:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37238:21:0::1;-1:-1:-1::0;;;;;37231:39:0::1;;37271:2;37231:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37231:43:0::1;-1:-1:-1::0;;;;;37231:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37231:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37231:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37231:43:0;37285:44:::1;::::0;;37231:43:::1;37285:44:::0;;::::1;::::0;;;;;;;;;;;37231:43;;-1:-1:-1;37285:44:0::1;::::0;;;37320:4;;;;;;37285:44;::::1;::::0;37320:4;;37285:44;37320:4;37285:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37326:2:0;;-1:-1:-1;37285:34:0::1;::::0;-1:-1:-1;;37285:44:0:i:1;:::-;37428:12:::0;37362:62:::1;37410:13:::0;37369:4;;-1:-1:-1;;37374:15:0;;37369:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37369:21:0::1;-1:-1:-1::0;;;;;37362:39:0::1;;37402:2;37362:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37362:43:0::1;-1:-1:-1::0;;;;;37362:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;24617:857:0::0;24871:12;24885;24852:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;24910:12:::1;24925:47;24948:7;24957:6;24965;24925:22;:47::i;:::-;24983:60;::::0;;-1:-1:-1;;;24983:60:0;;25015:10:::1;24983:60;::::0;::::1;::::0;-1:-1:-1;;;;;24983:31:0;::::1;:60:::0;;;;;;;;;;;;;;24910:62;;-1:-1:-1;24983:31:0;;::::1;::::0;:60;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;24983:31:0;:60;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24983:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24983:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;25111:27:0::1;::::0;;-1:-1:-1;;;25111:27:0;;-1:-1:-1;;;;;25111:27:0;;::::1;;::::0;::::1;::::0;;;25081:12:::1;::::0;;;25111:23;;::::1;::::0;::::1;::::0;:27;;;;;;;;;;;25081:12;25111:23;:27;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25111:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25111:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25111:27:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;25111:27:0;-1:-1:-1;25150:14:0::1;25169:41;25195:6:::0;25203;25169:25:::1;:41::i;:::-;25149:61;;;25252:6;-1:-1:-1::0;;;;;25242:16:0::1;:6;-1:-1:-1::0;;;;;25242:16:0::1;;:58;;25283:7;25292;25242:58;;;25262:7;25271;25242:58;25221:79:::0;;-1:-1:-1;25221:79:0;-1:-1:-1;25319:21:0;;::::1;;25311:72;;;;-1:-1:-1::0;;;25311:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25413:10;25402:7;:21;;25394:72;;;;-1:-1:-1::0;;;25394:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21050:1;;;;24617:857:::0;;;;;;;;;;;:::o;20794:41::-;;;:::o;39185:251::-;39329:21;39375:53;39404:7;39413:8;39423:4;39375:28;:53::i;26838:665::-;27127:16;27145:14;27172:12;27187:44;27210:7;27219:5;27226:4;27187:22;:44::i;:::-;27172:59;;27242:10;27255;:33;;27279:9;27255:33;;;-1:-1:-1;;27255:33:0;27299:78;;;-1:-1:-1;;;27299:78:0;;27325:10;27299:78;;;;27345:4;27299:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27242:46;;-1:-1:-1;;;;;;27299:25:0;;;;;:78;;;;;-1:-1:-1;;27299:78:0;;;;;;;;-1:-1:-1;27299:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;27299:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27299:78:0;;;;27415:80;27434:5;27441:9;27452:14;27468:12;27482:2;27486:8;27415:18;:80::i;:::-;27388:107;;;;-1:-1:-1;26838:665:0;-1:-1:-1;;;;;;;;;;;;;26838:665:0:o;22864:734::-;23152:12;23166;23180:14;23133:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;23228:85:::1;23242:6;23250;23258:14;23274;23290:10;23302;23228:13;:85::i;:::-;23207:106:::0;;-1:-1:-1;23207:106:0;-1:-1:-1;23324:12:0::1;23339:47;23362:7;23371:6:::0;23379;23339:22:::1;:47::i;:::-;23324:62;;23397:66;23429:6;23437:10;23449:4;23455:7;23397:31;:66::i;:::-;23474;23506:6;23514:10;23526:4;23532:7;23474:31;:66::i;:::-;23576:4;-1:-1:-1::0;;;;;23563:23:0::1;;23587:2;23563:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;23563:27:0::1;-1:-1:-1::0;;;;;23563:27:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23563:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23563:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23563:27:0;22864:734;;;;-1:-1:-1;23563:27:0;;-1:-1:-1;22864:734:0;;-1:-1:-1;;;;;;;;;22864:734:0:o;20226:109::-;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20299:28:::1;20318:8;20299:18;:28::i;:::-;20226:109:::0;:::o;23604:970::-;23857:16;23875:14;23891;23838:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;23945:176:::1;23973:5;23993:4;24012:18;24045:9;24069:14;24098:12;23945:13;:176::i;:::-;23918:203:::0;;-1:-1:-1;23918:203:0;-1:-1:-1;24132:12:0::1;24147:44;24170:7;24179:5:::0;24186:4:::1;24147:22;:44::i;:::-;24132:59;;24202:69;24234:5;24241:10;24253:4;24259:11;24202:31;:69::i;:::-;24288:4;-1:-1:-1::0;;;;;24282:19:0::1;;24309:9;24282:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24282:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24282:39:0;;;;;24345:4;-1:-1:-1::0;;;;;24339:20:0::1;;24360:4;24366:9;24339:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;24339:37:0::1;-1:-1:-1::0;;;;;24339:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24339:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24339:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24339:37:0;24332:45:::1;;;;24413:4;-1:-1:-1::0;;;;;24400:23:0::1;;24424:2;24400:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;24400:27:0::1;-1:-1:-1::0;;;;;24400:27:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24400:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24400:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24400:27:0;;-1:-1:-1;24478:9:0::1;:21:::0;-1:-1:-1;24474:92:0::1;;;24501:65;24532:10;24556:9;24544;:21;24501:30;:65::i;:::-;21050:1;23604:970:::0;;;;;;;;;;;:::o;33619:806::-;33832:21;33804:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;33890:4:::1;-1:-1:-1::0;;;;;33879:15:0::1;:4;;33884:1;33879:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33879:7:0::1;-1:-1:-1::0;;;;;33879:15:0::1;;33871:57;;;::::0;;-1:-1:-1;;;33871:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33871:57:0;;;;;;;;;;;;;::::1;;33949:53;33977:7;33986:9;33997:4;;33949:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33949:27:0::1;::::0;-1:-1:-1;;;33949:53:0:i:1;:::-;33939:63;;34035:9;34021:7;34029:1;34021:10;;;;;;;;;;;;;;:23;;34013:75;;;;-1:-1:-1::0;;;34013:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34105:4;-1:-1:-1::0;;;;;34099:19:0::1;;34126:7;34134:1;34126:10;;;;;;;;;;;;;;34099:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34099:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34099:40:0;;;;;34163:4;-1:-1:-1::0;;;;;34157:20:0::1;;34178:49;34201:7;34210:4;;34215:1;34210:7;;;;;;34178:49;34229:7;34237:1;34229:10;;;;;;;;;;;;;;34157:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;34157:83:0::1;-1:-1:-1::0;;;;;34157:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34157:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34157:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34157:83:0;34150:91:::1;;;;34252:24;34258:7;34267:4;;34252:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34273:2:0;;-1:-1:-1;34252:5:0::1;::::0;-1:-1:-1;;34252:24:0:i:1;:::-;34339:7;34347:1;34339:10;;;;;;;;;;;;;;34327:9;:22;34323:94;;;34351:66;34382:10;34406:7;34414:1;34406:10;;;;;;;;;;;;;;34394:9;:22;34351:30;:66::i;21322:116::-:0;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21400:13:::1;:30:::0;;-1:-1:-1;;;;;;21400:30:0::1;-1:-1:-1::0;;;;;21400:30:0;;;::::1;::::0;;;::::1;::::0;;21322:116::o;721:449::-;953:45;;;-1:-1:-1;;;;;953:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;953:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;942:57:0;;;;907:12;;921:17;;942:10;;;;953:45;942:57;;;25:18:-1;942: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;;;942: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;;906:93:0;;;;1032:7;:57;;;;-1:-1:-1;1044:11:0;;:16;;:44;;;1075:4;1064:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1064:24:0;1044:44;1010:152;;;;-1:-1:-1;;;1010:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;721:449;;;;;:::o;1684:217::-;1797:12;;;1757;1797;;;;;;;;;-1:-1:-1;;;;;1775:7:0;;;1790:5;;1775:35;;;;;;;;;;;;;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;;;1775:35: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;;1756:54:0;;;1829:7;1821:72;;;;-1:-1:-1;;;1821:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1684:217;;;:::o;13749:552::-;13850:21;13907:1;13892:4;:11;:16;;13884:57;;;;;-1:-1:-1;;;13884:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13973:4;:11;13962:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13962:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13962:23:0;;13952:33;;14009:8;13996:7;14004:1;13996:10;;;;;;;;;;;;;:21;;;;;14033:6;14028:266;14059:1;14045:4;:11;:15;14041:1;:19;14028:266;;;14083:14;14099:15;14118:42;14130:7;14139:4;14144:1;14139:7;;;;;;;;;;;;;;14148:4;14153:1;14157;14153:5;14148:11;;;;;;;;;;;;;;14118;:42::i;:::-;14082:78;;;;14192:90;14205:7;14213:1;14205:10;;;;;;;;;;;;;;14217:9;14228:10;14240:41;14251:7;14260:4;14265:1;14260:7;;;;;;;;;;;;;;14269:4;14274:1;14278;14274:5;14269:11;;;;;;;;;;;;;;14240:10;:41::i;:::-;14192:12;:90::i;:::-;14175:7;14183:1;14187;14183:5;14175:14;;;;;;;;;;;;;;;;;:107;-1:-1:-1;;14062:3:0;;14028:266;;;;13749:552;;;;;:::o;10817:478::-;10906:12;10932:14;10948;10966:26;10977:6;10985;10966:10;:26::i;:::-;11130:32;;;-1:-1:-1;;11130:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11130:32:0;;;;;11120:43;;;;;;-1:-1:-1;;;;;;11033:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11033:251:0;;;;;;;11023:262;;;;;;;;;10817:478;-1:-1:-1;;;;;10817:478:0:o;1178:498::-;1449:51;;;-1:-1:-1;;;;;1449:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1449:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1438:63:0;;;;1403:12;;1417:17;;1438:10;;;;1449:51;1438:63;;;25:18:-1;1438: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;;;1438: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;;1402:99:0;;;;1534:7;:57;;;;-1:-1:-1;1546:11:0;;:16;;:44;;;1577:4;1566:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1566:24:0;1546:44;1512:156;;;;-1:-1:-1;;;1512:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1178:498;;;;;;:::o;29113:881::-;29220:6;29215:772;29246:1;29232:4;:11;:15;29228:1;:19;29215:772;;;29270:13;29285:14;29304:4;29309:1;29304:7;;;;;;;;;;;;;;29313:4;29318:1;29322;29318:5;29313:11;;;;;;;;;;;;;;29269:56;;;;29341:14;29360:40;29386:5;29393:6;29360:25;:40::i;:::-;29340:60;;;29415:14;29432:7;29440:1;29444;29440:5;29432:14;;;;;;;;;;;;;;29415:31;;29462:15;29479;29507:6;-1:-1:-1;;;;;29498:15:0;:5;-1:-1:-1;;;;;29498:15:0;;:61;;29540:9;29556:1;29498:61;;;29522:1;29526:9;29498:61;29578:13;;29461:98;;-1:-1:-1;29461:98:0;-1:-1:-1;;;;;;29578:13:0;:27;29574:140;;29641:13;;29626:72;;;-1:-1:-1;;;29626:72:0;;29661:10;29626:72;;;;-1:-1:-1;;;;;29626:72:0;;;;;;;;;;;;;;;;;;;;;;29641:13;;;;;29626:34;;:72;;;;;;;;;;;;;;29641:13;;29626:72;;;2:2:-1;;;;27:1;24;17:12;2:2;29626:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29626:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;29574:140:0;29728:10;29759:1;29745:4;:11;:15;29741:1;:19;:80;;29818:3;29741:80;;;29763:52;29786:7;29795:6;29803:4;29808:1;29812;29808:5;29803:11;;;;;;;;;;;;;;29763:22;:52::i;:::-;29728:93;;29849:46;29872:7;29881:5;29888:6;29849:22;:46::i;:::-;-1:-1:-1;;;;;29836:65:0;;29920:10;29932;29944:2;29958:1;29948:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;29948:12:0;87:42:-1;143:17;;-1:-1;29948:12:0;;29836:139;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29836:139:0;-1:-1:-1;;;;;29836:139: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;29836:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29836:139:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29249:3:0;;;;;-1:-1:-1;29215:772:0;;-1:-1:-1;;;;;;;;29215:772:0;;;29113:881;;;:::o;14382:573::-;14483:21;14540:1;14525:4;:11;:16;;14517:57;;;;;-1:-1:-1;;;14517:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14606:4;:11;14595:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14595:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14595:23:0;;14585:33;;14659:9;14629:7;14654:1;14637:7;:14;:18;14629:27;;;;;;;;;;;;;;;;;:39;14693:11;;-1:-1:-1;;14693:15:0;14679:269;14710:5;;14679:269;;14738:14;14754:15;14773:42;14785:7;14794:4;14803:1;14799;:5;14794:11;;;;;;;;;;;;;;14807:4;14812:1;14807:7;;;;;;;14773:42;14737:78;;;;14847:89;14859:7;14867:1;14859:10;;;;;;;;;;;;;;14871:9;14882:10;14894:41;14905:7;14914:4;14923:1;14919;:5;14914:11;;;;;;;;;;;;;;14927:4;14932:1;14927:7;;;;;;;14894:41;14847:11;:89::i;:::-;14830:7;14842:1;14838;:5;14830:14;;;;;;;;;;;;;;;;;:106;-1:-1:-1;;;;14717:3:0;14679:269;;12493:549;12600:14;12646:1;12635:8;:12;12627:66;;;;-1:-1:-1;;;12627:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:1;12712:9;:13;:31;;;;;12742:1;12729:10;:14;12712:31;12704:82;;;;-1:-1:-1;;;12704:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12797:20;12820:38;12833:24;12838:5;12849:7;12833:24;:15;:24;:::i;:::-;12820:8;;:38;:12;:38;:::i;:::-;12797:61;-1:-1:-1;12869:14:0;12886:31;12797:61;12906:10;12886:31;:19;:31;:::i;:::-;12869:48;-1:-1:-1;12928:16:0;12947:41;12972:15;12947:20;:9;12961:5;12947:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;12928:60;;13023:11;13011:9;:23;;;;;;;12493:549;-1:-1:-1;;;;;;;;12493:549:0:o;13163:504::-;13270:13;13316:1;13304:9;:13;13296:68;;;;-1:-1:-1;;;13296:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13395:1;13383:9;:13;:31;;;;;13413:1;13400:10;:14;13383:31;13375:82;;;;-1:-1:-1;;;13375:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13468:14;13485:35;13514:5;13485:24;:9;13499;13485:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13468:52;-1:-1:-1;13531:16:0;13550:55;13580:24;13585:5;13596:7;13580:24;:15;:24;:::i;:::-;13550:25;:10;13565:9;13550:25;:14;:25;:::i;:55::-;13531:74;;13627:32;13657:1;13640:11;13628:9;:23;;;;;;;13627:32;:29;:32;:::i;:::-;13616:43;13163:504;-1:-1:-1;;;;;;;13163:504:0:o;34572:1375::-;34685:6;34680:1260;34711:1;34697:4;:11;:15;34693:1;:19;34680:1260;;;34735:13;34750:14;34769:4;34774:1;34769:7;;;;;;;;;;;;;;34778:4;34783:1;34787;34783:5;34778:11;;;;;;;;;;;;;;34734:56;;;;34806:14;34825:40;34851:5;34858:6;34825:25;:40::i;:::-;34805:60;;;34880:17;34913:46;34936:7;34945:5;34952:6;34913:22;:46::i;:::-;34880:80;;34975:16;35006:17;35094:13;35109;35127:4;-1:-1:-1;;;;;35127:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35127:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35127:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35127:18:0;;;;;;;-1:-1:-1;;;;;35093:52:0;;;;-1:-1:-1;35093:52:0;;-1:-1:-1;35161:17:0;;-1:-1:-1;;;;;35202:15:0;;;;;;;:61;;35244:8;35254;35202:61;;;35221:8;35231;35202:61;35160:103;;;;35292:56;35335:12;35299:5;-1:-1:-1;;;;;35292:23:0;;35324:4;35292:38;;;;;;;;;;;;;-1:-1:-1;;;;;35292:38:0;-1:-1:-1;;;;;35292:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;35292:56:0;35278:70;;35378:85;35406:11;35419:12;35433:13;35448:4;-1:-1:-1;;;;;35448:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35448:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35448:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35448:14:0;35378:85;;:27;:85::i;:::-;35497:13;;35363:100;;-1:-1:-1;;;;;;35497:13:0;:27;;-1:-1:-1;35493:143:0;;-1:-1:-1;;;35493:143:0;35560:13;;35545:75;;;-1:-1:-1;;;35545:75:0;;35580:10;35545:75;;;;-1:-1:-1;;;;;35545:75:0;;;;;;;;;;;;;;;;;;;;;;35560:13;;;;;35545:34;;:75;;;;;;;;;;;;;;35560:13;;35545:75;;;2:2:-1;;;;27:1;24;17:12;2:2;35545:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35545:75:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;35493:143:0;35651:15;35668;35696:6;-1:-1:-1;;;;;35687:15:0;:5;-1:-1:-1;;;;;35687:15:0;;:67;;35732:12;35751:1;35687:67;;;35711:1;35715:12;35687:67;35650:104;;;;35769:10;35800:1;35786:4;:11;:15;35782:1;:19;:80;;35859:3;35782:80;;;35804:52;35827:7;35836:6;35844:4;35849:1;35853;35849:5;35844:11;;;;;;;35804:52;35915:12;;;35925:1;35915:12;;;;;;;;;;-1:-1:-1;;;35877:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35877:51:0;;;;;;;;;;;;;;;;;;;;;;35769:93;;-1:-1:-1;35877:9:0;;;;;;35887:10;;35899;;35769:93;;35915:12;;35877:51;;;;;;;;35915:12;;35877:51;;;;35915: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;35877:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35877:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34714:3:0;;;;;-1:-1:-1;34680:1260:0;;-1:-1:-1;;;;;;;;;;34680:1260:0;9849:129;9933:5;;;9928:16;;;;9920:50;;;;;-1:-1:-1;;;9920:50:0;;;;;;;;;;;;-1:-1:-1;;;9920:50:0;;;;;;;;;;;;;;12054:317;12136:12;12179:1;12169:7;:11;12161:59;;;;-1:-1:-1;;;12161:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12250:1;12239:8;:12;:28;;;;;12266:1;12255:8;:12;12239:28;12231:79;;;;-1:-1:-1;;;12231:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12355:8;12331:21;:7;12343:8;12331:21;:11;:21;:::i;:::-;:32;;;;;;;12054:317;-1:-1:-1;;;;12054:317:0:o;10380:345::-;10455:14;10471;10516:6;-1:-1:-1;;;;;10506:16:0;:6;-1:-1:-1;;;;;10506:16:0;;;10498:64;;;;-1:-1:-1;;;10498:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10601:6;-1:-1:-1;;;;;10592:15:0;:6;-1:-1:-1;;;;;10592:15:0;;:53;;10630:6;10638;10592:53;;;10611:6;10619;10592:53;10573:72;;-1:-1:-1;10573:72:0;-1:-1:-1;;;;;;10664:20:0;;10656:61;;;;;-1:-1:-1;;;10656:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10380:345;;;;;:::o;21478:1380::-;21791:48;;;-1:-1:-1;;;21791:48:0;;-1:-1:-1;;;;;21791:48:0;;;;;;;;;;;;;;;;21696:12;;;;;;21807:7;21791:32;;;;;;:48;;;;;;;;;;;;;;;:32;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;21791:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21791:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21791:48:0;-1:-1:-1;;;;;21791:62:0;;21787:146;;;21870:51;;;-1:-1:-1;;;21870:51:0;;-1:-1:-1;;;;;21870:51:0;;;;;;;;;;;;;;;;21886:7;21870:35;;;;;;:51;;;;;;;;;;;;;;;-1:-1:-1;21870:35:0;:51;;;2:2:-1;;;;27:1;24;17:12;2:2;21870:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21870:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21787:146:0;21944:13;21959;21976:51;22003:7;22012:6;22020;21976:26;:51::i;:::-;21943:84;;;;22042:8;22054:1;22042:13;:30;;;;-1:-1:-1;22059:13:0;;22042:30;22038:813;;;22111:14;;-1:-1:-1;22127:14:0;;-1:-1:-1;22038:813:0;;;22175:19;22197:56;22218:14;22234:8;22244;22197:20;:56::i;:::-;22175:78;;22290:14;22272;:32;22268:572;;22351:10;22333:14;:28;;22325:79;;;;-1:-1:-1;;;22325:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22445:14;;-1:-1:-1;22461:14:0;-1:-1:-1;22461:14:0;22268:572;;;22517:19;22539:56;22560:14;22576:8;22586;22539:20;:56::i;:::-;22517:78;;22639:14;22621;:32;;22614:40;;;;22699:10;22681:14;:28;;22673:79;;;;-1:-1:-1;;;22673:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22793:14;-1:-1:-1;22809:14:0;;-1:-1:-1;22268:572:0;22038:813;;21478:1380;;;;;;;;;;;:::o;19989:229::-;-1:-1:-1;;;;;20063:22:0;;20055:73;;;;-1:-1:-1;;;20055:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20165:6;;;20144:38;;-1:-1:-1;;;;;20144:38:0;;;;20165:6;;;20144:38;;;20193:6;:17;;-1:-1:-1;;;;;;20193:17:0;-1:-1:-1;;;;;20193:17:0;;;;;;;;;;19989:229::o;11552:389::-;11645:13;11660;11687:14;11706:26;11717:6;11725;11706:10;:26::i;:::-;11686:46;;;11744:13;11759;11790:32;11798:7;11807:6;11815;11790:7;:32::i;:::-;-1:-1:-1;;;;;11777:58:0;;:60;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11777:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11777:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11777:60:0;;;;;;;-1:-1:-1;;;;;11743:94:0;;;;-1:-1:-1;11743:94:0;;-1:-1:-1;;;;;;11871:16:0;;;;;;;:62;;11914:8;11924;11871:62;;;11891:8;11901;11871:62;11848:85;;;;-1:-1:-1;11552:389:0;-1:-1:-1;;;;;;;11552:389:0:o;11303:191::-;11395:12;11443:32;11451:7;11460:6;11468;11443:7;:32::i;:::-;-1:-1:-1;;;;;11430:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11430:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11430:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11430:56:0;11420:66;;;11303:191;-1:-1:-1;;;;11303:191:0:o;9986:142::-;10038:6;10065;;;:30;;-1:-1:-1;;10080:5:0;;;10094:1;10089;10080:5;10089:1;10075:15;;;;;:20;10065:30;10057:63;;;;;-1:-1:-1;;;10057:63:0;;;;;;;;;;;;-1:-1:-1;;;10057:63:0;;;;;;;;;;;;;;9713:128;9797:5;;;9792:16;;;;9784:49;;;;;-1:-1:-1;;;9784:49:0;;;;;;;;;;;;-1:-1:-1;;;9784:49:0;;;;;;;;;;;;;

Swarm Source

ipfs://a77e665997a36c71e166715a9e2a7bb9a1f2feff12650ece608a36d0823d6974
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.