Contract 0x24cefa86fc1826fd31b4cb911034907735f8085a

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x8dd2f80bee302b93a9e59c3c1e5f058e7216c03c014c503f1f35a7a6b03bdfc283901922021-06-18 0:59:2853 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00103612
0x53272bb64d31d17bef5b1cdc6ce4fe6ea82b64f841c8a52a0515f8ed3edec4ce83813372021-06-17 17:32:548 hrs 20 mins ago0xe3e673baa94e12dafa8ec20b531b25449ace0ba3 IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067321
0xcb5815751d9481961ecb691965bb5b64ac9abc334694a0ab9a132491f1f43d2583776202021-06-17 14:25:5111 hrs 27 mins ago0x886f9ab1b54d9ebaf7031d930b8c653b18b59688 IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00077604
0x101d22ca9676641103cd1598c99a4ca8751fb602ef60cad746c6a31113222a7083757212021-06-17 12:49:4613 hrs 3 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.001058005
0xddf8ec8d48de2d0c88bdbb79e4e612b9562d96351d622715ef7fe39d84e4c48e83757032021-06-17 12:48:5213 hrs 4 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000673455
0x2fd6c5c87ba926a79c7dc0307246d1bc50fafe887a5896d1b77e67d06197df2883756942021-06-17 12:48:2513 hrs 4 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00097714
0x1757c4ea659d26f0ed2d5a4e50309ceb4a296733f77964edca2ff0039d42baf283716052021-06-17 9:20:3416 hrs 32 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000673475
0xd1ab94e3b1ca2494ffcb72717da116179c0044cce0a6e146cf81711b08d4850683715872021-06-17 9:19:3216 hrs 33 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000673475
0x87703da97e6ee8ef0499f0a2dddb08a4f330dc6d3f93f918c7417bd34f2bb78783715742021-06-17 9:18:5116 hrs 34 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000673475
0x15f4413eb2bafae9a02c177ca4284f233b6a449dd3d345f5da1ad24f3f3f4bf383715612021-06-17 9:18:0816 hrs 35 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000673475
0xa50369a34431c044c56780120dad713c0674d0dff15bed063c9cca1bbffd62f083715222021-06-17 9:15:5816 hrs 37 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0.3 BNB0.000600475
0xa7fe5f16b0810eae43befc0c5f3bf564f6fb7aa1e432b634c32da46d0757922f83715012021-06-17 9:14:5416 hrs 38 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0.3 BNB0.000600475
0x46c079ae51482ccbccf4b34909f97b25cef4c02fffb2345cb0d583b10f68d71483714752021-06-17 9:13:3616 hrs 39 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0.3 BNB0.000600475
0xa512ad4cb082a97ddd83bf4edd228397e362019aac3a9f1493e264cec088fa6a83714532021-06-17 9:12:3016 hrs 40 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0.3 BNB0.000600475
0x6ae357159b2769c12381952ea71c2c47850ab5143c5739d0fdfa9d2962b8f74983714352021-06-17 9:11:3616 hrs 41 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0.3 BNB0.000600475
0xe1df66e15e09e5f0d266418157cea5cc3ed8b1e73a8919f809cd7850c560f28783714072021-06-17 9:10:1216 hrs 43 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.000929615
0xcf98fb0f746ece4371ca3f1358da2fc501be8fa7c019a3c9f82f9f75f630e64983712392021-06-17 9:01:4616 hrs 51 mins ago0x7ceb9f4a9e215c34979707eb73306ba7e93e333a IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00085883
0x7b16c4dd9d68631a03796c79da89f70c8b603c3bd27781f48926a64bb8e91c8183658502021-06-17 4:29:1021 hrs 24 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.001058125
0xbde3473d1999c8e256fe95759880b0670e16238a2f943e607754346bf75610fe83654652021-06-17 4:09:5521 hrs 43 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067325
0x175eeaaf3a7e554a6c30313a231da324773a0be0739febd3c99beec01c182ac483649562021-06-17 3:44:2822 hrs 8 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067325
0x482515071547b158fb7b01e2fcf4eca571c450d93f27b57295da8ea75bdcecf983648172021-06-17 3:37:3122 hrs 15 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067325
0x2e229f9c5d20dafa87b58b1f63ec9f2a5b241ba397756e488010982ea52e15c683647612021-06-17 3:34:4322 hrs 18 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067325
0x11d2466d20c9ffebdbfa4af3618662bdd650888c89004c4a87194a4d5c4f245483647132021-06-17 3:32:1922 hrs 20 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00067325
0xf39c77402eee819c9e9d66c37f914b1c41118abc7c4767c8b3d0d39bddb8fc8a83631172021-06-17 2:12:1223 hrs 41 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.001058125
0xea9046727200485983cc55e27c9ecca8d2ff2be4fb779ee580850c05283baf7f83629882021-06-17 2:05:4523 hrs 47 mins ago0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b IN  0x24cefa86fc1826fd31b4cb911034907735f8085a0 BNB0.00097738
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8dd2f80bee302b93a9e59c3c1e5f058e7216c03c014c503f1f35a7a6b03bdfc283901922021-06-18 0:59:2853 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x4a65c34f84cd6f3bfb7c7cf032f35efaf9cc8a4b5.397940046185988792 BNB
0x8dd2f80bee302b93a9e59c3c1e5f058e7216c03c014c503f1f35a7a6b03bdfc283901922021-06-18 0:59:2853 mins ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a5.397940046185988792 BNB
0xcb5815751d9481961ecb691965bb5b64ac9abc334694a0ab9a132491f1f43d2583776202021-06-17 14:25:5111 hrs 27 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x886f9ab1b54d9ebaf7031d930b8c653b18b596880.026832106015256907 BNB
0xcb5815751d9481961ecb691965bb5b64ac9abc334694a0ab9a132491f1f43d2583776202021-06-17 14:25:5111 hrs 27 mins ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.026832106015256907 BNB
0xa50369a34431c044c56780120dad713c0674d0dff15bed063c9cca1bbffd62f083715222021-06-17 9:15:5816 hrs 37 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.3 BNB
0xa7fe5f16b0810eae43befc0c5f3bf564f6fb7aa1e432b634c32da46d0757922f83715012021-06-17 9:14:5416 hrs 38 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.3 BNB
0x46c079ae51482ccbccf4b34909f97b25cef4c02fffb2345cb0d583b10f68d71483714752021-06-17 9:13:3616 hrs 39 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.3 BNB
0xa512ad4cb082a97ddd83bf4edd228397e362019aac3a9f1493e264cec088fa6a83714532021-06-17 9:12:3016 hrs 40 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.3 BNB
0x6ae357159b2769c12381952ea71c2c47850ab5143c5739d0fdfa9d2962b8f74983714352021-06-17 9:11:3616 hrs 41 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.3 BNB
0xe1df66e15e09e5f0d266418157cea5cc3ed8b1e73a8919f809cd7850c560f28783714072021-06-17 9:10:1216 hrs 43 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x7ceb9f4a9e215c34979707eb73306ba7e93e333a1.32529374261524286 BNB
0xe1df66e15e09e5f0d266418157cea5cc3ed8b1e73a8919f809cd7850c560f28783714072021-06-17 9:10:1216 hrs 43 mins ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a1.32529374261524286 BNB
0xcf98fb0f746ece4371ca3f1358da2fc501be8fa7c019a3c9f82f9f75f630e64983712392021-06-17 9:01:4616 hrs 51 mins ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x7ceb9f4a9e215c34979707eb73306ba7e93e333a0.365235143192435457 BNB
0xcf98fb0f746ece4371ca3f1358da2fc501be8fa7c019a3c9f82f9f75f630e64983712392021-06-17 9:01:4616 hrs 51 mins ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.365235143192435457 BNB
0xde6b694f917998a5a33fba500ad26a796f955efd6d729f40c2261f5d001b2d3483503622021-06-16 15:31:121 day 10 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a 0xc864684ccfa89c505f5cf4f29a0374579c1bea8c0.001532599414697925 BNB
0xde6b694f917998a5a33fba500ad26a796f955efd6d729f40c2261f5d001b2d3483503622021-06-16 15:31:121 day 10 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.766299707348962761 BNB
0xde6b694f917998a5a33fba500ad26a796f955efd6d729f40c2261f5d001b2d3483503622021-06-16 15:31:121 day 10 hrs ago 0xc864684ccfa89c505f5cf4f29a0374579c1bea8c 0x24cefa86fc1826fd31b4cb911034907735f8085a0.767832306763660686 BNB
0x3bfa75a295d591ac33b324b85565bf6e6541b0ae65172480ecd47b6f566a73c683482762021-06-16 13:46:101 day 12 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x01153a1c7087010607ff859ba77e8735846cc7950.100875599106447871 BNB
0x3bfa75a295d591ac33b324b85565bf6e6541b0ae65172480ecd47b6f566a73c683482762021-06-16 13:46:101 day 12 hrs ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.100875599106447871 BNB
0x34c86b51f188586e99896dde8279619b906f908ad714ef931b4b3efe45c1874f83420652021-06-16 8:33:491 day 17 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a Binance: WBNB Token0.179445868740416345 BNB
0xc481d94eac178d0984e753447a05dc013babc36720e44d8a9c4675cd44df927b83420522021-06-16 8:33:101 day 17 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x7ceb9f4a9e215c34979707eb73306ba7e93e333a0.423120513985746932 BNB
0xc481d94eac178d0984e753447a05dc013babc36720e44d8a9c4675cd44df927b83420522021-06-16 8:33:101 day 17 hrs ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.423120513985746932 BNB
0x039a9b9c93272449a20e4bc209ae61de81c5f0f5f4a8d609b1608f4652bb469883420032021-06-16 8:30:431 day 17 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0x7ceb9f4a9e215c34979707eb73306ba7e93e333a0.188090006466414586 BNB
0x039a9b9c93272449a20e4bc209ae61de81c5f0f5f4a8d609b1608f4652bb469883420032021-06-16 8:30:431 day 17 hrs ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.188090006466414586 BNB
0x5078b0db0101e7565b06dd0a1fb39e6d80a62548567ce2653dfce362f6af239483349492021-06-16 2:34:321 day 23 hrs ago 0x24cefa86fc1826fd31b4cb911034907735f8085a0xd457903c4b8388c3ca2c6b5fc746876975654d3e0.035146490767104673 BNB
0x5078b0db0101e7565b06dd0a1fb39e6d80a62548567ce2653dfce362f6af239483349492021-06-16 2:34:321 day 23 hrs ago Binance: WBNB Token 0x24cefa86fc1826fd31b4cb911034907735f8085a0.035146490767104673 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-02-26
*/

