Contract 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 2

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xcfbc0b1067004d7a7667df3ef60ea8fe8a6f99e8d81fe450cfc49ad75e14df72Swap Exact Token...147169662022-01-27 0:40:322 hrs 42 mins ago0xf338aac4d07bf15796143a02e17f571bd9cfd3c6 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000556185
0x51eb5a477b917fd9843d81f08ff171189c49aa77ff1026a2ed856e4547b52afaSwap Exact Token...147169592022-01-27 0:40:112 hrs 42 mins ago0xf338aac4d07bf15796143a02e17f571bd9cfd3c6 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000480465
0x9bf156f98b0924516a58f8eb42cbd85d058d3ace99122e9f0232187ad6195eceAdd Liquidity ET...147167252022-01-27 0:28:292 hrs 54 mins ago0x6e873918cfecc6156806753dedef212dcb3f5b0d IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.852365368578814 BNB0.00085216
0xa2e2630ff040df37fe77d23fb7006a0aa5376cb94268d70047666bd925290056Remove Liquidity...147083912022-01-26 17:31:349 hrs 51 mins ago0x0376dc03bd1fc7c5450700b4a45330024b9e2925 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000913995
0x33b697a37c23c4f5fa124196d6669c1043cb631cd3a29efc0efa84227e13ab78Remove Liquidity...147082412022-01-26 17:24:049 hrs 59 mins ago0x0376dc03bd1fc7c5450700b4a45330024b9e2925 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.001035105
0x7f7e56342e1521092023681cf54318da94d18274b7ee4bb10facf8b690acaa70Swap Exact Token...147075772022-01-26 16:50:5210 hrs 32 mins ago0x7617952fb23d74a09d920bc6132b18aaa6ca627e IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000571525
0xaad1d30b8e6e647c2cb91e88e19ae241d1ec2a4aadfd20cf459c35fe0b80a91dRemove Liquidity...147056042022-01-26 15:11:2512 hrs 11 mins agoSamoyedFinance: Deployer IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.001030185
0x7c8ac90b89c8131397ad82acaea12e5d8084befb69b87da47f596dcded1d81feSwap Exact Token...147055402022-01-26 15:06:4012 hrs 16 mins ago0x584ee26a974adab2ac2c10fd93631f7202f78b3e IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.0009789
0xd03e1e2d1d4225bbf6b7ca3f0855dfd9d9f251ddb82cddda0efbf33a892512cfSwap Exact Token...147054432022-01-26 14:59:5512 hrs 23 mins ago0x1a3ff54b7f18a51d1015fe73ca65234a2e218465 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000571525
0xba378a6d9f11cc284ed3d5becd229e75bb85bb3f2645fd6d01b0c0de4e53fc96Swap Exact Token...147051002022-01-26 14:42:4612 hrs 40 mins ago0x84c0b490792b2e9a311433955a7980583469ae18 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000870195
0xe4578639077a50ca1f3c62862478d2f8a83a8e14f4c1edea3dc139dd9044273cSwap Exact Token...147048842022-01-26 14:31:5812 hrs 51 mins ago0x5f38f42dd7ff1c3fc3ec081dafd428f883a3173b IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.00082896
0x762ba376d6edfc41839c1397fba853aee7078eabb7678be78445e703fe1a0118Swap Exact Token...147048342022-01-26 14:29:2712 hrs 53 mins ago0x84c0b490792b2e9a311433955a7980583469ae18 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000481305
0xe96bd653756d872defed061ff07a21ffa11552582a78212e3c7d33463920dbb0Swap Exact Token...147048282022-01-26 14:29:0912 hrs 54 mins ago0x84c0b490792b2e9a311433955a7980583469ae18 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000870195
0x90bbb654807b739170164a6d862fd3c5ceb45a85e26c1b669a3e84708417b10bSwap Tokens For ...147003662022-01-26 10:46:0116 hrs 37 mins ago0x2ed27928f116323742dfa0af99dacd680cd7c495 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000979265
0xa6469cf84924eb57d7a7705ad8e9773b65c7864122d116723475f0ec915a7e2cSwap Exact Token...146988292022-01-26 9:29:1017 hrs 53 mins ago0x84c0b490792b2e9a311433955a7980583469ae18 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.00087162
0x6907890998230085a24f4d864ab291e64ed7699b7650f83e368b17e2b38ef76aSwap Exact Token...146962902022-01-26 7:22:1020 hrs ago0xcdd7ef4ed44a7c5eed1f2764b0639c72078b7541 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.00098261
0x1808d204e8a640e3f08d393d8abbe8b6e65dc3e595ae070592fc53cd81d24592Swap ETH For Exa...146930142022-01-26 4:38:2222 hrs 44 mins ago0xb720d2d5ceda4c3dbd19cfffcb6201c9ecc5a7df IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000236804994379 BNB0.00070556
0xfa9163adfa48dfdc22e651791e50e5e317cd112f6c45e769a865778fcee74594Swap Exact Token...146927742022-01-26 4:26:2222 hrs 56 mins ago0x061f3aad58d4086035eb1bba479aec2994ef47ab IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000556185
0xe4f172b21f8a267c7ff23e18dc0663835ca8acc1ff30a7145611c18beae26ddfSwap Exact Token...146925232022-01-26 4:13:4923 hrs 9 mins ago0x0d30d62893f171d410b2795ff64ca821b6326958 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000481305
0x555b2df99c856edf44054ffa2d7828e3652bf1009ad9d87578aaff38d003a362Swap Exact Token...146917512022-01-26 3:35:1323 hrs 47 mins ago0x6b2b6c9f8ffc582046c0348e2f450ea1286c5382 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000481245
0xa11d84dc108ba9cf1fda3fc4807ce31fc75908808ce9a4ef60396a6f56b0881eSwap Exact ETH F...146848282022-01-25 21:49:031 day 5 hrs ago0xb4cc3b98bc48b8c207d0094ea1c58802bfd57d57 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.00459965 BNB0.00062985
0xf1952e9e68eac321bb83b5ce16ebe61f62762f7c03efa1debead2a2531c1a077Swap Exact Token...146821332022-01-25 19:34:181 day 7 hrs ago0x94c835ca9624d1df7de18f3c2ca03b1d20f017f3 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.0008715
0x33ab2f58221daada00f443c29d1ee8b2cd76547650a0137d060d8182ab8ad0a8Swap Tokens For ...146764602022-01-25 14:48:541 day 12 hrs ago0x0db5fac89db0a80814b657dd5f539a4219a18f17 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.00049588
0xe6ac815fd5c4068da94c2b63c45475ffddb386a726bac975b5c96a2b0a66a929Swap Exact Token...146755972022-01-25 14:05:451 day 13 hrs ago0xa5cf467773f3fd9acbee23dcd575c357861bda77 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000944955
0x249c48865a258887ecf764cc7bcb6198514bc80000913f6829d0595b1c63f128Swap Exact Token...146753502022-01-25 13:53:241 day 13 hrs ago0xdc10aa5e739fd3c059f13c6a411b5b958ec529b0 IN  0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0 BNB0.000571525
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xbf85cfc6527d89ea2593f5f964898e4b985afce4b1d43deedb73b7c49da03c4b147182622022-01-27 1:45:291 hr 37 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x2f4b6b1355827a8dc179feef4f867be0c2b468350.000361554502141958 BNB
0xbf85cfc6527d89ea2593f5f964898e4b985afce4b1d43deedb73b7c49da03c4b147182622022-01-27 1:45:291 hr 37 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000361554502141958 BNB
0x9bf156f98b0924516a58f8eb42cbd85d058d3ace99122e9f0232187ad6195ece147167252022-01-27 0:28:292 hrs 54 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae Binance: WBNB Token0.852365368578814434 BNB
0xd32acbe90d0bdc6ab87e0bedcb9f99fadfb407eff218f2747ab1e726855acf12147158322022-01-26 23:43:503 hrs 39 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x06176b178b312921c016734787b2d855717b30a30.00009558711629197 BNB
0xd32acbe90d0bdc6ab87e0bedcb9f99fadfb407eff218f2747ab1e726855acf12147158322022-01-26 23:43:503 hrs 39 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.00009558711629197 BNB
0xc636a2f763c4edc9518712656a68cd8cb4295140bde2b1e1574a38d9ed2be382147085672022-01-26 17:40:229 hrs 42 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x5b71d93058dd537881d784888afd5599e36c0c990.000402617397184121 BNB
0xc636a2f763c4edc9518712656a68cd8cb4295140bde2b1e1574a38d9ed2be382147085672022-01-26 17:40:229 hrs 42 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000402617397184121 BNB
0x3a8f6afe2136cd183f3ed7157e4a555f33b3b7ad85817bad317654f9db3a708d147085412022-01-26 17:39:049 hrs 44 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x7967b882be311b949d6a91134149ea4d133a5de70.000096454571289014 BNB
0x3a8f6afe2136cd183f3ed7157e4a555f33b3b7ad85817bad317654f9db3a708d147085412022-01-26 17:39:049 hrs 44 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000096454571289014 BNB
0xe480248d4298e6258419c0ed479958cbe3ace4aac06b04fc47fb9b7f02f98e7b147085392022-01-26 17:38:589 hrs 44 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x3060300706fe17187107f4131920dedf105e52580.000032238052165671 BNB
0xe480248d4298e6258419c0ed479958cbe3ace4aac06b04fc47fb9b7f02f98e7b147085392022-01-26 17:38:589 hrs 44 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000032238052165671 BNB
0xde0ec999f8ee51118b31277712e6864c30d126ef37ff24abfea09db9194a153c147085372022-01-26 17:38:529 hrs 44 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0xc167401b6a2808afb68c950bb9fc708e63966f6c0.000291773222682333 BNB
0xde0ec999f8ee51118b31277712e6864c30d126ef37ff24abfea09db9194a153c147085372022-01-26 17:38:529 hrs 44 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000291773222682333 BNB
0x524d8714061c872b198b44604edbf881a0baf20c55c6b66a3ccc5f4cbb7c7848147084932022-01-26 17:36:409 hrs 46 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x9bffe446c2840b6eb752e442b84ab3ca8c0471650.000691563578852789 BNB
0x524d8714061c872b198b44604edbf881a0baf20c55c6b66a3ccc5f4cbb7c7848147084932022-01-26 17:36:409 hrs 46 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000691563578852789 BNB
0xec168ace5a93418ea5b04a56a5ba4cf474ad5a450f402c9ba6f18d90ba7c9605147084912022-01-26 17:36:349 hrs 46 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x5c4c1dba679246b27002637822d45487aa9aa0480.001071970920666148 BNB
0xec168ace5a93418ea5b04a56a5ba4cf474ad5a450f402c9ba6f18d90ba7c9605147084912022-01-26 17:36:349 hrs 46 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.001071970920666148 BNB
0xa07d7107326cc807c26b76e81455d7eb4470c60b4d32f5f479a15051032e9269147084892022-01-26 17:36:289 hrs 46 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae 0x423b35ae651287524b9d5da9ab68d4e7188bc6dd0.000064355279749542 BNB
0xa07d7107326cc807c26b76e81455d7eb4470c60b4d32f5f479a15051032e9269147084892022-01-26 17:36:289 hrs 46 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.000064355279749542 BNB
0x33b697a37c23c4f5fa124196d6669c1043cb631cd3a29efc0efa84227e13ab78147082412022-01-26 17:24:049 hrs 59 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0x0376dc03bd1fc7c5450700b4a45330024b9e29250.035336749157339977 BNB
0x33b697a37c23c4f5fa124196d6669c1043cb631cd3a29efc0efa84227e13ab78147082412022-01-26 17:24:049 hrs 59 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.035336749157339977 BNB
0x7f7e56342e1521092023681cf54318da94d18274b7ee4bb10facf8b690acaa70147075772022-01-26 16:50:5210 hrs 32 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0x7617952fb23d74a09d920bc6132b18aaa6ca627e0.006626265729053541 BNB
0x7f7e56342e1521092023681cf54318da94d18274b7ee4bb10facf8b690acaa70147075772022-01-26 16:50:5210 hrs 32 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae0.006626265729053541 BNB
0xaad1d30b8e6e647c2cb91e88e19ae241d1ec2a4aadfd20cf459c35fe0b80a91d147056042022-01-26 15:11:2512 hrs 11 mins ago 0x0f4610ab02920a99f639f675085a5d3e24b0d7aeSamoyedFinance: Deployer3.638727173501987052 BNB
0xaad1d30b8e6e647c2cb91e88e19ae241d1ec2a4aadfd20cf459c35fe0b80a91d147056042022-01-26 15:11:2512 hrs 11 mins ago Binance: WBNB Token 0x0f4610ab02920a99f639f675085a5d3e24b0d7ae3.638727173501987052 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FoodcourtRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-27
*/