// File: @sashimiswap/core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

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

// File: contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

// File: contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function vault() external pure returns (address);
    function owner() external pure returns (address);
    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;
    function changeOwner(
        address vaultAddress
    ) external;
    function setVault(
        address vaultAddress
    ) external;
    function take(
        address token, 
        uint amount
    ) external;
    function getTokenInPair(address pair, address token) external view returns (uint balance);    
}

// File: @sashimiswap/core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address, address) external;
}

// File: contracts/libraries/SafeMath.sol

pragma solidity >=0.6.6;

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

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

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

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

// File: contracts/libraries/UniswapV2Library.sol

pragma solidity >=0.5.0;



library UniswapV2Library {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'b7b88947a6a423e784cb5512eccdfee6426797f5f681f521bc1687e844ef15be' // init code hash
            ))));
    }

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

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

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

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

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

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

// File: contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

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

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

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts/interfaces/ISashimiInvestment.sol

pragma solidity >=0.5.0;

interface ISashimiInvestment {
    function withdraw(address token, uint256 amount) external;
    function withdrawWithReBalance(address token, uint256 amount) external;
}

// File: contracts/UniswapV2Router02.sol

pragma solidity >=0.6.6;









contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMath for uint;

    address public immutable override factory;
    address public immutable override WETH;
    address public override vault;
    address public override owner;
    mapping(address => mapping(address => uint)) private _pools;

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

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        owner = msg.sender;
        WETH = _WETH;
    }

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

    function _transferOut(address pair, address token, uint amount, address to) internal returns (bool success){
        require(_pools[pair][token] >= amount, 'TransferHelper: TRANSFER_OUT_FAILED');
        _pools[pair][token] = _pools[pair][token].sub(amount);
        if(to != address(this)){
            uint balance = IERC20(token).balanceOf(address(this));
            if(balance < amount){
                ISashimiInvestment(vault).withdrawWithReBalance(token, amount.sub(balance));
            }
            TransferHelper.safeTransfer(token, to, amount);
        }
        return true;
    }
    function _safeTransfer(address token, address to, uint amount) internal {
        uint balance = IERC20(token).balanceOf(address(this));
        if(balance < amount){
            ISashimiInvestment(vault).withdrawWithReBalance(token, amount.sub(balance));
        }
        TransferHelper.safeTransfer(token, to, amount);
    }
    function _transferETH(address to, uint amount) internal {
        uint balance = IERC20(WETH).balanceOf(address(this));
        if(balance < amount){
            ISashimiInvestment(vault).withdrawWithReBalance(WETH, amount.sub(balance));
        }
        IWETH(WETH).withdraw(amount);
        TransferHelper.safeTransferETH(to, amount);
    }

    function _transferIn(address from,address pair, address token, uint amount) internal {
        uint beforeBalance = IERC20(token).balanceOf(address(this));
        TransferHelper.safeTransferFrom(token, from, address(this), amount);
        _pools[pair][token] = _pools[pair][token].add(IERC20(token).balanceOf(address(this))).sub(beforeBalance);
    }
    function _transferInETH(address pair, uint amount) internal {
        _pools[pair][WETH] = _pools[pair][WETH].add(amount);
        IWETH(WETH).deposit{value: amount}();
    }

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

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

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint beforeBalance = getTokenInPair(pair,token);
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, beforeBalance.sub(getTokenInPair(pair,token)));
        _transferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            //address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            address to = i < path.length - 2 ? address(this) : _to;
            address pair = UniswapV2Library.pairFor(factory, input, output);
            _transferOut(pair, output, amountOut, to);
            if(i < path.length - 2){
                address nextPair = UniswapV2Library.pairFor(factory, output, path[i + 2]);
                _pools[nextPair][output]=_pools[nextPair][output].add(amountOut);
            }
            IUniswapV2Pair(pair).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _transferIn(msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),path[0],amounts[0]);
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        _transferIn(msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),path[0],amounts[0]);
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
         _transferInETH(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);
        //assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        _transferIn(msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),path[0],amounts[0]);
        _swap(amounts, path, address(this));
        _transferETH(to,amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _transferIn(msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),path[0],amounts[0]);
        _swap(amounts, path, address(this));
        _transferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        _transferInETH(UniswapV2Library.pairFor(factory, path[0], path[1]),amounts[0]);
        //assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = getTokenInPair(address(pair),input).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? address(this) : _to;
            _transferOut(address(pair), output, amountOutput, to);
            if(i < path.length - 2){
                address nextPair = UniswapV2Library.pairFor(factory, output, path[i + 2]);
                _pools[nextPair][output]=_pools[nextPair][output].add(amountOutput);
            }
            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) {
        _transferIn(msg.sender,UniswapV2Library.pairFor(factory, path[0], path[1]),path[0],amountIn);
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;        
        _transferInETH(UniswapV2Library.pairFor(factory, path[0], path[1]),amountIn);
        //assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        address pair = UniswapV2Library.pairFor(factory, path[0], path[1]);
        _transferIn(msg.sender,pair,path[0],amountIn);
        uint balanceBefore = getTokenInPair(pair,WETH);
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint balanceAfter = getTokenInPair(pair,WETH);
        uint amountOut = balanceBefore.sub(balanceAfter);
        require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _transferETH(to, amountOut);
    }

    function changeOwner(
        address _owner
    ) 
    external
    override
    {
        require(msg.sender == owner,'UniswapV2Router: FORBIDDEN');
        owner = _owner;
    }

    function setVault(
        address vaultAddress
    ) 
        external
        override
    {
        require(msg.sender == owner,'UniswapV2Router: FORBIDDEN');
        vault = vaultAddress;
    }

    function take(address token, uint amount) 
        external
        virtual
        override
    {
        require(msg.sender == vault,'UniswapV2Router: FORBIDDEN');
        TransferHelper.safeTransfer(token, vault, amount);
    }

    function getTokenInPair(address pair,address token) 
        public
        view
        virtual
        override
        returns (uint balance)
    {
        return _pools[pair][token];
    }
    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getTokenInPair","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"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":[{"internalType":"address","name":"vaultAddress","type":"address"}],"name":"setVault","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":[{"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":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"take","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162004bde38038062004bde8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052600180546001600160a01b03191633179055911b1660a05260805160601c60a05160601c614a516200018d600039806101e15280610e6a5280610f1e528061145652806116345280611a8c5280611b975280611c035280611cd5528061204552806120e3528061211d52806121c552806126b2528061291c52806129725280612a955280612da95280612e5d5280612ee75280613ca05280613cf1525080610fac5280611066528061116d52806111a652806112e1528061139b52806114e4528061161252806117655280611b1c5280611d685280611e215280611f0852806120c1528061225c528061242552806126375280612660528061269052806127fd52806129505280612b285280612bde528061347952806134c152806139535280613aa552806141c05280614279528061432c5250614a516000f3fe6080604052600436106101d15760003560e01c80638803dbee116100f7578063baa2abde11610095578063e8e3370011610064578063e8e3370014610cbe578063f305d71914610d3e578063fb3bdb4114610d84578063fbfa77cf14610e085761020a565b8063baa2abde14610b24578063c45a015514610b81578063d06ca61f14610b96578063ded9382a14610c4b5761020a565b8063ad5c4648116100d1578063ad5c464814610a02578063ad615dec14610a17578063af2979eb14610a4d578063b6f9de9514610aa05761020a565b80638803dbee146109085780638da5cb5b1461099e578063a6f9dae1146109cf5761020a565b8063521802081161016f5780636f7abe6a1161013e5780636f7abe6a1461077d578063791ac947146107b85780637ff36ab51461084e57806385f8c259146108d25761020a565b806352180208146106085780635b0d5984146106415780635c11d795146106b45780636817031b1461074a5761020a565b80631f00ca74116101ab5780631f00ca74146103a95780632195995c1461045e57806338ed1739146104dc5780634a25d94a146105725761020a565b806302751cec1461020f578063054d50d41461027b57806318cbafe5146102c35761020a565b3661020a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020857fe5b005b600080fd5b34801561021b57600080fd5b50610262600480360360c081101561023257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610e1d565b6040805192835260208301919091528051918290030190f35b34801561028757600080fd5b506102b16004803603606081101561029e57600080fd5b5080359060208101359060400135610eb9565b60408051918252519081900360200190f35b3480156102cf57600080fd5b50610359600480360360a08110156102e657600080fd5b813591602081013591810190606081016040820135600160201b81111561030c57600080fd5b82018360208201111561031e57600080fd5b803590602001918460208302840111600160201b8311171561033f57600080fd5b91935091506001600160a01b038135169060200135610ece565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561039557818101518382015260200161037d565b505050509050019250505060405180910390f35b3480156103b557600080fd5b50610359600480360360408110156103cc57600080fd5b81359190810190604081016020820135600160201b8111156103ed57600080fd5b8201836020820111156103ff57600080fd5b803590602001918460208302840111600160201b8311171561042057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611166945050505050565b34801561046a57600080fd5b50610262600480360361016081101561048257600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561119c565b3480156104e857600080fd5b50610359600480360360a08110156104ff57600080fd5b813591602081013591810190606081016040820135600160201b81111561052557600080fd5b82018360208201111561053757600080fd5b803590602001918460208302840111600160201b8311171561055857600080fd5b91935091506001600160a01b038135169060200135611296565b34801561057e57600080fd5b50610359600480360360a081101561059557600080fd5b813591602081013591810190606081016040820135600160201b8111156105bb57600080fd5b8201836020820111156105cd57600080fd5b803590602001918460208302840111600160201b831117156105ee57600080fd5b91935091506001600160a01b038135169060200135611406565b34801561061457600080fd5b506102086004803603604081101561062b57600080fd5b506001600160a01b038135169060200135611592565b34801561064d57600080fd5b506102b1600480360361014081101561066557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561160a565b3480156106c057600080fd5b50610208600480360360a08110156106d757600080fd5b813591602081013591810190606081016040820135600160201b8111156106fd57600080fd5b82018360208201111561070f57600080fd5b803590602001918460208302840111600160201b8311171561073057600080fd5b91935091506001600160a01b038135169060200135611718565b34801561075657600080fd5b506102086004803603602081101561076d57600080fd5b50356001600160a01b0316611995565b34801561078957600080fd5b506102b1600480360360408110156107a057600080fd5b506001600160a01b0381358116916020013516611a13565b3480156107c457600080fd5b50610208600480360360a08110156107db57600080fd5b813591602081013591810190606081016040820135600160201b81111561080157600080fd5b82018360208201111561081357600080fd5b803590602001918460208302840111600160201b8311171561083457600080fd5b91935091506001600160a01b038135169060200135611a3e565b6103596004803603608081101561086457600080fd5b81359190810190604081016020820135600160201b81111561088557600080fd5b82018360208201111561089757600080fd5b803590602001918460208302840111600160201b831117156108b857600080fd5b91935091506001600160a01b038135169060200135611c8d565b3480156108de57600080fd5b506102b1600480360360608110156108f557600080fd5b5080359060208101359060400135611eb0565b34801561091457600080fd5b50610359600480360360a081101561092b57600080fd5b813591602081013591810190606081016040820135600160201b81111561095157600080fd5b82018360208201111561096357600080fd5b803590602001918460208302840111600160201b8311171561098457600080fd5b91935091506001600160a01b038135169060200135611ebd565b3480156109aa57600080fd5b506109b3611fb6565b604080516001600160a01b039092168252519081900360200190f35b3480156109db57600080fd5b50610208600480360360208110156109f257600080fd5b50356001600160a01b0316611fc5565b348015610a0e57600080fd5b506109b3612043565b348015610a2357600080fd5b506102b160048036036060811015610a3a57600080fd5b5080359060208101359060400135612067565b348015610a5957600080fd5b506102b1600480360360c0811015610a7057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612074565b61020860048036036080811015610ab657600080fd5b81359190810190604081016020820135600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b91935091506001600160a01b03813516906020013561217f565b348015610b3057600080fd5b50610262600480360360e0811015610b4757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356123d7565b348015610b8d57600080fd5b506109b3612635565b348015610ba257600080fd5b5061035960048036036040811015610bb957600080fd5b81359190810190604081016020820135600160201b811115610bda57600080fd5b820183602082011115610bec57600080fd5b803590602001918460208302840111600160201b83111715610c0d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612659945050505050565b348015610c5757600080fd5b506102626004803603610140811015610c6f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612686565b348015610cca57600080fd5b50610d206004803603610100811015610ce257600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561279a565b60408051938452602084019290925282820152519081900360600190f35b610d20600480360360c0811015610d5457600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356128cd565b61035960048036036080811015610d9a57600080fd5b81359190810190604081016020820135600160201b811115610dbb57600080fd5b820183602082011115610dcd57600080fd5b803590602001918460208302840111600160201b83111715610dee57600080fd5b91935091506001600160a01b038135169060200135612a4d565b348015610e1457600080fd5b506109b3612c85565b6000808242811015610e64576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b610e93897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6123d7565b9093509150610ea3898685612c94565b610ead8583612da5565b50965096945050505050565b6000610ec6848484612f72565b949350505050565b60608142811015610f14576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610f4e57fe5b905060200201356001600160a01b03166001600160a01b031614610fa7576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b6110057f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304a92505050565b9150868260018451038151811061101857fe5b6020026020010151101561105d5760405162461bcd60e51b815260040180806020018281038252602b815260200180614982602b913960400191505060405180910390fd5b6110fb336110c47f00000000000000000000000000000000000000000000000000000000000000008989600081811061109257fe5b905060200201356001600160a01b03168a8a60018181106110af57fe5b905060200201356001600160a01b0316613196565b888860008181106110d157fe5b905060200201356001600160a01b0316856000815181106110ee57fe5b6020026020010151613256565b61113a828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506133c4915050565b61115b848360018551038151811061114e57fe5b6020026020010151612da5565b509695505050505050565b60606111937f0000000000000000000000000000000000000000000000000000000000000000848461365a565b90505b92915050565b60008060006111cc7f00000000000000000000000000000000000000000000000000000000000000008f8f613196565b90506000876111db578c6111df565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561125557600080fd5b505af1158015611269573d6000803e3d6000fd5b5050505061127c8f8f8f8f8f8f8f6123d7565b809450819550505050509b509b9950505050505050505050565b606081428110156112dc576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b61133a7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304a92505050565b9150868260018451038151811061134d57fe5b602002602001015110156113925760405162461bcd60e51b815260040180806020018281038252602b815260200180614982602b913960400191505060405180910390fd5b6113c7336110c47f00000000000000000000000000000000000000000000000000000000000000008989600081811061109257fe5b61115b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506133c4915050565b6060814281101561144c576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061148657fe5b905060200201356001600160a01b03166001600160a01b0316146114df576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b61153d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061365a92505050565b9150868260008151811061154d57fe5b6020026020010151111561105d5760405162461bcd60e51b81526004018080602001828103825260278152602001806148f26027913960400191505060405180910390fd5b6000546001600160a01b031633146115ee576040805162461bcd60e51b815260206004820152601a6024820152792ab734b9bbb0b82b192937baba32b91d102327a92124a22222a760311b604482015290519081900360640190fd5b6000546116069083906001600160a01b031683613792565b5050565b6000806116587f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613196565b9050600086611667578b61166b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505050506117078d8d8d8d8d8d612074565b9d9c50505050505050505050505050565b804281101561175c576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6117d1336117ae7f00000000000000000000000000000000000000000000000000000000000000008888600081811061179157fe5b905060200201356001600160a01b0316898960018181106110af57fe5b878760008181106117bb57fe5b905060200201356001600160a01b03168a613256565b6000858560001981018181106117e357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561183f57600080fd5b505afa158015611853573d6000803e3d6000fd5b505050506040513d602081101561186957600080fd5b505160408051602088810282810182019093528882529293506118ab9290918991899182918501908490808284376000920191909152508892506138fc915050565b8661194e82888860001981018181106118c057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561191c57600080fd5b505afa158015611930573d6000803e3d6000fd5b505050506040513d602081101561194657600080fd5b505190613c32565b101561198b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614982602b913960400191505060405180910390fd5b5050505050505050565b6001546001600160a01b031633146119f1576040805162461bcd60e51b815260206004820152601a6024820152792ab734b9bbb0b82b192937baba32b91d102327a92124a22222a760311b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b8042811015611a82576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611abc57fe5b905060200201356001600160a01b03166001600160a01b031614611b15576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b6000611b657f000000000000000000000000000000000000000000000000000000000000000087876000818110611b4857fe5b905060200201356001600160a01b0316888860018181106110af57fe5b9050611b8f338288886000818110611b7957fe5b905060200201356001600160a01b03168b613256565b6000611bbb827f0000000000000000000000000000000000000000000000000000000000000000611a13565b9050611bfb8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506138fc915050565b6000611c27837f0000000000000000000000000000000000000000000000000000000000000000611a13565b90506000611c358383613c32565b905089811015611c765760405162461bcd60e51b815260040180806020018281038252602b815260200180614982602b913960400191505060405180910390fd5b611c808782612da5565b5050505050505050505050565b60608142811015611cd3576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611d0a57fe5b905060200201356001600160a01b03166001600160a01b031614611d63576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b611dc17f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061304a92505050565b91508682600184510381518110611dd457fe5b60200260200101511015611e195760405162461bcd60e51b815260040180806020018281038252602b815260200180614982602b913960400191505060405180910390fd5b611e67611e4d7f00000000000000000000000000000000000000000000000000000000000000008888600081811061179157fe5b83600081518110611e5a57fe5b6020026020010151613c82565b611ea6828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506133c4915050565b5095945050505050565b6000610ec6848484613d74565b60608142811015611f03576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b611f617f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061365a92505050565b91508682600081518110611f7157fe5b602002602001015111156113925760405162461bcd60e51b81526004018080602001828103825260278152602001806148f26027913960400191505060405180910390fd5b6001546001600160a01b031681565b6001546001600160a01b03163314612021576040805162461bcd60e51b815260206004820152601a6024820152792ab734b9bbb0b82b192937baba32b91d102327a92124a22222a760311b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610ec6848484613e4c565b600081428110156120ba576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b60006121077f00000000000000000000000000000000000000000000000000000000000000008a7f0000000000000000000000000000000000000000000000000000000000000000613196565b90506000612115828b611a13565b90506121468a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b308b6123d7565b945061216890508a8761216361215c8684611a13565b8590613c32565b612c94565b6121728685612da5565b5050509695505050505050565b80428110156121c3576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121fa57fe5b905060200201356001600160a01b03166001600160a01b031614612253576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b3461228c6122867f0000000000000000000000000000000000000000000000000000000000000000888860008161179157fe5b82613c82565b60008686600019810181811061229e57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d602081101561232457600080fd5b505160408051602089810282810182019093528982529293506123669290918a918a9182918501908490808284376000920191909152508992506138fc915050565b8761194e828989600019810181811061237b57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561191c57600080fd5b600080824281101561241e576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b600061244b7f00000000000000000000000000000000000000000000000000000000000000008c8c613196565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156124a657600080fd5b505af11580156124ba573d6000803e3d6000fd5b505050506040513d60208110156124d057600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561251d57600080fd5b505af1158015612531573d6000803e3d6000fd5b505050506040513d604081101561254757600080fd5b508051602090910151909250905060006125618e8e613ef2565b509050806001600160a01b03168e6001600160a01b031614612584578183612587565b82825b9097509550612598848f898c613fd0565b506125a5848e888c613fd0565b508a8710156125e55760405162461bcd60e51b81526004018080602001828103825260268152602001806149396026913960400191505060405180910390fd5b898610156126245760405162461bcd60e51b815260040180806020018281038252602681526020018061485c6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111937f0000000000000000000000000000000000000000000000000000000000000000848461304a565b60008060006126d67f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613196565b90506000876126e5578c6126e9565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561275f57600080fd5b505af1158015612773573d6000803e3d6000fd5b505050506127858e8e8e8e8e8e610e1d565b909f909e509c50505050505050505050505050565b600080600083428110156127e3576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6127f18c8c8c8c8c8c6141b0565b909450925060006128237f00000000000000000000000000000000000000000000000000000000000000008e8e613196565b905061283133828f88613256565b61283d33828e87613256565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050506040513d60208110156128b657600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612916576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b6129448a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6141b0565b909450925060006129967f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613196565b90506129a433828d88613256565b6129ae8185613c82565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156129fd57600080fd5b505af1158015612a11573d6000803e3d6000fd5b505050506040513d6020811015612a2757600080fd5b5051925034841015612a3f57612a3f33853403614441565b505096509650969350505050565b60608142811015612a93576040805162461bcd60e51b815260206004820152601860248201526000805160206149fc833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612aca57fe5b905060200201356001600160a01b03166001600160a01b031614612b23576040805162461bcd60e51b815260206004820152601d6024820152600080516020614919833981519152604482015290519081900360640190fd5b612b817f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061365a92505050565b91503482600081518110612b9157fe5b60200260200101511115612bd65760405162461bcd60e51b81526004018080602001828103825260278152602001806148f26027913960400191505060405180910390fd5b612c0a611e4d7f00000000000000000000000000000000000000000000000000000000000000008888600081811061179157fe5b612c49828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506133c4915050565b81600081518110612c5657fe5b6020026020010151341115611ea657611ea63383600081518110612c7657fe5b60200260200101513403614441565b6000546001600160a01b031681565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d6020811015612d0d57600080fd5b5051905081811015612d94576000546001600160a01b0316631268754f85612d358585613c32565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612d7b57600080fd5b505af1158015612d8f573d6000803e3d6000fd5b505050505b612d9f848484613792565b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612e1457600080fd5b505afa158015612e28573d6000803e3d6000fd5b505050506040513d6020811015612e3e57600080fd5b5051905081811015612ee5576000546001600160a01b0316631268754f7f0000000000000000000000000000000000000000000000000000000000000000612e868585613c32565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612ecc57600080fd5b505af1158015612ee0573d6000803e3d6000fd5b505050505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f4b57600080fd5b505af1158015612f5f573d6000803e3d6000fd5b50505050612f6d8383614441565b505050565b6000808411612fb25760405162461bcd60e51b815260040180806020018281038252602b8152602001806149d1602b913960400191505060405180910390fd5b600083118015612fc25750600082115b612ffd5760405162461bcd60e51b81526004018080602001828103825260288152602001806148826028913960400191505060405180910390fd5b600061300b856103e5614534565b905060006130198285614534565b905060006130338361302d886103e8614534565b90614597565b905080828161303e57fe5b04979650505050505050565b60606002825110156130a3576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156130bb57600080fd5b506040519080825280602002602001820160405280156130e5578160200160208202803683370190505b50905082816000815181106130f657fe5b60200260200101818152505060005b600183510381101561318e576000806131488786858151811061312457fe5b602002602001015187866001018151811061313b57fe5b60200260200101516145e6565b9150915061316a84848151811061315b57fe5b60200260200101518383612f72565b84846001018151811061317957fe5b60209081029190910101525050600101613105565b509392505050565b60008060006131a58585613ef2565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fb7b88947a6a423e784cb5512eccdfee6426797f5f681f521bc1687e844ef15be609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132a557600080fd5b505afa1580156132b9573d6000803e3d6000fd5b505050506040513d60208110156132cf57600080fd5b505190506132df838630856146ad565b6133918161338b856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561333357600080fd5b505afa158015613347573d6000803e3d6000fd5b505050506040513d602081101561335d57600080fd5b50516001600160a01b038089166000908152600260209081526040808320938b168352929052205490614597565b90613c32565b6001600160a01b039485166000908152600260209081526040808320969097168252949094529390922092909255505050565b60005b6001835103811015612d9f576000808483815181106133e257fe5b60200260200101518584600101815181106133f957fe5b60200260200101519150915060006134118383613ef2565b509050600087856001018151811061342557fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461345357826000613457565b6000835b91509150600060028a5103881061346e5788613470565b305b9050600061349f7f00000000000000000000000000000000000000000000000000000000000000008989613196565b90506134ad81888785613fd0565b5060028b510389101561355a5760006134fd7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106134f057fe5b6020026020010151613196565b6001600160a01b038082166000908152600260209081526040808320938d16835292905220549091506135309087614597565b6001600160a01b039182166000908152600260209081526040808320948c16835293905291909120555b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038681166064850152608060848501908152845160a486018190529187169563022c0d9f958b958b958b9592949093909260c48601928190849084905b838110156135df5781810151838201526020016135c7565b50505050905090810190601f16801561360c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561362e57600080fd5b505af1158015613642573d6000803e3d6000fd5b50506001909a0199506133c798505050505050505050565b60606002825110156136b3576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156136cb57600080fd5b506040519080825280602002602001820160405280156136f5578160200160208202803683370190505b509050828160018351038151811061370957fe5b60209081029190910101528151600019015b801561318e5760008061374b8786600186038151811061373757fe5b602002602001015187868151811061313b57fe5b9150915061376d84848151811061375e57fe5b60200260200101518383613d74565b84600185038151811061377c57fe5b602090810291909101015250506000190161371b565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061380f5780518252601f1990920191602091820191016137f0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b50915091508180156138a45750805115806138a457508080602001905160208110156138a157600080fd5b50515b6138f5576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b60005b6001835103811015612f6d5760008084838151811061391a57fe5b602002602001015185846001018151811061393157fe5b60200260200101519150915060006139498383613ef2565b50905060006139797f00000000000000000000000000000000000000000000000000000000000000008585613196565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156139ba57600080fd5b505afa1580156139ce573d6000803e3d6000fd5b505050506040513d60608110156139e457600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613a1a578284613a1d565b83835b91509150613a2f8261338b898d611a13565b9550613a3c868383612f72565b945050505050600080856001600160a01b0316886001600160a01b031614613a6657826000613a6a565b6000835b91509150600060028c51038a10613a81578a613a83565b305b9050613a9186898684613fd0565b5060028c51038a1015613b31576000613ad47f00000000000000000000000000000000000000000000000000000000000000008a8f8e600201815181106134f057fe5b6001600160a01b038082166000908152600260209081526040808320938e1683529290522054909150613b079086614597565b6001600160a01b039182166000908152600260209081526040808320948d16835293905291909120555b604080516000808252602082019283905263022c0d9f60e01b835260248201868152604483018690526001600160a01b038581166064850152608060848501908152845160a48601819052918c169563022c0d9f958a958a958a9592949093909260c48601928190849084905b83811015613bb6578181015183820152602001613b9e565b50505050905090810190601f168015613be35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c0557600080fd5b505af1158015613c19573d6000803e3d6000fd5b50506001909b019a506138ff9950505050505050505050565b80820382811115611196576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6001600160a01b0380831660009081526002602090815260408083207f000000000000000000000000000000000000000000000000000000000000000090941683529290522054613cd39082614597565b6001600160a01b0380841660009081526002602090815260408083207f000000000000000000000000000000000000000000000000000000000000000090941680845293909152808220939093558251630d0e30db60e41b81529251919263d0e30db092859260048084019391929182900301818588803b158015613d5757600080fd5b505af1158015613d6b573d6000803e3d6000fd5b50505050505050565b6000808411613db45760405162461bcd60e51b815260040180806020018281038252602c81526020018061480b602c913960400191505060405180910390fd5b600083118015613dc45750600082115b613dff5760405162461bcd60e51b81526004018080602001828103825260288152602001806148826028913960400191505060405180910390fd5b6000613e176103e8613e118688614534565b90614534565b90506000613e2b6103e5613e118689613c32565b9050613e426001828481613e3b57fe5b0490614597565b9695505050505050565b6000808411613e8c5760405162461bcd60e51b81526004018080602001828103825260258152602001806148cd6025913960400191505060405180910390fd5b600083118015613e9c5750600082115b613ed75760405162461bcd60e51b81526004018080602001828103825260288152602001806148826028913960400191505060405180910390fd5b82613ee28584614534565b81613ee957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f465760405162461bcd60e51b81526004018080602001828103825260258152602001806148376025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f66578284613f69565b83835b90925090506001600160a01b038216613fc9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6001600160a01b0380851660009081526002602090815260408083209387168352929052908120548311156140365760405162461bcd60e51b81526004018080602001828103825260238152602001806148aa6023913960400191505060405180910390fd5b6001600160a01b038086166000908152600260209081526040808320938816835292905220546140669084613c32565b6001600160a01b0380871660009081526002602090815260408083208985168452909152902091909155821630146141a5576000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156140e757600080fd5b505afa1580156140fb573d6000803e3d6000fd5b505050506040513d602081101561411157600080fd5b5051905083811015614198576000546001600160a01b0316631268754f866141398785613c32565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561417f57600080fd5b505af1158015614193573d6000803e3d6000fd5b505050505b6141a3858486613792565b505b506001949350505050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561423c57600080fd5b505afa158015614250573d6000803e3d6000fd5b505050506040513d602081101561426657600080fd5b50516001600160a01b03161415614324577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156142f757600080fd5b505af115801561430b573d6000803e3d6000fd5b505050506040513d602081101561432157600080fd5b50505b6000806143527f00000000000000000000000000000000000000000000000000000000000000008b8b6145e6565b91509150816000148015614364575080155b1561437457879350869250614434565b6000614381898484613e4c565b90508781116143d457858110156143c95760405162461bcd60e51b815260040180806020018281038252602681526020018061485c6026913960400191505060405180910390fd5b889450925082614432565b60006143e1898486613e4c565b9050898111156143ed57fe5b8781101561442c5760405162461bcd60e51b81526004018080602001828103825260268152602001806149396026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061448d5780518252601f19909201916020918201910161446e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146144ef576040519150601f19603f3d011682016040523d82523d6000602084013e6144f4565b606091505b5050905080612f6d5760405162461bcd60e51b815260040180806020018281038252602381526020018061495f6023913960400191505060405180910390fd5b600081158061454f5750508082028282828161454c57fe5b04145b611196576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611196576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006145f58585613ef2565b509050600080614606888888613196565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561463e57600080fd5b505afa158015614652573d6000803e3d6000fd5b505050506040513d606081101561466857600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461469b57808261469e565b81815b90999098509650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106147325780518252601f199092019160209182019101614713565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614794576040519150601f19603f3d011682016040523d82523d6000602084013e614799565b606091505b50915091508180156147c75750805115806147c757508080602001905160208110156147c457600080fd5b50515b6148025760405162461bcd60e51b81526004018080602001828103825260248152602001806149ad6024913960400191505060405180910390fd5b50505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a205452414e534645525f4f55545f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212205aa77602c4b184fd7720f12d168df9ca70df151e7ad1e6948da1a3d0ec37403264736f6c634300060c00330000000000000000000000001daed74ed1dd7c9dabbe51361ac90a69d851234d000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000001daed74ed1dd7c9dabbe51361ac90a69d851234d000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001daed74ed1dd7c9dabbe51361ac90a69d851234d
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

17071:21804:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17720:10;-1:-1:-1;;;;;17734:4:0;17720:18;;17713:26;;;;17071:21804;;;;;23696:598;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23696:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37819:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37819:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31066:725;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31066:725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31066:725:0;;;;;;;;;;;;-1:-1:-1;31066:725:0;-1:-1:-1;;;;;;31066:725:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38619:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38619:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38619:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38619:253:0;;-1:-1:-1;38619:253:0;;-1:-1:-1;;;;;38619:253:0:i;24300:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24300:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28461:581::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28461:581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28461:581:0;;;;;;;;;;;;-1:-1:-1;28461:581:0;-1:-1:-1;;;;;;28461:581:0;;;;;;;;:::i;30358:702::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30358:702:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30358:702:0;;;;;;;;;;;;-1:-1:-1;30358:702:0;-1:-1:-1;;;;;;30358:702:0;;;;;;;;:::i;37136:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37136:237:0;;;;;;;;:::i;26500:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26500:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34269:667::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34269:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34269:667:0;;;;;;;;;;;;-1:-1:-1;34269:667:0;-1:-1:-1;;;;;;34269:667:0;;;;;;;;:::i;36923:205::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36923:205:0;-1:-1:-1;;;;;36923:205:0;;:::i;37381:200::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37381:200:0;;;;;;;;;;:::i;35846:873::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35846:873:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35846:873:0;;;;;;;;;;;;-1:-1:-1;35846:873:0;-1:-1:-1;;;;;;35846:873:0;;;;;;;;:::i;29613:739::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29613:739:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29613:739:0;;;;;;;;;;;;-1:-1:-1;29613:739:0;-1:-1:-1;;;;;;29613:739:0;;;;;;;;:::i;38089:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38089:261:0;;;;;;;;;;;;:::i;29048:559::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29048:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29048:559:0;;;;;;;;;;;;-1:-1:-1;29048:559:0;-1:-1:-1;;;;;;29048:559:0;;;;;;;;:::i;17288:29::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17288:29:0;;;;;;;;;;;;;;36727:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36727:188:0;-1:-1:-1;;;;;36727:188:0;;:::i;17207:38::-;;;;;;;;;;;;;:::i;37623:188::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37623:188:0;;;;;;;;;;;;:::i;25731:763::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25731:763:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34942:898::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34942:898:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34942:898:0;;;;;;;;;;;;-1:-1:-1;34942:898:0;-1:-1:-1;;;;;;34942:898:0;;;;;;;;:::i;22729:961::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22729:961:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17159:41::-;;;;;;;;;;;;;:::i;38358:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38358:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38358:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38358:253:0;;-1:-1:-1;38358:253:0;;-1:-1:-1;;;;;38358:253:0:i;24983:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24983:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21095:698::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21095:698:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21799:887;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21799:887:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31797:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31797:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31797:850:0;;;;;;;;;;;;-1:-1:-1;31797:850:0;-1:-1:-1;;;;;;31797:850:0;;;;;;;;:::i;17252:29::-;;;;;;;;;;;;;:::i;23696:598::-;23933:16;23951:14;23914:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;24005:196:::1;24035:5;24055:4;24074:9;24098:14;24127:12;24162:4;24182:8;24005:15;:196::i;:::-;23978:223:::0;;-1:-1:-1;23978:223:0;-1:-1:-1;24212:37:0::1;24226:5:::0;24233:2;23978:223;24212:13:::1;:37::i;:::-;24260:26;24273:2;24276:9;24260:12;:26::i;:::-;23696:598:::0;;;;;;;;;;:::o;37819:262::-;37972:14;38011:62;38041:8;38051:9;38062:10;38011:29;:62::i;:::-;38004:69;37819:262;-1:-1:-1;;;;37819:262:0:o;31066:725::-;31280:21;31252:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31352:4:0::1;31327:29;:4:::0;;-1:-1:-1;;31332:15:0;;31327:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31327:21:0::1;-1:-1:-1::0;;;;;31327:29:0::1;;31319:71;;;::::0;;-1:-1:-1;;;31319:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31319:71:0;;;;;;;;;;;;;::::1;;31411:55;31442:7;31451:8;31461:4;;31411:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31411:30:0::1;::::0;-1:-1:-1;;;31411:55:0:i:1;:::-;31401:65;;31516:12;31485:7;31510:1;31493:7;:14;:18;31485:27;;;;;;;;;;;;;;:43;;31477:99;;;;-1:-1:-1::0;;;31477:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31587:94;31599:10;31610:51;31635:7;31644:4;;31649:1;31644:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31644:7:0::1;31653:4;;31658:1;31653:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31653:7:0::1;31610:24;:51::i;:::-;31662:4;;31667:1;31662:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31662:7:0::1;31670;31678:1;31670:10;;;;;;;;;;;;;;31587:11;:94::i;:::-;31692:35;31698:7;31707:4;;31692:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31721:4:0::1;::::0;-1:-1:-1;31692:5:0::1;::::0;-1:-1:-1;;31692:35:0:i:1;:::-;31738:45;31751:2;31755:7;31780:1;31763:7;:14;:18;31755:27;;;;;;;;;;;;;;31738:12;:45::i;:::-;31066:725:::0;;;;;;;;;:::o;38619:253::-;38763:21;38809:55;38839:7;38848:9;38859:4;38809:29;:55::i;:::-;38802:62;;38619:253;;;;;:::o;24300:677::-;24606:12;24620;24645;24660:49;24685:7;24694:6;24702;24660:24;:49::i;:::-;24645:64;;24720:10;24733;:33;;24757:9;24733:33;;;-1:-1:-1;;24733:33:0;24777:80;;;-1:-1:-1;;;24777:80:0;;24805:10;24777:80;;;;24825:4;24777:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24720:46;;-1:-1:-1;;;;;;24777:27:0;;;;;:80;;;;;-1:-1:-1;;24777:80:0;;;;;;;;-1:-1:-1;24777:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24889;24905:6;24913;24921:9;24932:10;24944;24956:2;24960:8;24889:15;:80::i;:::-;24868:101;;;;;;;;24300:677;;;;;;;;;;;;;;;;:::o;28461:581::-;28685:21;28666:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;28729:55:::1;28760:7;28769:8;28779:4;;28729:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28729:30:0::1;::::0;-1:-1:-1;;;28729:55:0:i:1;:::-;28719:65;;28834:12;28803:7;28828:1;28811:7;:14;:18;28803:27;;;;;;;;;;;;;;:43;;28795:99;;;;-1:-1:-1::0;;;28795:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28905:94;28917:10;28928:51;28953:7;28962:4;;28967:1;28962:7;;;;;;28905:94;29010:24;29016:7;29025:4;;29010:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29031:2:0;;-1:-1:-1;29010:5:0::1;::::0;-1:-1:-1;;29010:24:0:i:1;30358:702::-:0;30572:21;30544:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30644:4:0::1;30619:29;:4:::0;;-1:-1:-1;;30624:15:0;;30619:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30619:21:0::1;-1:-1:-1::0;;;;;30619:29:0::1;;30611:71;;;::::0;;-1:-1:-1;;;30611:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;30611:71:0;;;;;;;;;;;;;::::1;;30703:55;30733:7;30742:9;30753:4;;30703:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30703:29:0::1;::::0;-1:-1:-1;;;30703:55:0:i:1;:::-;30693:65;;30791:11;30777:7;30785:1;30777:10;;;;;;;;;;;;;;:25;;30769:77;;;;-1:-1:-1::0;;;30769:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37136:237:::0;37270:5;;-1:-1:-1;;;;;37270:5:0;37256:10;:19;37248:57;;;;;-1:-1:-1;;;37248:57:0;;;;;;;;;;;;-1:-1:-1;;;37248:57:0;;;;;;;;;;;;;;;37351:5;;37316:49;;37344:5;;-1:-1:-1;;;;;37351:5:0;37358:6;37316:27;:49::i;:::-;37136:237;;:::o;26500:718::-;26818:14;26845:12;26860:46;26885:7;26894:5;26901:4;26860:24;:46::i;:::-;26845:61;;26917:10;26930;:33;;26954:9;26930:33;;;-1:-1:-1;;26930:33:0;26974:80;;;-1:-1:-1;;;26974:80:0;;27002:10;26974:80;;;;27022:4;26974:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26917:46;;-1:-1:-1;;;;;;26974:27:0;;;;;:80;;;;;-1:-1:-1;;26974:80:0;;;;;;;;-1:-1:-1;26974:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27077:133;27139:5;27146:9;27157:14;27173:12;27187:2;27191:8;27077:47;:133::i;:::-;27065:145;26500:718;-1:-1:-1;;;;;;;;;;;;;26500:718:0:o;34269:667::-;34503:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;34524:92:::1;34536:10;34547:51;34572:7;34581:4;;34586:1;34581:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34581:7:0::1;34590:4;;34595:1;34590:7;;;;;;34547:51;34599:4;;34604:1;34599:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34599:7:0::1;34607:8;34524:11;:92::i;:::-;34627:18;34655:4:::0;;-1:-1:-1;;34660:15:0;;34655:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34655:21:0::1;-1:-1:-1::0;;;;;34648:39:0::1;;34688:2;34648:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34648:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34648:43:0;34702:44:::1;::::0;;34648:43:::1;34702:44:::0;;::::1;::::0;;;;;;;;;;;34648:43;;-1:-1:-1;34702:44:0::1;::::0;;;34737:4;;;;;;34702:44;::::1;::::0;34737:4;;34702:44;34737:4;34702:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34743:2:0;;-1:-1:-1;34702:34:0::1;::::0;-1:-1:-1;;34702:44:0:i:1;:::-;34845:12:::0;34779:62:::1;34827:13:::0;34786:4;;-1:-1:-1;;34791:15:0;;34786:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34786:21:0::1;-1:-1:-1::0;;;;;34779:39:0::1;;34819:2;34779:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;34779:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34779:43:0;;:47:::1;:62::i;:::-;:78;;34757:171;;;;-1:-1:-1::0;;;34757:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:1;34269:667:::0;;;;;;;:::o;36923:205::-;37054:5;;-1:-1:-1;;;;;37054:5:0;37040:10;:19;37032:57;;;;;-1:-1:-1;;;37032:57:0;;;;;;;;;;;;-1:-1:-1;;;37032:57:0;;;;;;;;;;;;;;;37100:5;:20;;-1:-1:-1;;;;;;37100:20:0;-1:-1:-1;;;;;37100:20:0;;;;;;;;;;36923:205::o;37381:200::-;-1:-1:-1;;;;;37554:12:0;;;37517;37554;;;:6;:12;;;;;;;;:19;;;;;;;;;;;;;37381:200::o;35846:873::-;36113:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36172:4:0::1;36147:29;:4:::0;;-1:-1:-1;;36152:15:0;;36147:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36147:21:0::1;-1:-1:-1::0;;;;;36147:29:0::1;;36139:71;;;::::0;;-1:-1:-1;;;36139:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36139:71:0;;;;;;;;;;;;;::::1;;36221:12;36236:51;36261:7;36270:4;;36275:1;36270:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36270:7:0::1;36279:4;;36284:1;36279:7;;;;;;36236:51;36221:66;;36298:45;36310:10;36321:4;36326;;36331:1;36326:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36326:7:0::1;36334:8;36298:11;:45::i;:::-;36354:18;36375:25;36390:4;36395;36375:14;:25::i;:::-;36354:46;;36411:55;36446:4;;36411:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36460:4:0::1;::::0;-1:-1:-1;36411:34:0::1;::::0;-1:-1:-1;;36411:55:0:i:1;:::-;36477:17;36497:25;36512:4;36517;36497:14;:25::i;:::-;36477:45:::0;-1:-1:-1;36533:14:0::1;36550:31;:13:::0;36477:45;36550:17:::1;:31::i;:::-;36533:48;;36613:12;36600:9;:25;;36592:81;;;;-1:-1:-1::0;;;36592:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36684:27;36697:2;36701:9;36684:12;:27::i;:::-;17509:1;;;;35846:873:::0;;;;;;;:::o;29613:739::-;29829:21;29801:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;29887:4:::1;-1:-1:-1::0;;;;;29876:15:0::1;:4;;29881:1;29876:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29876:7:0::1;-1:-1:-1::0;;;;;29876:15:0::1;;29868:57;;;::::0;;-1:-1:-1;;;29868:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29868:57:0;;;;;;;;;;;;;::::1;;29946:56;29977:7;29986:9;29997:4;;29946:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29946:30:0::1;::::0;-1:-1:-1;;;29946:56:0:i:1;:::-;29936:66;;30052:12;30021:7;30046:1;30029:7;:14;:18;30021:27;;;;;;;;;;;;;;:43;;30013:99;;;;-1:-1:-1::0;;;30013:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30124:79;30139:51;30164:7;30173:4;;30178:1;30173:7;;;;;;30139:51;30192:7;30200:1;30192:10;;;;;;;;;;;;;;30124:14;:79::i;:::-;30320:24;30326:7;30335:4;;30320:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30341:2:0;;-1:-1:-1;30320:5:0::1;::::0;-1:-1:-1;;30320:24:0:i:1;:::-;29613:739:::0;;;;;;;;:::o;38089:261::-;38242:13;38280:62;38309:9;38320;38331:10;38280:28;:62::i;29048:559::-;29272:21;29253:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;29316:55:::1;29346:7;29355:9;29366:4;;29316:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29316:29:0::1;::::0;-1:-1:-1;;;29316:55:0:i:1;:::-;29306:65;;29404:11;29390:7;29398:1;29390:10;;;;;;;;;;;;;;:25;;29382:77;;;;-1:-1:-1::0;;;29382:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17288:29:::0;;;-1:-1:-1;;;;;17288:29:0;;:::o;36727:188::-;36847:5;;-1:-1:-1;;;;;36847:5:0;36833:10;:19;36825:57;;;;;-1:-1:-1;;;36825:57:0;;;;;;;;;;;;-1:-1:-1;;;36825:57:0;;;;;;;;;;;;;;;36893:5;:14;;-1:-1:-1;;;;;;36893:14:0;-1:-1:-1;;;;;36893:14:0;;;;;;;;;;36727:188::o;17207:38::-;;;:::o;37623:188::-;37720:12;37752:51;37775:7;37784:8;37794;37752:22;:51::i;25731:763::-;25997:14;25978:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;26024:12:::1;26039:46;26064:7;26073:5;26080:4;26039:24;:46::i;:::-;26024:61;;26096:18;26117:26;26132:4;26137:5;26117:14;:26::i;:::-;26096:47;;26170:196;26200:5;26220:4;26239:9;26263:14;26292:12;26327:4;26347:8;26170:15;:196::i;:::-;26154:212:::0;-1:-1:-1;26377:71:0::1;::::0;-1:-1:-1;26391:5:0;26398:2;26402:45:::1;26420:26;26435:4:::0;26391:5;26420:14:::1;:26::i;:::-;26402:13:::0;;:17:::1;:45::i;:::-;26377:13;:71::i;:::-;26459:27;26472:2;26476:9;26459:12;:27::i;:::-;17509:1;;25731:763:::0;;;;;;;;;:::o;34942:898::-;35202:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;35247:4:::1;-1:-1:-1::0;;;;;35236:15:0::1;:4;;35241:1;35236:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35236:7:0::1;-1:-1:-1::0;;;;;35236:15:0::1;;35228:57;;;::::0;;-1:-1:-1;;;35228:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35228:57:0;;;;;;;;;;;;;::::1;;35312:9;35340:76;35355:51;35380:7;35389:4:::0;;35296:13:::1;35389:7:::0;::::1;;;35355:51;35407:8;35340:14;:76::i;:::-;35531:18;35559:4:::0;;-1:-1:-1;;35564:15:0;;35559:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35559:21:0::1;-1:-1:-1::0;;;;;35552:39:0::1;;35592:2;35552:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;35552:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35552:43:0;35606:44:::1;::::0;;35552:43:::1;35606:44:::0;;::::1;::::0;;;;;;;;;;;35552:43;;-1:-1:-1;35606:44:0::1;::::0;;;35641:4;;;;;;35606:44;::::1;::::0;35641:4;;35606:44;35641:4;35606:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;35647:2:0;;-1:-1:-1;35606:34:0::1;::::0;-1:-1:-1;;35606:44:0:i:1;:::-;35749:12:::0;35683:62:::1;35731:13:::0;35690:4;;-1:-1:-1;;35695:15:0;;35690:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35690:21:0::1;-1:-1:-1::0;;;;;35683:39:0::1;;35723:2;35683:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;35683:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22729:961:::0;22983:12;22997;22964:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;23022:12:::1;23037:49;23062:7;23071:6;23079;23037:24;:49::i;:::-;23097:62;::::0;;-1:-1:-1;;;23097:62:0;;23131:10:::1;23097:62;::::0;::::1;::::0;-1:-1:-1;;;;;23097:33:0;::::1;:62:::0;;;;;;;;;;;;;;23022:64;;-1:-1:-1;23097:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;23097:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;23227:29:0::1;::::0;;-1:-1:-1;;;23227:29:0;;-1:-1:-1;;;;;23227:29:0;;::::1;;::::0;::::1;::::0;;;23197:12:::1;::::0;;;23227:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;23197:12;23227:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23227:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23227:29:0;-1:-1:-1;23268:14:0::1;23287:43;23315:6:::0;23323;23287:27:::1;:43::i;:::-;23267:63;;;23372:6;-1:-1:-1::0;;;;;23362:16:0::1;:6;-1:-1:-1::0;;;;;23362:16:0::1;;:58;;23403:7;23412;23362:58;;;23382:7;23391;23362:58;23341:79:::0;;-1:-1:-1;23341:79:0;-1:-1:-1;23431:37:0::1;23444:4:::0;23449:6;23341:79;23465:2;23431:12:::1;:37::i;:::-;;23479;23492:4;23497:6;23504:7;23513:2;23479:12;:37::i;:::-;;23546:10;23535:7;:21;;23527:72;;;;-1:-1:-1::0;;;23527:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23629:10;23618:7;:21;;23610:72;;;;-1:-1:-1::0;;;23610:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:1;;;;22729:961:::0;;;;;;;;;;;:::o;17159:41::-;;;:::o;38358:253::-;38502:21;38548:55;38579:7;38588:8;38598:4;38548:30;:55::i;24983:669::-;25272:16;25290:14;25317:12;25332:46;25357:7;25366:5;25373:4;25332:24;:46::i;:::-;25317:61;;25389:10;25402;:33;;25426:9;25402:33;;;-1:-1:-1;;25402:33:0;25446:80;;;-1:-1:-1;;;25446:80:0;;25474:10;25446:80;;;;25494:4;25446:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:46;;-1:-1:-1;;;;;;25446:27:0;;;;;:80;;;;;-1:-1:-1;;25446:80:0;;;;;;;;-1:-1:-1;25446:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25564;25583:5;25590:9;25601:14;25617:12;25631:2;25635:8;25564:18;:80::i;:::-;25537:107;;;;-1:-1:-1;24983:669:0;-1:-1:-1;;;;;;;;;;;;;24983:669:0:o;21095:698::-;21383:12;21397;21411:14;21364:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;21459:85:::1;21473:6;21481;21489:14;21505;21521:10;21533;21459:13;:85::i;:::-;21438:106:::0;;-1:-1:-1;21438:106:0;-1:-1:-1;21555:12:0::1;21570:49;21595:7;21604:6:::0;21612;21570:24:::1;:49::i;:::-;21555:64;;21630:46;21642:10;21654:4;21660:6;21668:7;21630:11;:46::i;:::-;21687;21699:10;21711:4;21717:6;21725:7;21687:11;:46::i;:::-;21771:4;-1:-1:-1::0;;;;;21756:25:0::1;;21782:2;21756:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;21756:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21756:29:0;21095:698;;;;-1:-1:-1;21756:29:0;;-1:-1:-1;21095:698:0;;-1:-1:-1;;;;;;;;;21095:698:0:o;21799:887::-;22052:16;22070:14;22086;22033:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;22140:176:::1;22168:5;22188:4;22207:18;22240:9;22264:14;22293:12;22140:13;:176::i;:::-;22113:203:::0;;-1:-1:-1;22113:203:0;-1:-1:-1;22327:12:0::1;22342:46;22367:7;22376:5:::0;22383:4:::1;22342:24;:46::i;:::-;22327:61;;22399:46;22411:10;22422:4;22427:5;22433:11;22399;:46::i;:::-;22456:31;22471:4;22477:9;22456:14;:31::i;:::-;22525:4;-1:-1:-1::0;;;;;22510:25:0::1;;22536:2;22510:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;22510:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22510:29:0;;-1:-1:-1;22590:9:0::1;:21:::0;-1:-1:-1;22586:92:0::1;;;22613:65;22644:10;22668:9;22656;:21;22613:30;:65::i;:::-;17509:1;21799:887:::0;;;;;;;;;;;:::o;31797:850::-;32010:21;31982:8;17454:15;17442:8;:27;;17434:64;;;;;-1:-1:-1;;;17434:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17434:64:0;;;;;;;;;;;;;;;32068:4:::1;-1:-1:-1::0;;;;;32057:15:0::1;:4;;32062:1;32057:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32057:7:0::1;-1:-1:-1::0;;;;;32057:15:0::1;;32049:57;;;::::0;;-1:-1:-1;;;32049:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32049:57:0;;;;;;;;;;;;;::::1;;32127:55;32157:7;32166:9;32177:4;;32127:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32127:29:0::1;::::0;-1:-1:-1;;;32127:55:0:i:1;:::-;32117:65;;32215:9;32201:7;32209:1;32201:10;;;;;;;;;;;;;;:23;;32193:75;;;;-1:-1:-1::0;;;32193:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32279:78;32294:51;32319:7;32328:4;;32333:1;32328:7;;;;;;32279:78;32474:24;32480:7;32489:4;;32474:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32495:2:0;;-1:-1:-1;32474:5:0::1;::::0;-1:-1:-1;;32474:24:0:i:1;:::-;32561:7;32569:1;32561:10;;;;;;;;;;;;;;32549:9;:22;32545:94;;;32573:66;32604:10;32628:7;32636:1;32628:10;;;;;;;;;;;;;;32616:9;:22;32573:30;:66::i;17252:29::-:0;;;-1:-1:-1;;;;;17252:29:0;;:::o;18423:333::-;18506:12;18528:5;-1:-1:-1;;;;;18521:23:0;;18553:4;18521:38;;;;;;;;;;;;;-1:-1:-1;;;;;18521:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18521:38:0;;-1:-1:-1;18573:16:0;;;18570:122;;;18624:5;;-1:-1:-1;;;;;18624:5:0;18605:47;18653:5;18660:19;:6;18671:7;18660:10;:19::i;:::-;18605:75;;;;;;;;;;;;;-1:-1:-1;;;;;18605:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18570:122;18702:46;18730:5;18737:2;18741:6;18702:27;:46::i;:::-;18423:333;;;;:::o;18762:350::-;18829:12;18851:4;-1:-1:-1;;;;;18844:22:0;;18875:4;18844:37;;;;;;;;;;;;;-1:-1:-1;;;;;18844:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18844:37:0;;-1:-1:-1;18895:16:0;;;18892:121;;;18946:5;;-1:-1:-1;;;;;18946:5:0;18927:47;18975:4;18981:19;:6;18992:7;18981:10;:19::i;:::-;18927:74;;;;;;;;;;;;;-1:-1:-1;;;;;18927:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18892:121;19029:4;-1:-1:-1;;;;;19023:20:0;;19044:6;19023:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19062:42;19093:2;19097:6;19062:30;:42::i;:::-;18762:350;;;:::o;13264:517::-;13357:14;13403:1;13392:8;:12;13384:68;;;;-1:-1:-1;;;13384:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13483:1;13471:9;:13;:31;;;;;13501:1;13488:10;:14;13471:31;13463:84;;;;-1:-1:-1;;;13463:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13558:20;13581:17;:8;13594:3;13581:12;:17::i;:::-;13558:40;-1:-1:-1;13609:14:0;13626:31;13558:40;13646:10;13626:19;:31::i;:::-;13609:48;-1:-1:-1;13668:16:0;13687:40;13711:15;13687:19;:9;13701:4;13687:13;:19::i;:::-;:23;;:40::i;:::-;13668:59;;13762:11;13750:9;:23;;;;;;;13264:517;-1:-1:-1;;;;;;;13264:517:0:o;14456:511::-;14557:21;14614:1;14599:4;:11;:16;;14591:59;;;;;-1:-1:-1;;;14591:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14682:4;:11;14671:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14671:23:0;;14661:33;;14718:8;14705:7;14713:1;14705:10;;;;;;;;;;;;;:21;;;;;14742:6;14737:223;14768:1;14754:4;:11;:15;14750:1;:19;14737:223;;;14792:14;14808:15;14827:42;14839:7;14848:4;14853:1;14848:7;;;;;;;;;;;;;;14857:4;14862:1;14866;14862:5;14857:11;;;;;;;;;;;;;;14827;:42::i;:::-;14791:78;;;;14901:47;14914:7;14922:1;14914:10;;;;;;;;;;;;;;14926:9;14937:10;14901:12;:47::i;:::-;14884:7;14892:1;14896;14892:5;14884:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14771:3:0;;14737:223;;;;14456:511;;;;;:::o;11781:478::-;11870:12;11896:14;11912;11930:26;11941:6;11949;11930:10;:26::i;:::-;12094:32;;;-1:-1:-1;;12094:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12084:43;;;;;;-1:-1:-1;;;;;;11997:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11987:262;;;;;;;;;11781:478;-1:-1:-1;;;;;11781:478:0:o;19120:356::-;19216:18;19244:5;-1:-1:-1;;;;;19237:23:0;;19269:4;19237:38;;;;;;;;;;;;;-1:-1:-1;;;;;19237:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19237:38:0;;-1:-1:-1;19286:67:0;19318:5;19325:4;19339;19346:6;19286:31;:67::i;:::-;19386:82;19454:13;19386:63;19417:5;-1:-1:-1;;;;;19410:23:0;;19442:4;19410:38;;;;;;;;;;;;;-1:-1:-1;;;;;19410:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19410:38:0;-1:-1:-1;;;;;19386:12:0;;;;;;;:6;19410:38;19386:12;;;;;;;:19;;;;;;;;;;;:23;:63::i;:::-;:67;;:82::i;:::-;-1:-1:-1;;;;;19364:12:0;;;;;;;:6;:12;;;;;;;;:19;;;;;;;;;;;;;;:104;;;;-1:-1:-1;;;19120:356:0:o;27329:1124::-;27436:6;27431:1015;27462:1;27448:4;:11;:15;27444:1;:19;27431:1015;;;27486:13;27501:14;27520:4;27525:1;27520:7;;;;;;;;;;;;;;27529:4;27534:1;27538;27534:5;27529:11;;;;;;;;;;;;;;27485:56;;;;27557:14;27576:42;27604:5;27611:6;27576:27;:42::i;:::-;27556:62;;;27633:14;27650:7;27658:1;27662;27658:5;27650:14;;;;;;;;;;;;;;27633:31;;27680:15;27697;27725:6;-1:-1:-1;;;;;27716:15:0;:5;-1:-1:-1;;;;;27716:15:0;;:61;;27758:9;27774:1;27716:61;;;27740:1;27744:9;27716:61;27679:98;;;;27904:10;27935:1;27921:4;:11;:15;27917:1;:19;:41;;27955:3;27917:41;;;27947:4;27917:41;27904:54;;27973:12;27988:48;28013:7;28022:5;28029:6;27988:24;:48::i;:::-;27973:63;;28051:41;28064:4;28070:6;28078:9;28089:2;28051:12;:41::i;:::-;;28128:1;28114:4;:11;:15;28110:1;:19;28107:214;;;28149:16;28168:54;28193:7;28202:6;28210:4;28215:1;28219;28215:5;28210:11;;;;;;;;;;;;;;28168:24;:54::i;:::-;-1:-1:-1;;;;;28266:16:0;;;;;;;:6;:16;;;;;;;;:24;;;;;;;;;;28149:73;;-1:-1:-1;28266:39:0;;28295:9;28266:28;:39::i;:::-;-1:-1:-1;;;;;28241:16:0;;;;;;;:6;:16;;;;;;;;:24;;;;;;;;;;;;:64;28107:214;28407:12;;;28417:1;28407:12;;;;;;;;;;-1:-1:-1;;;28335:99:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28335:99:0;;;;;;;;;;;;;;;;;;;;;;:25;;;;;;28379:10;;28391;;28403:2;;28407:12;;28335:99;;;;;;;;;;;;28407:12;;28335:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27465:3:0;;;;;-1:-1:-1;27431:1015:0;;-1:-1:-1;;;;;;;;;27431:1015:0;15048:532;15149:21;15206:1;15191:4;:11;:16;;15183:59;;;;;-1:-1:-1;;;15183:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15274:4;:11;15263:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15263:23:0;;15253:33;;15327:9;15297:7;15322:1;15305:7;:14;:18;15297:27;;;;;;;;;;;;;;;;;:39;15361:11;;-1:-1:-1;;15361:15:0;15347:226;15378:5;;15347:226;;15406:14;15422:15;15441:42;15453:7;15462:4;15471:1;15467;:5;15462:11;;;;;;;;;;;;;;15475:4;15480:1;15475:7;;;;;;;15441:42;15405:78;;;;15515:46;15527:7;15535:1;15527:10;;;;;;;;;;;;;;15539:9;15550:10;15515:11;:46::i;:::-;15498:7;15510:1;15506;:5;15498:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;15385:3:0;15347:226;;1456:361;1651:45;;;-1:-1:-1;;;;;1651:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1651:45:0;-1:-1:-1;;;1651:45:0;;;1640:57;;;;1605:12;;1619:17;;1640:10;;;;1651:45;1640:57;;;1651:45;1640:57;;1651:45;1640:57;;;;;;;;;;-1:-1:-1;;1640:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1604:93;;;;1716:7;:57;;;;-1:-1:-1;1728:11:0;;:16;;:44;;;1759:4;1748:24;;;;;;;;;;;;;;;-1:-1:-1;1748:24:0;1728:44;1708:101;;;;;-1:-1:-1;;;1708:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1456:361;;;;;:::o;32794:1469::-;32907:6;32902:1354;32933:1;32919:4;:11;:15;32915:1;:19;32902:1354;;;32957:13;32972:14;32991:4;32996:1;32991:7;;;;;;;;;;;;;;33000:4;33005:1;33009;33005:5;33000:11;;;;;;;;;;;;;;32956:56;;;;33028:14;33047:42;33075:5;33082:6;33047:27;:42::i;:::-;33027:62;;;33104:19;33141:48;33166:7;33175:5;33182:6;33141:24;:48::i;:::-;33104:86;;33205:16;33236:17;33324:13;33339;33357:4;-1:-1:-1;;;;;33357:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33357:18:0;;;;;;;-1:-1:-1;;;;;33323:52:0;;;;-1:-1:-1;33323:52:0;;-1:-1:-1;33391:17:0;;-1:-1:-1;;;;;33432:15:0;;;;;;;:61;;33474:8;33484;33432:61;;;33451:8;33461;33432:61;33390:103;;;;33522:53;33562:12;33522:35;33545:4;33551:5;33522:14;:35::i;:53::-;33508:67;;33605:71;33635:11;33648:12;33662:13;33605:29;:71::i;:::-;33590:86;;32902:1354;;;;33707:15;33724;33752:6;-1:-1:-1;;;;;33743:15:0;:5;-1:-1:-1;;;;;33743:15:0;;:67;;33788:12;33807:1;33743:67;;;33767:1;33771:12;33743:67;33706:104;;;;33825:10;33856:1;33842:4;:11;:15;33838:1;:19;:41;;33876:3;33838:41;;;33868:4;33838:41;33825:54;;33894:53;33915:4;33922:6;33930:12;33944:2;33894:12;:53::i;:::-;;33983:1;33969:4;:11;:15;33965:1;:19;33962:217;;;34004:16;34023:54;34048:7;34057:6;34065:4;34070:1;34074;34070:5;34065:11;;;;;;;34023:54;-1:-1:-1;;;;;34121:16:0;;;;;;;:6;:16;;;;;;;;:24;;;;;;;;;;34004:73;;-1:-1:-1;34121:42:0;;34150:12;34121:28;:42::i;:::-;-1:-1:-1;;;;;34096:16:0;;;;;;;:6;:16;;;;;;;;:24;;;;;;;;;;;;:67;33962:217;34231:12;;;34241:1;34231:12;;;;;;;;;;-1:-1:-1;;;34193:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34193:51:0;;;;;;;;;;;;;;;;;;;;;;:9;;;;;;34203:10;;34215;;34227:2;;34231:12;;34193:51;;;;;;;;;;;;34231:12;;34193:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32936:3:0;;;;;-1:-1:-1;32902:1354:0;;-1:-1:-1;;;;;;;;;;32902:1354:0;10804:129;10888:5;;;10883:16;;;;10875:50;;;;;-1:-1:-1;;;10875:50:0;;;;;;;;;;;;-1:-1:-1;;;10875:50:0;;;;;;;;;;;;;;19482:177;-1:-1:-1;;;;;19574:12:0;;;;;;;:6;:12;;;;;;;;19587:4;19574:18;;;;;;;;;;:30;;19597:6;19574:22;:30::i;:::-;-1:-1:-1;;;;;19553:12:0;;;;;;;:6;:12;;;;;;;;19566:4;19553:18;;;;;;;;;;;;;:51;;;;19615:36;;-1:-1:-1;;;19615:36:0;;;;19553:18;;19615:19;;19642:6;;19615:36;;;;;19553:12;;19615:36;;;;;;19642:6;19553:18;19615:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19482:177;;:::o;13902:472::-;13995:13;14041:1;14029:9;:13;14021:70;;;;-1:-1:-1;;;14021:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14122:1;14110:9;:13;:31;;;;;14140:1;14127:10;:14;14110:31;14102:84;;;;-1:-1:-1;;;14102:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14197:14;14214:34;14243:4;14214:24;:9;14228;14214:13;:24::i;:::-;:28;;:34::i;:::-;14197:51;-1:-1:-1;14259:16:0;14278:34;14308:3;14278:25;:10;14293:9;14278:14;:25::i;:34::-;14259:53;;14334:32;14364:1;14347:11;14335:9;:23;;;;;;;14334:29;:32::i;:::-;14323:43;13902:472;-1:-1:-1;;;;;;13902:472:0:o;12821:321::-;12903:12;12946:1;12936:7;:11;12928:61;;;;-1:-1:-1;;;12928:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13019:1;13008:8;:12;:28;;;;;13035:1;13024:8;:12;13008:28;13000:81;;;;-1:-1:-1;;;13000:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13126:8;13102:21;:7;13114:8;13102:11;:21::i;:::-;:32;;;;;;;12821:321;-1:-1:-1;;;;12821:321:0:o;11340:349::-;11415:14;11431;11476:6;-1:-1:-1;;;;;11466:16:0;:6;-1:-1:-1;;;;;11466:16:0;;;11458:66;;;;-1:-1:-1;;;11458:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11563:6;-1:-1:-1;;;;;11554:15:0;:6;-1:-1:-1;;;;;11554:15:0;;:53;;11592:6;11600;11554:53;;;11573:6;11581;11554:53;11535:72;;-1:-1:-1;11535:72:0;-1:-1:-1;;;;;;11626:20:0;;11618:63;;;;;-1:-1:-1;;;11618:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11340:349;;;;;:::o;17810:607::-;-1:-1:-1;;;;;17936:12:0;;;17904;17936;;;:6;:12;;;;;;;;:19;;;;;;;;;;;;:29;-1:-1:-1;17936:29:0;17928:77;;;;-1:-1:-1;;;17928:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18038:12:0;;;;;;;:6;:12;;;;;;;;:19;;;;;;;;;;:31;;18062:6;18038:23;:31::i;:::-;-1:-1:-1;;;;;18016:12:0;;;;;;;:6;:12;;;;;;;;:19;;;;;;;;;;:53;;;;18083:19;;18097:4;18083:19;18080:308;;18118:12;18140:5;-1:-1:-1;;;;;18133:23:0;;18165:4;18133:38;;;;;;;;;;;;;-1:-1:-1;;;;;18133:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18133:38:0;;-1:-1:-1;18189:16:0;;;18186:130;;;18244:5;;-1:-1:-1;;;;;18244:5:0;18225:47;18273:5;18280:19;:6;18291:7;18280:10;:19::i;:::-;18225:75;;;;;;;;;;;;;-1:-1:-1;;;;;18225:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18186:130;18330:46;18358:5;18365:2;18369:6;18330:27;:46::i;:::-;18080:308;;-1:-1:-1;18405:4:0;17810:607;;;;;;:::o;19699:1390::-;19917:12;19931;20074:1;-1:-1:-1;;;;;20012:64:0;20030:7;-1:-1:-1;;;;;20012:34:0;;20047:6;20055;20012:50;;;;;;;;;;;;;-1:-1:-1;;;;;20012:50:0;;;;;;-1:-1:-1;;;;;20012:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20012:50:0;-1:-1:-1;;;;;20012:64:0;;20008:150;;;20111:7;-1:-1:-1;;;;;20093:37:0;;20131:6;20139;20093:53;;;;;;;;;;;;;-1:-1:-1;;;;;20093:53:0;;;;;;-1:-1:-1;;;;;20093:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20008:150:0;20169:13;20184;20201:53;20230:7;20239:6;20247;20201:28;:53::i;:::-;20168:86;;;;20269:8;20281:1;20269:13;:30;;;;-1:-1:-1;20286:13:0;;20269:30;20265:817;;;20338:14;;-1:-1:-1;20354:14:0;;-1:-1:-1;20265:817:0;;;20402:19;20424:58;20447:14;20463:8;20473;20424:22;:58::i;:::-;20402:80;;20519:14;20501;:32;20497:574;;20580:10;20562:14;:28;;20554:79;;;;-1:-1:-1;;;20554:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20674:14;;-1:-1:-1;20690:14:0;-1:-1:-1;20690:14:0;20497:574;;;20746:19;20768:58;20791:14;20807:8;20817;20768:22;:58::i;:::-;20746:80;;20870:14;20852;:32;;20845:40;;;;20930:10;20912:14;:28;;20904:79;;;;-1:-1:-1;;;20904:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21024:14;-1:-1:-1;21040:14:0;;-1:-1:-1;20497:574:0;20265:817;;19699:1390;;;;;;;;;;;:::o;2235:195::-;2343:12;;;2305;2343;;;;;;;;;-1:-1:-1;;;;;2322:7:0;;;2336:5;;2322:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2322:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2304:52;;;2375:7;2367:55;;;;-1:-1:-1;;;2367:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10941:142;10993:6;11020;;;:30;;-1:-1:-1;;11035:5:0;;;11049:1;11044;11035:5;11044:1;11030:15;;;;;:20;11020:30;11012:63;;;;;-1:-1:-1;;;11012:63:0;;;;;;;;;;;;-1:-1:-1;;;11012:63:0;;;;;;;;;;;;;;10668:128;10752:5;;;10747:16;;;;10739:49;;;;;-1:-1:-1;;;10739:49:0;;;;;;;;;;;;-1:-1:-1;;;10739:49:0;;;;;;;;;;;;;;12317:391;12410:13;12425;12452:14;12471:26;12482:6;12490;12471:10;:26::i;:::-;12451:46;;;12509:13;12524;12557:32;12565:7;12574:6;12582;12557:7;:32::i;:::-;-1:-1:-1;;;;;12542:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12542:62:0;;;;;;;-1:-1:-1;;;;;12508:96:0;;;;-1:-1:-1;12508:96:0;;-1:-1:-1;;;;;;12638:16:0;;;;;;;:62;;12681:8;12691;12638:62;;;12658:8;12668;12638:62;12615:85;;;;-1:-1:-1;12317:391:0;-1:-1:-1;;;;;;;12317:391:0:o;1825:402::-;2050:51;;;-1:-1:-1;;;;;2050:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2050:51:0;-1:-1:-1;;;2050:51:0;;;2039:63;;;;2004:12;;2018:17;;2039:10;;;;2050:51;2039:63;;;2050:51;2039:63;;2050:51;2039:63;;;;;;;;;;-1:-1:-1;;2039:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2003:99;;;;2121:7;:57;;;;-1:-1:-1;2133:11:0;;:16;;:44;;;2164:4;2153:24;;;;;;;;;;;;;;;-1:-1:-1;2153:24:0;2133:44;2113:106;;;;-1:-1:-1;;;2113:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1825:402;;;;;;:::o

Swarm Source

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