/**
 *Submitted for verification at BscScan.com on 2021-04-23
*/

// 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\IFoodcourtRouter01.sol

pragma solidity >=0.6.2;

interface IFoodcourtRouter01 {
    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\IFoodcourtRouter02.sol

pragma solidity >=0.6.2;

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

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

// File: contracts\interfaces\IFoodcourtFactory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

// 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\interfaces\IFoodcourtPair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts\libraries\FoodcourtLibrary.sol

pragma solidity >=0.5.0;



library FoodcourtLibrary {
    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, 'FoodcourtLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'FoodcourtLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal view 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'f1d77ba4cb681341af63066d44297a59a8962ec4fe422a20eca5077dca88cef9' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IFoodcourtPair(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, 'FoodcourtLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'FoodcourtLibrary: 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, 'FoodcourtLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'FoodcourtLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9975);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'FoodcourtLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'FoodcourtLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9975);
        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, 'FoodcourtLibrary: 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, 'FoodcourtLibrary: 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\FoodcourtRouter.sol

pragma solidity =0.6.6;







contract FoodcourtRouter is IFoodcourtRouter02 {
    using SafeMath for uint;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IFoodcourtFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IFoodcourtFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = FoodcourtLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = FoodcourtLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'FoodcourtRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = FoodcourtLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'FoodcourtRouter: 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 = FoodcourtLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IFoodcourtPair(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 = FoodcourtLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IFoodcourtPair(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 = FoodcourtLibrary.pairFor(factory, tokenA, tokenB);
        IFoodcourtPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IFoodcourtPair(pair).burn(to);
        (address token0,) = FoodcourtLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'FoodcourtRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'FoodcourtRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = FoodcourtLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IFoodcourtPair(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 = FoodcourtLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IFoodcourtPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = FoodcourtLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IFoodcourtPair(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,) = FoodcourtLibrary.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 ? FoodcourtLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IFoodcourtPair(FoodcourtLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = FoodcourtLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FoodcourtRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = FoodcourtLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'FoodcourtRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'FoodcourtRouter: INVALID_PATH');
        amounts = FoodcourtLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FoodcourtRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(FoodcourtLibrary.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, 'FoodcourtRouter: INVALID_PATH');
        amounts = FoodcourtLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'FoodcourtRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'FoodcourtRouter: INVALID_PATH');
        amounts = FoodcourtLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FoodcourtRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'FoodcourtRouter: INVALID_PATH');
        amounts = FoodcourtLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'FoodcourtRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(FoodcourtLibrary.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,) = FoodcourtLibrary.sortTokens(input, output);
            IFoodcourtPair pair = IFoodcourtPair(FoodcourtLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = FoodcourtLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? FoodcourtLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.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,
            'FoodcourtRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'FoodcourtRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(FoodcourtLibrary.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,
            'FoodcourtRouter: 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, 'FoodcourtRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FoodcourtLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'FoodcourtRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return FoodcourtLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract Security Audit

Contract ABI

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

60c060405234801561001057600080fd5b50604051620048fd380380620048fd8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614778620001856000398061019f5280610d3a5280610d755280610e6c528061109c5280611426528061159e52806119655280611a715280611b275280611bf55280611d4d5280611dd5528061201a52806120955280612144528061221052806122b7528061232b52806128425280612ab55280612b0b5280612b3f5280612bb35280612d535280612ea85280612f30525080610f0c5280610fe35280611162528061119b52806112d652806114c6528061157c52806116ec5280611c9a5280611e075280611f6a528061235d52806125b652806127c752806127f05280612820528061298d5280612ae95280612df85280612f62528061386452806138a75280613b8a5280613d10528061417a528061424152806142c152506147786000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610ba1578063f305d71914610c21578063fb3bdb4114610c67576101c8565b8063c45a015514610a62578063d06ca61f14610a77578063ded9382a14610b2e576101c8565b8063af2979eb116100b0578063af2979eb1461092c578063b6f9de951461097f578063baa2abde14610a05576101c8565b80638803dbee1461082d578063ad5c4648146108c5578063ad615dec146108f6576101c8565b80634a25d94a11610138578063791ac94711610112578063791ac947146106d95780637ff36ab51461077157806385f8c259146107f7576101c8565b80634a25d94a146105365780635b0d5984146105ce5780635c11d79514610641576101c8565b80631f00ca74116101695780631f00ca74146103695780632195995c1461042057806338ed17391461049e576101c8565b806302751cec146101cd578063054d50d41461023957806318cbafe514610281576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c657fe5b005b600080fd5b3480156101d957600080fd5b50610220600480360360c08110156101f057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ced565b6040805192835260208301919091528051918290030190f35b34801561024557600080fd5b5061026f6004803603606081101561025c57600080fd5b5080359060208101359060400135610e07565b60408051918252519081900360200190f35b34801561028d57600080fd5b50610319600480360360a08110156102a457600080fd5b8135916020810135918101906060810160408201356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460208302840111640100000000831117156102ff57600080fd5b91935091506001600160a01b038135169060200135610e1c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561035557818101518382015260200161033d565b505050509050019250505060405180910390f35b34801561037557600080fd5b506103196004803603604081101561038c57600080fd5b813591908101906040810160208201356401000000008111156103ae57600080fd5b8201836020820111156103c057600080fd5b803590602001918460208302840111640100000000831117156103e257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061115b945050505050565b34801561042c57600080fd5b50610220600480360361016081101561044457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611191565b3480156104aa57600080fd5b50610319600480360360a08110156104c157600080fd5b8135916020810135918101906060810160408201356401000000008111156104e857600080fd5b8201836020820111156104fa57600080fd5b8035906020019184602083028401116401000000008311171561051c57600080fd5b91935091506001600160a01b03813516906020013561128b565b34801561054257600080fd5b50610319600480360360a081101561055957600080fd5b81359160208101359181019060608101604082013564010000000081111561058057600080fd5b82018360208201111561059257600080fd5b803590602001918460208302840111640100000000831117156105b457600080fd5b91935091506001600160a01b0381351690602001356113d6565b3480156105da57600080fd5b5061026f60048036036101408110156105f257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611574565b34801561064d57600080fd5b506101c6600480360360a081101561066457600080fd5b81359160208101359181019060608101604082013564010000000081111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111640100000000831117156106bf57600080fd5b91935091506001600160a01b038135169060200135611682565b3480156106e557600080fd5b506101c6600480360360a08110156106fc57600080fd5b81359160208101359181019060608101604082013564010000000081111561072357600080fd5b82018360208201111561073557600080fd5b8035906020019184602083028401116401000000008311171561075757600080fd5b91935091506001600160a01b038135169060200135611917565b6103196004803603608081101561078757600080fd5b813591908101906040810160208201356401000000008111156107a957600080fd5b8201836020820111156107bb57600080fd5b803590602001918460208302840111640100000000831117156107dd57600080fd5b91935091506001600160a01b038135169060200135611bad565b34801561080357600080fd5b5061026f6004803603606081101561081a57600080fd5b5080359060208101359060400135611f12565b34801561083957600080fd5b50610319600480360360a081101561085057600080fd5b81359160208101359181019060608101604082013564010000000081111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111640100000000831117156108ab57600080fd5b91935091506001600160a01b038135169060200135611f1f565b3480156108d157600080fd5b506108da612018565b604080516001600160a01b039092168252519081900360200190f35b34801561090257600080fd5b5061026f6004803603606081101561091957600080fd5b508035906020810135906040013561203c565b34801561093857600080fd5b5061026f600480360360c081101561094f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612049565b6101c66004803603608081101561099557600080fd5b813591908101906040810160208201356401000000008111156109b757600080fd5b8201836020820111156109c957600080fd5b803590602001918460208302840111640100000000831117156109eb57600080fd5b91935091506001600160a01b0381351690602001356121ca565b348015610a1157600080fd5b50610220600480360360e0811015610a2857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612568565b348015610a6e57600080fd5b506108da6127c5565b348015610a8357600080fd5b5061031960048036036040811015610a9a57600080fd5b81359190810190604081016020820135640100000000811115610abc57600080fd5b820183602082011115610ace57600080fd5b80359060200191846020830284011164010000000083111715610af057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506127e9945050505050565b348015610b3a57600080fd5b506102206004803603610140811015610b5257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612816565b348015610bad57600080fd5b50610c036004803603610100811015610bc557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561292a565b60408051938452602084019290925282820152519081900360600190f35b610c03600480360360c0811015610c3757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612a66565b61031960048036036080811015610c7d57600080fd5b81359190810190604081016020820135640100000000811115610c9f57600080fd5b820183602082011115610cb157600080fd5b80359060200191846020830284011164010000000083111715610cd357600080fd5b91935091506001600160a01b038135169060200135612d0b565b6000808242811015610d34576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b610d63897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612568565b9093509150610d7389868561309f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610dd957600080fd5b505af1158015610ded573d6000803e3d6000fd5b50505050610dfb8583613237565b50965096945050505050565b6000610e1484848461332f565b949350505050565b60608142811015610e62576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e9c57fe5b905060200201356001600160a01b03166001600160a01b031614610f07576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b610f657f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341f92505050565b91508682600184510381518110610f7857fe5b60200260200101511015610fbd5760405162461bcd60e51b815260040180806020018281038252602b8152602001806146ac602b913960400191505060405180910390fd5b61105b86866000818110610fcd57fe5b905060200201356001600160a01b0316336110417f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061100f57fe5b905060200201356001600160a01b03168b8b600181811061102c57fe5b905060200201356001600160a01b031661356b565b8560008151811061104e57fe5b6020026020010151613643565b61109a828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506137b5915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110d957fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561111757600080fd5b505af115801561112b573d6000803e3d6000fd5b50505050611150848360018551038151811061114357fe5b6020026020010151613237565b509695505050505050565b60606111887f000000000000000000000000000000000000000000000000000000000000000084846139fb565b90505b92915050565b60008060006111c17f00000000000000000000000000000000000000000000000000000000000000008f8f61356b565b90506000876111d0578c6111d4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561124a57600080fd5b505af115801561125e573d6000803e3d6000fd5b505050506112718f8f8f8f8f8f8f612568565b809450819550505050509b509b9950505050505050505050565b606081428110156112d1576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b61132f7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341f92505050565b9150868260018451038151811061134257fe5b602002602001015110156113875760405162461bcd60e51b815260040180806020018281038252602b8152602001806146ac602b913960400191505060405180910390fd5b61139786866000818110610fcd57fe5b611150828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137b5915050565b6060814281101561141c576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061145657fe5b905060200201356001600160a01b03166001600160a01b0316146114c1576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61151f7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139fb92505050565b9150868260008151811061152f57fe5b60200260200101511115610fbd5760405162461bcd60e51b81526004018080602001828103825260278152602001806145f16027913960400191505060405180910390fd5b6000806115c27f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061356b565b90506000866115d1578b6115d5565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561164b57600080fd5b505af115801561165f573d6000803e3d6000fd5b505050506116718d8d8d8d8d8d612049565b9d9c50505050505050505050505050565b80428110156116c6576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b61173b858560008181106116d657fe5b905060200201356001600160a01b0316336117357f00000000000000000000000000000000000000000000000000000000000000008989600081811061171857fe5b905060200201356001600160a01b03168a8a600181811061102c57fe5b8a613643565b60008585600019810181811061174d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156117b257600080fd5b505afa1580156117c6573d6000803e3d6000fd5b505050506040513d60208110156117dc57600080fd5b5051604080516020888102828101820190935288825292935061181e929091899189918291850190849080828437600092019190915250889250613b33915050565b866118d0828888600019810181811061183357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d60208110156118c257600080fd5b50519063ffffffff613e5e16565b101561190d5760405162461bcd60e51b815260040180806020018281038252602b8152602001806146ac602b913960400191505060405180910390fd5b5050505050505050565b804281101561195b576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061199557fe5b905060200201356001600160a01b03166001600160a01b031614611a00576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611a10858560008181106116d657fe5b611a4e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b33915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611ab857600080fd5b505afa158015611acc573d6000803e3d6000fd5b505050506040513d6020811015611ae257600080fd5b5051905086811015611b255760405162461bcd60e51b815260040180806020018281038252602b8152602001806146ac602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b8b57600080fd5b505af1158015611b9f573d6000803e3d6000fd5b5050505061190d8482613237565b60608142811015611bf3576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c2a57fe5b905060200201356001600160a01b03166001600160a01b031614611c95576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611cf37f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341f92505050565b91508682600184510381518110611d0657fe5b60200260200101511015611d4b5760405162461bcd60e51b815260040180806020018281038252602b8152602001806146ac602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d8757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e337f00000000000000000000000000000000000000000000000000000000000000008989600081811061171857fe5b84600081518110611e4057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e9757600080fd5b505af1158015611eab573d6000803e3d6000fd5b505050506040513d6020811015611ec157600080fd5b5051611ec957fe5b611f08828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137b5915050565b5095945050505050565b6000610e14848484613eb6565b60608142811015611f65576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b611fc37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139fb92505050565b91508682600081518110611fd357fe5b602002602001015111156113875760405162461bcd60e51b81526004018080602001828103825260278152602001806145f16027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e14848484613fa6565b6000814281101561208f576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b6120be887f00000000000000000000000000000000000000000000000000000000000000008989893089612568565b604080516370a0823160e01b8152306004820152905191945061214292508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561211157600080fd5b505afa158015612125573d6000803e3d6000fd5b505050506040513d602081101561213b57600080fd5b505161309f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a857600080fd5b505af11580156121bc573d6000803e3d6000fd5b505050506111508483613237565b804281101561220e576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061224557fe5b905060200201356001600160a01b03166001600160a01b0316146122b0576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561231057600080fd5b505af1158015612324573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123897f00000000000000000000000000000000000000000000000000000000000000008989600081811061171857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156123d957600080fd5b505af11580156123ed573d6000803e3d6000fd5b505050506040513d602081101561240357600080fd5b505161240b57fe5b60008686600019810181811061241d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561248257600080fd5b505afa158015612496573d6000803e3d6000fd5b505050506040513d60208110156124ac57600080fd5b505160408051602089810282810182019093528982529293506124ee9290918a918a918291850190849080828437600092019190915250899250613b33915050565b876118d0828989600019810181811061250357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561189857600080fd5b60008082428110156125af576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b60006125dc7f00000000000000000000000000000000000000000000000000000000000000008c8c61356b565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561263757600080fd5b505af115801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156126c757600080fd5b505af11580156126db573d6000803e3d6000fd5b505050506040513d60408110156126f157600080fd5b5080516020909101519092509050600061270b8e8e614052565b509050806001600160a01b03168e6001600160a01b03161461272e578183612731565b82825b90975095508a8710156127755760405162461bcd60e51b81526004018080602001828103825260268152602001806146186026913960400191505060405180910390fd5b898610156127b45760405162461bcd60e51b81526004018080602001828103825260268152602001806146866026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111887f0000000000000000000000000000000000000000000000000000000000000000848461341f565b60008060006128667f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061356b565b9050600087612875578c612879565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156128ef57600080fd5b505af1158015612903573d6000803e3d6000fd5b505050506129158e8e8e8e8e8e610ced565b909f909e509c50505050505050505050505050565b60008060008342811015612973576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b6129818c8c8c8c8c8c614130565b909450925060006129b37f00000000000000000000000000000000000000000000000000000000000000008e8e61356b565b90506129c18d338388613643565b6129cd8c338387613643565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612a2557600080fd5b505af1158015612a39573d6000803e3d6000fd5b505050506040513d6020811015612a4f57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612aaf576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b612add8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614130565b90945092506000612b2f7f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061356b565b9050612b3d8b338388613643565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b9857600080fd5b505af1158015612bac573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b505050506040513d6020811015612c5b57600080fd5b5051612c6357fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612cbb57600080fd5b505af1158015612ccf573d6000803e3d6000fd5b505050506040513d6020811015612ce557600080fd5b5051925034841015612cfd57612cfd33853403613237565b505096509650969350505050565b60608142811015612d51576040805162461bcd60e51b8152602060048201526018602482015260008051602061463e833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d8857fe5b905060200201356001600160a01b03166001600160a01b031614612df3576040805162461bcd60e51b815260206004820152601d60248201527f466f6f64636f757274526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b612e517f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506139fb92505050565b91503482600081518110612e6157fe5b60200260200101511115612ea65760405162461bcd60e51b81526004018080602001828103825260278152602001806145f16027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612ee257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f1557600080fd5b505af1158015612f29573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f8e7f00000000000000000000000000000000000000000000000000000000000000008989600081811061171857fe5b84600081518110612f9b57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ff257600080fd5b505af1158015613006573d6000803e3d6000fd5b505050506040513d602081101561301c57600080fd5b505161302457fe5b613063828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137b5915050565b8160008151811061307057fe5b6020026020010151341115611f0857611f08338360008151811061309057fe5b60200260200101513403613237565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061314a5780518252601f19909201916020918201910161312b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146131ac576040519150601f19603f3d011682016040523d82523d6000602084013e6131b1565b606091505b50915091508180156131df5750805115806131df57508080602001905160208110156131dc57600080fd5b50515b613230576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106132835780518252601f199092019160209182019101613264565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146132e5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ea565b606091505b505090508061332a5760405162461bcd60e51b81526004018080602001828103825260238152602001806146fc6023913960400191505060405180910390fd5b505050565b600080841161336f5760405162461bcd60e51b815260040180806020018281038252602b81526020018061459a602b913960400191505060405180910390fd5b60008311801561337f5750600082115b6133ba5760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b60006133ce856126f763ffffffff6143d616565b905060006133e2828563ffffffff6143d616565b90506000613408836133fc8861271063ffffffff6143d616565b9063ffffffff61444216565b905080828161341357fe5b04979650505050505050565b6060600282511015613478576040805162461bcd60e51b815260206004820152601e60248201527f466f6f64636f7572744c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561349057600080fd5b506040519080825280602002602001820160405280156134ba578160200160208202803683370190505b50905082816000815181106134cb57fe5b60200260200101818152505060005b60018351038110156135635760008061351d878685815181106134f957fe5b602002602001015187866001018151811061351057fe5b602002602001015161449a565b9150915061353f84848151811061353057fe5b6020026020010151838361332f565b84846001018151811061354e57fe5b602090810291909101015250506001016134da565b509392505050565b600080600061357a8585614052565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527ff1d77ba4cb681341af63066d44297a59a8962ec4fe422a20eca5077dca88cef9609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106136dd5780518252601f1990920191602091820191016136be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461373f576040519150601f19603f3d011682016040523d82523d6000602084013e613744565b606091505b5091509150818015613772575080511580613772575080806020019051602081101561376f57600080fd5b50515b6137ad5760405162461bcd60e51b815260040180806020018281038252602481526020018061471f6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139f5576000808483815181106137d357fe5b60200260200101518584600101815181106137ea57fe5b60200260200101519150915060006138028383614052565b509050600087856001018151811061381657fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461384457826000613848565b6000835b91509150600060028a5103881061385f57886138a0565b6138a07f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061389357fe5b602002602001015161356b565b90506138cd7f0000000000000000000000000000000000000000000000000000000000000000888861356b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561390a576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561397b578181015183820152602001613963565b50505050905090810190601f1680156139a85780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156139ca57600080fd5b505af11580156139de573d6000803e3d6000fd5b5050600190990198506137b8975050505050505050565b50505050565b6060600282511015613a54576040805162461bcd60e51b815260206004820152601e60248201527f466f6f64636f7572744c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613a6c57600080fd5b50604051908082528060200260200182016040528015613a96578160200160208202803683370190505b5090508281600183510381518110613aaa57fe5b60209081029190910101528151600019015b801561356357600080613aec87866001860381518110613ad857fe5b602002602001015187868151811061351057fe5b91509150613b0e848481518110613aff57fe5b60200260200101518383613eb6565b846001850381518110613b1d57fe5b6020908102919091010152505060001901613abc565b60005b600183510381101561332a57600080848381518110613b5157fe5b6020026020010151858460010181518110613b6857fe5b6020026020010151915091506000613b808383614052565b5090506000613bb07f0000000000000000000000000000000000000000000000000000000000000000858561356b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613bf157600080fd5b505afa158015613c05573d6000803e3d6000fd5b505050506040513d6060811015613c1b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613c58578284613c5b565b83835b91509150613cb9828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561189857600080fd5b9550613cc686838361332f565b945050505050600080856001600160a01b0316886001600160a01b031614613cf057826000613cf4565b6000835b91509150600060028c51038a10613d0b578a613d3f565b613d3f7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061389357fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613de2578181015183820152602001613dca565b50505050905090810190601f168015613e0f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613e3157600080fd5b505af1158015613e45573d6000803e3d6000fd5b50506001909b019a50613b369950505050505050505050565b8082038281111561118b576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613ef65760405162461bcd60e51b815260040180806020018281038252602c8152602001806145c5602c913960400191505060405180910390fd5b600083118015613f065750600082115b613f415760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b6000613f65612710613f59868863ffffffff6143d616565b9063ffffffff6143d616565b90506000613f7f6126f7613f59868963ffffffff613e5e16565b9050613f9c6001828481613f8f57fe5b049063ffffffff61444216565b9695505050505050565b6000808411613fe65760405162461bcd60e51b81526004018080602001828103825260258152602001806145756025913960400191505060405180910390fd5b600083118015613ff65750600082115b6140315760405162461bcd60e51b815260040180806020018281038252602881526020018061465e6028913960400191505060405180910390fd5b82614042858463ffffffff6143d616565b8161404957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156140a65760405162461bcd60e51b81526004018080602001828103825260258152602001806146d76025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106140c65782846140c9565b83835b90925090506001600160a01b038216614129576040805162461bcd60e51b815260206004820152601e60248201527f466f6f64636f7572744c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156141c357600080fd5b505afa1580156141d7573d6000803e3d6000fd5b505050506040513d60208110156141ed57600080fd5b50516001600160a01b031614156142b957604080517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561428c57600080fd5b505af11580156142a0573d6000803e3d6000fd5b505050506040513d60208110156142b657600080fd5b50505b6000806142e77f00000000000000000000000000000000000000000000000000000000000000008b8b61449a565b915091508160001480156142f9575080155b15614309578793508692506143c9565b6000614316898484613fa6565b9050878111614369578581101561435e5760405162461bcd60e51b81526004018080602001828103825260268152602001806146866026913960400191505060405180910390fd5b8894509250826143c7565b6000614376898486613fa6565b90508981111561438257fe5b878110156143c15760405162461bcd60e51b81526004018080602001828103825260268152602001806146186026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806143f1575050808202828282816143ee57fe5b04145b61118b576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561118b576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006144a98585614052565b5090506144b786868661356b565b506000806144c688888861356b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156144fe57600080fd5b505afa158015614512573d6000803e3d6000fd5b505050506040513d606081101561452857600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614614562578082614565565b81815b9099909850965050505050505056fe466f6f64636f7572744c6962726172793a20494e53554646494349454e545f414d4f554e54466f6f64636f7572744c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54466f6f64636f7572744c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54466f6f64636f757274526f757465723a204558434553534956455f494e5055545f414d4f554e54466f6f64636f757274526f757465723a20494e53554646494349454e545f415f414d4f554e54466f6f64636f757274526f757465723a20455850495245440000000000000000466f6f64636f7572744c6962726172793a20494e53554646494349454e545f4c4951554944495459466f6f64636f757274526f757465723a20494e53554646494349454e545f425f414d4f554e54466f6f64636f757274526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54466f6f64636f7572744c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220f7d1913c33e4e55241535c753c335c080fe474287310f7785199cd5ba01ddcfa64736f6c63430006060033000000000000000000000000c801c7980c8c7900bc898b1f38392b235ff64097000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000c801c7980c8c7900bc898b1f38392b235ff64097000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0xc801c7980c8c7900bc898b1f38392b235ff64097
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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


Deployed ByteCode Sourcemap

16401:18547:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16881:10;-1:-1:-1;;;;;16895:4:0;16881:18;;16874:26;;;;16401:18547;;12:1:-1;9;2:12;21031:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21031:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21031:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33892:262;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33892:262:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33892:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28200:850;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28200:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28200:850:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28200:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28200:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28200:850:0;;-1:-1:-1;28200:850:0;-1:-1:-1;;;;;;28200:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28200:850:0;;;;;;;;;;;;;;;;;34692:253;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34692:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34692:253:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34692:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34692:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34692:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34692:253:0;;-1:-1:-1;34692:253:0;;-1:-1:-1;;;;;34692:253:0:i;21710:677::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21710:677:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21710:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25417:628::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25417:628:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25417:628:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25417:628:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25417:628:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25417:628:0;;-1:-1:-1;25417:628:0;-1:-1:-1;;;;;;25417:628:0;;;;;;;;:::i;27366:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27366:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27366:828:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27366:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27366:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27366:828:0;;-1:-1:-1;27366:828:0;-1:-1:-1;;;;;;27366:828:0;;;;;;;;:::i;23847:718::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23847:718:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23847:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31233:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31233:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31233:714:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31233:714:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31233:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31233:714:0;;-1:-1:-1;31233:714:0;-1:-1:-1;;;;;;31233:714:0;;;;;;;;:::i;32809:843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32809:843:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32809:843:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32809:843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32809:843:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32809:843:0;;-1:-1:-1;32809:843:0;-1:-1:-1;;;;;;32809:843:0;;;;;;;;:::i;26663:697::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26663:697:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26663:697:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26663:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26663:697:0;;-1:-1:-1;26663:697:0;-1:-1:-1;;;;;;26663:697:0;;;;;;;;:::i;34162:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34162:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34162:261:0;;;;;;;;;;;;:::i;26051:606::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26051:606:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26051:606:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26051:606:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26051:606:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26051:606:0;;-1:-1:-1;26051:606:0;-1:-1:-1;;;;;;26051:606:0;;;;;;;;:::i;16535:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16535:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;16535:38:0;;;;;;;;;;;;;;33696:188;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33696:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33696:188:0;;;;;;;;;;;;:::i;23141:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23141:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23141:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31953:850::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31953:850:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31953:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31953:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31953:850:0;;-1:-1:-1;31953:850:0;-1:-1:-1;;;;;;31953:850:0;;;;;;;;:::i;20160:865::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20160:865:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20160:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16487:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16487:41:0;;;:::i;34431:253::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34431:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34431:253:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34431:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34431:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34431:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34431:253:0;;-1:-1:-1;34431:253:0;;-1:-1:-1;;;;;34431:253:0:i;22393:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22393:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22393:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18399:738::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18399:738:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18399:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19143:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19143:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29056:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29056:810:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29056:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29056:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29056:810:0;;-1:-1:-1;29056:810:0;-1:-1:-1;;;;;;29056:810:0;;;;;;;;:::i;21031:673::-;21268:16;21286:14;21249:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;21340:196:::1;21370:5;21390:4;21409:9;21433:14;21462:12;21497:4;21517:8;21340:15;:196::i;:::-;21313:223:::0;;-1:-1:-1;21313:223:0;-1:-1:-1;21547:51:0::1;21575:5:::0;21582:2;21313:223;21547:27:::1;:51::i;:::-;21615:4;-1:-1:-1::0;;;;;21609:20:0::1;;21630:9;21609:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21609:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21609:31:0;;;;21651:45;21682:2;21686:9;21651:30;:45::i;:::-;21031:673:::0;;;;;;;;;;:::o;33892:262::-;34045:14;34084:62;34114:8;34124:9;34135:10;34084:29;:62::i;:::-;34077:69;33892:262;-1:-1:-1;;;;33892:262:0:o;28200:850::-;28414:21;28386:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28486:4:0::1;28461:29;:4:::0;;-1:-1:-1;;28466:15:0;;28461:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28461:21:0::1;-1:-1:-1::0;;;;;28461:29:0::1;;28453:71;;;::::0;;-1:-1:-1;;;28453:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28545:55;28576:7;28585:8;28595:4;;28545:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28545:30:0::1;::::0;-1:-1:-1;;;28545:55:0:i:1;:::-;28535:65;;28650:12;28619:7;28644:1;28627:7;:14;:18;28619:27;;;;;;;;;;;;;;:43;;28611:99;;;;-1:-1:-1::0;;;28611:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28721:141;28767:4;;28772:1;28767:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28767:7:0::1;28776:10;28788:51;28813:7;28822:4;;28827:1;28822:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28822:7:0::1;28831:4;;28836:1;28831:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28831:7:0::1;28788:24;:51::i;:::-;28841:7;28849:1;28841:10;;;;;;;;;;;;;;28721:31;:141::i;:::-;28873:35;28879:7;28888:4;;28873:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28902:4:0::1;::::0;-1:-1:-1;28873:5:0::1;::::0;-1:-1:-1;;28873:35:0:i:1;:::-;28925:4;-1:-1:-1::0;;;;;28919:20:0::1;;28940:7;28965:1;28948:7;:14;:18;28940:27;;;;;;;;;;;;;;28919:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28919:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28919:49:0;;;;28979:63;29010:2;29014:7;29039:1;29022:7;:14;:18;29014:27;;;;;;;;;;;;;;28979:30;:63::i;:::-;28200:850:::0;;;;;;;;;:::o;34692:253::-;34836:21;34882:55;34912:7;34921:9;34932:4;34882:29;:55::i;:::-;34875:62;;34692:253;;;;;:::o;21710:677::-;22016:12;22030;22055;22070:49;22095:7;22104:6;22112;22070:24;:49::i;:::-;22055:64;;22130:10;22143;:33;;22167:9;22143:33;;;-1:-1:-1;;22143:33:0;22187:80;;;-1:-1:-1;;;22187:80:0;;22215:10;22187:80;;;;22235:4;22187:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22130:46;;-1:-1:-1;;;;;;22187:27:0;;;;;:80;;;;;-1:-1:-1;;22187:80:0;;;;;;;;-1:-1:-1;22187:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;22187:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22187:80:0;;;;22299;22315:6;22323;22331:9;22342:10;22354;22366:2;22370:8;22299:15;:80::i;:::-;22278:101;;;;;;;;21710:677;;;;;;;;;;;;;;;;:::o;25417:628::-;25641:21;25622:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;25685:55:::1;25716:7;25725:8;25735:4;;25685:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25685:30:0::1;::::0;-1:-1:-1;;;25685:55:0:i:1;:::-;25675:65;;25790:12;25759:7;25784:1;25767:7;:14;:18;25759:27;;;;;;;;;;;;;;:43;;25751:99;;;;-1:-1:-1::0;;;25751:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25861:141;25907:4;;25912:1;25907:7;;;;;;25861:141;26013:24;26019:7;26028:4;;26013:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26034:2:0;;-1:-1:-1;26013:5:0::1;::::0;-1:-1:-1;;26013:24:0:i:1;27366:828::-:0;27580:21;27552:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27652:4:0::1;27627:29;:4:::0;;-1:-1:-1;;27632:15:0;;27627:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27627:21:0::1;-1:-1:-1::0;;;;;27627:29:0::1;;27619:71;;;::::0;;-1:-1:-1;;;27619:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27711:55;27741:7;27750:9;27761:4;;27711:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27711:29:0::1;::::0;-1:-1:-1;;;27711:55:0:i:1;:::-;27701:65;;27799:11;27785:7;27793:1;27785:10;;;;;;;;;;;;;;:25;;27777:77;;;;-1:-1:-1::0;;;27777:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23847:718:::0;24165:14;24192:12;24207:46;24232:7;24241:5;24248:4;24207:24;:46::i;:::-;24192:61;;24264:10;24277;:33;;24301:9;24277:33;;;-1:-1:-1;;24277:33:0;24321:80;;;-1:-1:-1;;;24321:80:0;;24349:10;24321:80;;;;24369:4;24321:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24264:46;;-1:-1:-1;;;;;;24321:27:0;;;;;:80;;;;;-1:-1:-1;;24321:80:0;;;;;;;;-1:-1:-1;24321:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;24321:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24321:80:0;;;;24424:133;24486:5;24493:9;24504:14;24520:12;24534:2;24538:8;24424:47;:133::i;:::-;24412:145;23847:718;-1:-1:-1;;;;;;;;;;;;;23847:718:0:o;31233:714::-;31467:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;31488:139:::1;31534:4;;31539:1;31534:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31534:7:0::1;31543:10;31555:51;31580:7;31589:4;;31594:1;31589:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31589:7:0::1;31598:4;;31603:1;31598:7;;;;;;31555:51;31608:8;31488:31;:139::i;:::-;31638:18;31666:4:::0;;-1:-1:-1;;31671:15:0;;31666:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31666:21:0::1;-1:-1:-1::0;;;;;31659:39:0::1;;31699:2;31659:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31659:43:0::1;-1:-1:-1::0;;;;;31659:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31659:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31659:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31659:43:0;31713:44:::1;::::0;;31659:43:::1;31713:44:::0;;::::1;::::0;;;;;;;;;;;31659:43;;-1:-1:-1;31713:44:0::1;::::0;;;31748:4;;;;;;31713:44;::::1;::::0;31748:4;;31713:44;31748:4;31713:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31754:2:0;;-1:-1:-1;31713:34:0::1;::::0;-1:-1:-1;;31713:44:0:i:1;:::-;31856:12:::0;31790:62:::1;31838:13:::0;31797:4;;-1:-1:-1;;31802:15:0;;31797:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31797:21:0::1;-1:-1:-1::0;;;;;31790:39:0::1;;31830:2;31790:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31790:43:0::1;-1:-1:-1::0;;;;;31790:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31790:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31790:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31790:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31768:171;;;;-1:-1:-1::0;;;31768:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16699:1;31233:714:::0;;;;;;;:::o;32809:843::-;33076:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33135:4:0::1;33110:29;:4:::0;;-1:-1:-1;;33115:15:0;;33110:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33110:21:0::1;-1:-1:-1::0;;;;;33110:29:0::1;;33102:71;;;::::0;;-1:-1:-1;;;33102:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33184:139;33230:4;;33235:1;33230:7;;;;;;33184:139;33334:55;33369:4;;33334:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33383:4:0::1;::::0;-1:-1:-1;33334:34:0::1;::::0;-1:-1:-1;;33334:55:0:i:1;:::-;33417:37;::::0;;-1:-1:-1;;;33417:37:0;;33448:4:::1;33417:37;::::0;::::1;::::0;;;33400:14:::1;::::0;-1:-1:-1;;;;;33424:4:0::1;33417:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33417:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33417:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33417:37:0;;-1:-1:-1;33473:25:0;;::::1;;33465:81;;;;-1:-1:-1::0;;;33465:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33563:4;-1:-1:-1::0;;;;;33557:20:0::1;;33578:9;33557:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33557:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33557:31:0;;;;33599:45;33630:2;33634:9;33599:30;:45::i;26663:697::-:0;26879:21;26851:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;26937:4:::1;-1:-1:-1::0;;;;;26926:15:0::1;:4;;26931:1;26926:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26926:7:0::1;-1:-1:-1::0;;;;;26926:15:0::1;;26918:57;;;::::0;;-1:-1:-1;;;26918:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26996:56;27027:7;27036:9;27047:4;;26996:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26996:30:0::1;::::0;-1:-1:-1;;;26996:56:0:i:1;:::-;26986:66;;27102:12;27071:7;27096:1;27079:7;:14;:18;27071:27;;;;;;;;;;;;;;:43;;27063:99;;;;-1:-1:-1::0;;;27063:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27179:4;-1:-1:-1::0;;;;;27173:19:0::1;;27200:7;27208:1;27200:10;;;;;;;;;;;;;;27173:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27173:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27173:40:0;;;;;27237:4;-1:-1:-1::0;;;;;27231:20:0::1;;27252:51;27277:7;27286:4;;27291:1;27286:7;;;;;;27252:51;27305:7;27313:1;27305:10;;;;;;;;;;;;;;27231:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27231:85:0::1;-1:-1:-1::0;;;;;27231:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27231:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27231:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27231:85:0;27224:93:::1;;;;27328:24;27334:7;27343:4;;27328:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27349:2:0;;-1:-1:-1;27328:5:0::1;::::0;-1:-1:-1;;27328:24:0:i:1;:::-;26663:697:::0;;;;;;;;:::o;34162:261::-;34315:13;34353:62;34382:9;34393;34404:10;34353:28;:62::i;26051:606::-;26275:21;26256:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;26319:55:::1;26349:7;26358:9;26369:4;;26319:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26319:29:0::1;::::0;-1:-1:-1;;;26319:55:0:i:1;:::-;26309:65;;26407:11;26393:7;26401:1;26393:10;;;;;;;;;;;;;;:25;;26385:77;;;;-1:-1:-1::0;;;26385:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16535:38:::0;;;:::o;33696:188::-;33793:12;33825:51;33848:7;33857:8;33867;33825:22;:51::i;23141:700::-;23407:14;23388:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;23450:196:::1;23480:5;23500:4;23519:9;23543:14;23572:12;23607:4;23627:8;23450:15;:196::i;:::-;23696:38;::::0;;-1:-1:-1;;;23696:38:0;;23728:4:::1;23696:38;::::0;::::1;::::0;;;23434:212;;-1:-1:-1;23657:78:0::1;::::0;-1:-1:-1;23685:5:0;;23692:2;;-1:-1:-1;;;;;23696:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23696:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23696:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23696:38:0;23657:27:::1;:78::i;:::-;23752:4;-1:-1:-1::0;;;;;23746:20:0::1;;23767:9;23746:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23746:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23746:31:0;;;;23788:45;23819:2;23823:9;23788:30;:45::i;31953:850::-:0;32213:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;32258:4:::1;-1:-1:-1::0;;;;;32247:15:0::1;:4;;32252:1;32247:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32247:7:0::1;-1:-1:-1::0;;;;;32247:15:0::1;;32239:57;;;::::0;;-1:-1:-1;;;32239:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32307:13;32323:9;32307:25;;32349:4;-1:-1:-1::0;;;;;32343:19:0::1;;32370:8;32343:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32343:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32343:38:0;;;;;32405:4;-1:-1:-1::0;;;;;32399:20:0::1;;32420:51;32445:7;32454:4;;32459:1;32454:7;;;;;;32420:51;32473:8;32399:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32399:83:0::1;-1:-1:-1::0;;;;;32399:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32399:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32399:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32399:83:0;32392:91:::1;;;;32494:18;32522:4:::0;;-1:-1:-1;;32527:15:0;;32522:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32522:21:0::1;-1:-1:-1::0;;;;;32515:39:0::1;;32555:2;32515:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32515:43:0::1;-1:-1:-1::0;;;;;32515:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32515:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32515:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32515:43:0;32569:44:::1;::::0;;32515:43:::1;32569:44:::0;;::::1;::::0;;;;;;;;;;;32515:43;;-1:-1:-1;32569:44:0::1;::::0;;;32604:4;;;;;;32569:44;::::1;::::0;32604:4;;32569:44;32604:4;32569:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32610:2:0;;-1:-1:-1;32569:34:0::1;::::0;-1:-1:-1;;32569:44:0:i:1;:::-;32712:12:::0;32646:62:::1;32694:13:::0;32653:4;;-1:-1:-1;;32658:15:0;;32653:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32653:21:0::1;-1:-1:-1::0;;;;;32646:39:0::1;;32686:2;32646:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32646:43:0::1;-1:-1:-1::0;;;;;32646:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;20160:865:0::0;20414:12;20428;20395:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;20453:12:::1;20468:49;20493:7;20502:6;20510;20468:24;:49::i;:::-;20528:62;::::0;;-1:-1:-1;;;20528:62:0;;20562:10:::1;20528:62;::::0;::::1;::::0;-1:-1:-1;;;;;20528:33:0;::::1;:62:::0;;;;;;;;;;;;;;20453:64;;-1:-1:-1;20528:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20528:33:0;:62;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20528:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20528:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20658:29:0::1;::::0;;;;;-1:-1:-1;;;;;20658:29:0;;::::1;;::::0;::::1;::::0;;;20628:12:::1;::::0;;;20658:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20628:12;20658:25;:29;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20658:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20658:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20658:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20658:29:0;-1:-1:-1;20699:14:0::1;20718:43;20746:6:::0;20754;20718:27:::1;:43::i;:::-;20698:63;;;20803:6;-1:-1:-1::0;;;;;20793:16:0::1;:6;-1:-1:-1::0;;;;;20793:16:0::1;;:58;;20834:7;20843;20793:58;;;20813:7;20822;20793:58;20772:79:::0;;-1:-1:-1;20772:79:0;-1:-1:-1;20870:21:0;;::::1;;20862:72;;;;-1:-1:-1::0;;;20862:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20964:10;20953:7;:21;;20945:72;;;;-1:-1:-1::0;;;20945:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16699:1;;;;20160:865:::0;;;;;;;;;;;:::o;16487:41::-;;;:::o;34431:253::-;34575:21;34621:55;34652:7;34661:8;34671:4;34621:30;:55::i;22393:669::-;22682:16;22700:14;22727:12;22742:46;22767:7;22776:5;22783:4;22742:24;:46::i;:::-;22727:61;;22799:10;22812;:33;;22836:9;22812:33;;;-1:-1:-1;;22812:33:0;22856:80;;;-1:-1:-1;;;22856:80:0;;22884:10;22856:80;;;;22904:4;22856:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22799:46;;-1:-1:-1;;;;;;22856:27:0;;;;;:80;;;;;-1:-1:-1;;22856:80:0;;;;;;;;-1:-1:-1;22856:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;22856:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22856:80:0;;;;22974;22993:5;23000:9;23011:14;23027:12;23041:2;23045:8;22974:18;:80::i;:::-;22947:107;;;;-1:-1:-1;22393:669:0;-1:-1:-1;;;;;;;;;;;;;22393:669:0:o;18399:738::-;18687:12;18701;18715:14;18668:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;18763:85:::1;18777:6;18785;18793:14;18809;18825:10;18837;18763:13;:85::i;:::-;18742:106:::0;;-1:-1:-1;18742:106:0;-1:-1:-1;18859:12:0::1;18874:49;18899:7;18908:6:::0;18916;18874:24:::1;:49::i;:::-;18859:64;;18934:66;18966:6;18974:10;18986:4;18992:7;18934:31;:66::i;:::-;19011;19043:6;19051:10;19063:4;19069:7;19011:31;:66::i;:::-;19115:4;-1:-1:-1::0;;;;;19100:25:0::1;;19126:2;19100:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19100:29:0::1;-1:-1:-1::0;;;;;19100:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19100:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19100:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19100:29:0;18399:738;;;;-1:-1:-1;19100:29:0;;-1:-1:-1;18399:738:0;;-1:-1:-1;;;;;;;;;18399:738:0:o;19143:974::-;19396:16;19414:14;19430;19377:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;19484:176:::1;19512:5;19532:4;19551:18;19584:9;19608:14;19637:12;19484:13;:176::i;:::-;19457:203:::0;;-1:-1:-1;19457:203:0;-1:-1:-1;19671:12:0::1;19686:46;19711:7;19720:5:::0;19727:4:::1;19686:24;:46::i;:::-;19671:61;;19743:69;19775:5;19782:10;19794:4;19800:11;19743:31;:69::i;:::-;19829:4;-1:-1:-1::0;;;;;19823:19:0::1;;19850:9;19823:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19823:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19823:39:0;;;;;19886:4;-1:-1:-1::0;;;;;19880:20:0::1;;19901:4;19907:9;19880:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19880:37:0::1;-1:-1:-1::0;;;;;19880:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19880:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19880:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19880:37:0;19873:45:::1;;;;19956:4;-1:-1:-1::0;;;;;19941:25:0::1;;19967:2;19941:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19941:29:0::1;-1:-1:-1::0;;;;;19941:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19941:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19941:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19941:29:0;;-1:-1:-1;20021:9:0::1;:21:::0;-1:-1:-1;20017:92:0::1;;;20044:65;20075:10;20099:9;20087;:21;20044:30;:65::i;:::-;16699:1;19143:974:::0;;;;;;;;;;;:::o;29056:810::-;29269:21;29241:8;16644:15;16632:8;:27;;16624:64;;;;;-1:-1:-1;;;16624:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16624:64:0;;;;;;;;;;;;;;;29327:4:::1;-1:-1:-1::0;;;;;29316:15:0::1;:4;;29321:1;29316:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29316:7:0::1;-1:-1:-1::0;;;;;29316:15:0::1;;29308:57;;;::::0;;-1:-1:-1;;;29308:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29386:55;29416:7;29425:9;29436:4;;29386:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29386:29:0::1;::::0;-1:-1:-1;;;29386:55:0:i:1;:::-;29376:65;;29474:9;29460:7;29468:1;29460:10;;;;;;;;;;;;;;:23;;29452:75;;;;-1:-1:-1::0;;;29452:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29544:4;-1:-1:-1::0;;;;;29538:19:0::1;;29565:7;29573:1;29565:10;;;;;;;;;;;;;;29538:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29538:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29538:40:0;;;;;29602:4;-1:-1:-1::0;;;;;29596:20:0::1;;29617:51;29642:7;29651:4;;29656:1;29651:7;;;;;;29617:51;29670:7;29678:1;29670:10;;;;;;;;;;;;;;29596:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29596:85:0::1;-1:-1:-1::0;;;;;29596:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29596:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29596:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29596:85:0;29589:93:::1;;;;29693:24;29699:7;29708:4;;29693:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29714:2:0;;-1:-1:-1;29693:5:0::1;::::0;-1:-1:-1;;29693:24:0:i:1;:::-;29780:7;29788:1;29780:10;;;;;;;;;;;;;;29768:9;:22;29764:94;;;29792:66;29823:10;29847:7;29855:1;29847:10;;;;;;;;;;;;;;29835:9;:22;29792:30;:66::i;670:361::-:0;865:45;;;-1:-1:-1;;;;;865:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;865:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;865:45:0;179:29:-1;160:49;;854:57:0;;;;819:12;;833:17;;854:10;;;;865:45;854:57;;;25:18:-1;854:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;854:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;818:93:0;;;;930:7;:57;;;;-1:-1:-1;942:11:0;;:16;;:44;;;973:4;962:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;962:24:0;942:44;922:101;;;;;-1:-1:-1;;;922:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;670:361;;;;;:::o;1449:195::-;1557:12;;;1519;1557;;;;;;;;;-1:-1:-1;;;;;1536:7:0;;;1550:5;;1536:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1536:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1518:52:0;;;1589:7;1581:55;;;;-1:-1:-1;;;1581:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1449:195;;;:::o;12859:519::-;12952:14;12998:1;12987:8;:12;12979:68;;;;-1:-1:-1;;;12979:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13078:1;13066:9;:13;:31;;;;;13096:1;13083:10;:14;13066:31;13058:84;;;;-1:-1:-1;;;13058:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13153:20;13176:18;:8;13189:4;13176:18;:12;:18;:::i;:::-;13153:41;-1:-1:-1;13205:14:0;13222:31;13153:41;13242:10;13222:31;:19;:31;:::i;:::-;13205:48;-1:-1:-1;13264:16:0;13283:41;13308:15;13283:20;:9;13297:5;13283:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;13264:60;;13359:11;13347:9;:23;;;;;;;12859:519;-1:-1:-1;;;;;;;12859:519:0:o;14055:511::-;14156:21;14213:1;14198:4;:11;:16;;14190:59;;;;;-1:-1:-1;;;14190:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14281:4;:11;14270:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14270:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14270:23:0;;14260:33;;14317:8;14304:7;14312:1;14304:10;;;;;;;;;;;;;:21;;;;;14341:6;14336:223;14367:1;14353:4;:11;:15;14349:1;:19;14336:223;;;14391:14;14407:15;14426:42;14438:7;14447:4;14452:1;14447:7;;;;;;;;;;;;;;14456:4;14461:1;14465;14461:5;14456:11;;;;;;;;;;;;;;14426;:42::i;:::-;14390:78;;;;14500:47;14513:7;14521:1;14513:10;;;;;;;;;;;;;;14525:9;14536:10;14500:12;:47::i;:::-;14483:7;14491:1;14495;14491:5;14483:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14370:3:0;;14336:223;;;;14055:511;;;;;:::o;11333:478::-;11422:12;11448:14;11464;11482:26;11493:6;11501;11482:10;:26::i;:::-;11646:32;;;-1:-1:-1;;11646:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11646:32:0;;;;;11636:43;;;;;;11549:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11549:251:0;;;;;;;11539:262;;;;;;;;;11333:478;-1:-1:-1;;;;;11333:478:0:o;1039:402::-;1264:51;;;-1:-1:-1;;;;;1264:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1264:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;-1:-1;;;179:29;160:49;;1253:63:0;;;;1218:12;;1232:17;;1253:10;;;;1264:51;1253:63;;;25:18:-1;1253:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1253:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1217:99:0;;;;1335:7;:57;;;;-1:-1:-1;1347:11:0;;:16;;:44;;;1378:4;1367:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1367:24:0;1347:44;1327:106;;;;-1:-1:-1;;;1327:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1039:402;;;;;;:::o;24676:735::-;24783:6;24778:626;24809:1;24795:4;:11;:15;24791:1;:19;24778:626;;;24833:13;24848:14;24867:4;24872:1;24867:7;;;;;;;;;;;;;;24876:4;24881:1;24885;24881:5;24876:11;;;;;;;;;;;;;;24832:56;;;;24904:14;24923:42;24951:5;24958:6;24923:27;:42::i;:::-;24903:62;;;24980:14;24997:7;25005:1;25009;25005:5;24997:14;;;;;;;;;;;;;;24980:31;;25027:15;25044;25072:6;-1:-1:-1;;;;;25063:15:0;:5;-1:-1:-1;;;;;25063:15:0;;:61;;25105:9;25121:1;25063:61;;;25087:1;25091:9;25063:61;25026:98;;;;25139:10;25170:1;25156:4;:11;:15;25152:1;:19;:82;;25231:3;25152:82;;;25174:54;25199:7;25208:6;25216:4;25221:1;25225;25221:5;25216:11;;;;;;;;;;;;;;25174:24;:54::i;:::-;25139:95;;25264:48;25289:7;25298:5;25305:6;25264:24;:48::i;:::-;-1:-1:-1;;;;;25249:69:0;;25337:10;25349;25361:2;25375:1;25365:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25365:12:0;87:42:-1;143:17;;-1:-1;25365:12:0;;25249:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25249:143:0;-1:-1:-1;;;;;25249:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25249:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25249:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24812:3:0;;;;;-1:-1:-1;24778:626:0;;-1:-1:-1;;;;;;;;24778:626:0;;;24676:735;;;:::o;14647:532::-;14748:21;14805:1;14790:4;:11;:16;;14782:59;;;;;-1:-1:-1;;;14782:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14873:4;:11;14862:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14862:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14862:23:0;;14852:33;;14926:9;14896:7;14921:1;14904:7;:14;:18;14896:27;;;;;;;;;;;;;;;;;:39;14960:11;;-1:-1:-1;;14960:15:0;14946:226;14977:5;;14946:226;;15005:14;15021:15;15040:42;15052:7;15061:4;15070:1;15066;:5;15061:11;;;;;;;;;;;;;;15074:4;15079:1;15074:7;;;;;;;15040:42;15004:78;;;;15114:46;15126:7;15134:1;15126:10;;;;;;;;;;;;;;15138:9;15149:10;15114:11;:46::i;:::-;15097:7;15109:1;15105;:5;15097:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14984:3:0;14946:226;;30013:1214;30126:6;30121:1099;30152:1;30138:4;:11;:15;30134:1;:19;30121:1099;;;30176:13;30191:14;30210:4;30215:1;30210:7;;;;;;;;;;;;;;30219:4;30224:1;30228;30224:5;30219:11;;;;;;;;;;;;;;30175:56;;;;30247:14;30266:42;30294:5;30301:6;30266:27;:42::i;:::-;30246:62;;;30323:19;30360:48;30385:7;30394:5;30401:6;30360:24;:48::i;:::-;30323:86;;30424:16;30455:17;30543:13;30558;30576:4;-1:-1:-1;;;;;30576:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30576:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30576:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30576:18:0;;;;;;;30542:52;;;;;-1:-1:-1;30542:52:0;;-1:-1:-1;30610:17:0;;-1:-1:-1;;;;;30651:15:0;;;;;;;:61;;30693:8;30703;30651:61;;;30670:8;30680;30651:61;30609:103;;;;30741:56;30784:12;30748:5;-1:-1:-1;;;;;30741:23:0;;30773:4;30741:38;;;;;;;;;;;;;-1:-1:-1;;;;;30741:38:0;-1:-1:-1;;;;;30741:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30741:56:0;30727:70;;30827:71;30857:11;30870:12;30884:13;30827:29;:71::i;:::-;30812:86;;30121:1099;;;;30929:15;30946;30974:6;-1:-1:-1;;;;;30965:15:0;:5;-1:-1:-1;;;;;30965:15:0;;:67;;31010:12;31029:1;30965:67;;;30989:1;30993:12;30965:67;30928:104;;;;31047:10;31078:1;31064:4;:11;:15;31060:1;:19;:82;;31139:3;31060:82;;;31082:54;31107:7;31116:6;31124:4;31129:1;31133;31129:5;31124:11;;;;;;;31082:54;31195:12;;;31205:1;31195:12;;;;;;;;;;31157:51;;;;;;;;;;;;;;;-1:-1:-1;;;;;31157:51:0;;;;;;;;;;;;;;;;;;;;;;31047:95;;-1:-1:-1;31157:9:0;;;;;;31167:10;;31179;;31047:95;;31195:12;;31157:51;;;;;;;;31195:12;;31157:51;;;;31195:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31157:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31157:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;30155:3:0;;;;;-1:-1:-1;30121:1099:0;;-1:-1:-1;;;;;;;;;;30121:1099:0;7826:129;7910:5;;;7905:16;;;;7897:50;;;;;-1:-1:-1;;;7897:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13499:474;13592:13;13638:1;13626:9;:13;13618:70;;;;-1:-1:-1;;;13618:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13719:1;13707:9;:13;:31;;;;;13737:1;13724:10;:14;13707:31;13699:84;;;;-1:-1:-1;;;13699:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13794:14;13811:35;13840:5;13811:24;:9;13825;13811:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13794:52;-1:-1:-1;13857:16:0;13876:35;13906:4;13876:25;:10;13891:9;13876:25;:14;:25;:::i;:35::-;13857:54;;13933:32;13963:1;13946:11;13934:9;:23;;;;;;;13933:32;:29;:32;:::i;:::-;13922:43;13499:474;-1:-1:-1;;;;;;13499:474:0:o;12416:321::-;12498:12;12541:1;12531:7;:11;12523:61;;;;-1:-1:-1;;;12523:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12614:1;12603:8;:12;:28;;;;;12630:1;12619:8;:12;12603:28;12595:81;;;;-1:-1:-1;;;12595:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12721:8;12697:21;:7;12709:8;12697:21;:11;:21;:::i;:::-;:32;;;;;;;12416:321;-1:-1:-1;;;;12416:321:0:o;10892:349::-;10967:14;10983;11028:6;-1:-1:-1;;;;;11018:16:0;:6;-1:-1:-1;;;;;11018:16:0;;;11010:66;;;;-1:-1:-1;;;11010:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11115:6;-1:-1:-1;;;;;11106:15:0;:6;-1:-1:-1;;;;;11106:15:0;;:53;;11144:6;11152;11106:53;;;11125:6;11133;11106:53;11087:72;;-1:-1:-1;11087:72:0;-1:-1:-1;;;;;;11178:20:0;;11170:63;;;;;-1:-1:-1;;;11170:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10892:349;;;;;:::o;17003:1390::-;17316:50;;;;;;-1:-1:-1;;;;;17316:50:0;;;;;;;;;;;;;;;;17221:12;;;;;;17334:7;17316:34;;;;;;:50;;;;;;;;;;;;;;;:34;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;17316:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17316:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17316:50:0;-1:-1:-1;;;;;17316:64:0;;17312:150;;;17397:53;;;;;;-1:-1:-1;;;;;17397:53:0;;;;;;;;;;;;;;;;17415:7;17397:37;;;;;;:53;;;;;;;;;;;;;;;-1:-1:-1;17397:37:0;:53;;;2:2:-1;;;;27:1;24;17:12;2:2;17397:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17397:53:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17312:150:0;17473:13;17488;17505:53;17534:7;17543:6;17551;17505:28;:53::i;:::-;17472:86;;;;17573:8;17585:1;17573:13;:30;;;;-1:-1:-1;17590:13:0;;17573:30;17569:817;;;17642:14;;-1:-1:-1;17658:14:0;;-1:-1:-1;17569:817:0;;;17706:19;17728:58;17751:14;17767:8;17777;17728:22;:58::i;:::-;17706:80;;17823:14;17805;:32;17801:574;;17884:10;17866:14;:28;;17858:79;;;;-1:-1:-1;;;17858:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17978:14;;-1:-1:-1;17994:14:0;-1:-1:-1;17994:14:0;17801:574;;;18050:19;18072:58;18095:14;18111:8;18121;18072:22;:58::i;:::-;18050:80;;18174:14;18156;:32;;18149:40;;;;18234:10;18216:14;:28;;18208:79;;;;-1:-1:-1;;;18208:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18328:14;-1:-1:-1;18344:14:0;;-1:-1:-1;17801:574:0;17569:817;;17003:1390;;;;;;;;;;;:::o;7963:142::-;8015:6;8042;;;:30;;-1:-1:-1;;8057:5:0;;;8071:1;8066;8057:5;8066:1;8052:15;;;;;:20;8042:30;8034:63;;;;;-1:-1:-1;;;8034:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7690:128;7774:5;;;7769:16;;;;7761:49;;;;;-1:-1:-1;;;7761:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11869:434;11962:13;11977;12004:14;12023:26;12034:6;12042;12023:10;:26::i;:::-;12003:46;;;12060:32;12068:7;12077:6;12085;12060:7;:32::i;:::-;;12104:13;12119;12152:32;12160:7;12169:6;12177;12152:7;:32::i;:::-;-1:-1:-1;;;;;12137:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12137:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12137:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12137:62:0;;;;;;;12103:96;;;;;-1:-1:-1;12103:96:0;;-1:-1:-1;;;;;;12233:16:0;;;;;;;:62;;12276:8;12286;12233:62;;;12253:8;12263;12233:62;12210:85;;;;-1:-1:-1;11869:434:0;-1:-1:-1;;;;;;;11869:434:0:o

Swarm Source

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