Contract 0x95111118bd0B4F82CB6E8Ca2533571acb5ce99A7

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x650b26d808cc524cd7950cac159e444f769e3d0e908aa9e274f10518c90972b1Remove Liquidity...586417542023-02-06 23:57:411 day 6 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00023042
0xfff0da7e57980f2b4ede8c4a050fa65500bda79699e43f6a541e3efa485638d4Remove Liquidity568053252023-01-31 5:19:198 days 1 hr ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00010558
0x52d199e4db668a169873504f686231736be97b52814ef1b4db50757d4b67e89eRemove Liquidity...568016372023-01-31 4:53:478 days 1 hr ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00010441
0x0ee8ed60a8141546d8ac0c82b987e68165f9b6b58c2d18884c1b55ce289f483eRemove Liquidity566090852023-01-30 11:06:208 days 19 hrs ago0x9e7685da4effbe6a35266989f4f3040dc39c36ed IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006696
0xa5adf30811826023375229e89315ef6e1d921dd6512e6fdc1434472a2d9071ecRemove Liquidity564464502023-01-29 19:59:549 days 10 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00008921
0xa42670059fbc3ac6f51af89e64aaaccbde5e169b5ef42ea618560c8f8f14b870Remove Liquidity...564448662023-01-29 19:51:439 days 10 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00007818
0xfa07d1cf7956869373a02037e1405f5e1e0dcbc037ba571348e3c6a8c7ac7f76Remove Liquidity548941302023-01-23 10:33:0815 days 20 hrs ago0x8d543f1a3c4c38075499083c2e9a6de0110c53ab IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00004783
0x2dcede328d9690131c1a1e179093e91d255b42e0316716bc046fa6ed81b70631Remove Liquidity...547707422023-01-22 18:36:1916 days 12 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00011048
0xb2268d1d1c705a6889b694fd05b98f47cf46fe6a6afd811ca925bf0a35b0eaa6Swap Tokens For ...546634362023-01-22 7:31:0716 days 23 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005173
0xd8fad9e58c0bec58363bf3898e1788532ec47b54576f7e644244fa984d410d7dRemove Liquidity546627792023-01-22 7:26:4116 days 23 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005343
0x05b3f9a9dd64f50e6d77156678bc1e011d0bf5dc1c4f272070811cbaa76ba712Remove Liquidity545563662023-01-21 18:18:2917 days 12 hrs ago0x8d543f1a3c4c38075499083c2e9a6de0110c53ab IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006222
0x346cbbe670b6fcfc6cce04ae4460153c5e53a2a1410fc4ad695db72f02667618Remove Liquidity545427232023-01-21 16:58:0217 days 13 hrs ago0x8d543f1a3c4c38075499083c2e9a6de0110c53ab IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006766
0xd9f4a61fabbd126cb0d1fd4095623ee33199744e83629335bef295f7da659c5dRemove Liquidity545408282023-01-21 16:46:2917 days 13 hrs ago0x8d543f1a3c4c38075499083c2e9a6de0110c53ab IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006628
0x15d8be61df3aacbf9d8daae3afae5506cd9da170b96b542ed8b6c707d8fc3d3cRemove Liquidity545058992023-01-21 13:04:2017 days 17 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005987
0x43b79bac0ffc30b40968508c1057235577416ba3c2371c175deccda22d132825Remove Liquidity542876022023-01-20 13:05:4618 days 17 hrs ago0xdaf1725b89f983fdd1b8014006055a665b727273 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006315
0x7e1cda5920aba926402257434c8db95aaeed350f79b155e824d00e116fa3d64fRemove Liquidity...542854332023-01-20 12:55:5218 days 17 hrs ago0xdaf1725b89f983fdd1b8014006055a665b727273 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00004657
0x60448047d821412b0820cddfa086a5ae76496ad3d9b6190dd88970fd22f2f73aRemove Liquidity542193362023-01-20 4:33:0619 days 2 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005518
0x8f03afede1626beaa4e5d45b278f13e03f55060b847bf7a3c7ed01eb2000c048Remove Liquidity542189432023-01-20 4:28:5219 days 2 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005825
0x95941ade49a4d545c0e60537479926d86e4d70ae40651a3dc5be7894cba716d7Remove Liquidity542183852023-01-20 4:23:3219 days 2 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005827
0x8078ed5899060b3162d9ab90c98c1615ddbe7f630c0c21a6f174e3efd458866eRemove Liquidity542164922023-01-20 4:03:0519 days 2 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005867
0x453a9c1c0421d9cd4dd41503ae58c8d57c8f79534de03ae23c5c30bb1f108e6cRemove Liquidity542163202023-01-20 4:01:2119 days 2 hrs ago0xd1fffc19392b7cb02ab1186fb2018ab813037571 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00005867
0x6d8b9d1dcac97ac1743b87e007663f0109f9ba792a543b42554c00d1ba8d37a0Remove Liquidity537262772023-01-17 16:26:5321 days 14 hrs ago0xcaa67cb622475c328be6a77e034096c6a67c3cfb IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00015397
0x2053132b147ccd98bf95d5108d672ae23d85af504b0e1ed19b60139d575b2338Remove Liquidity537127832023-01-17 15:09:5321 days 15 hrs ago0xaec52cad1e7b8f3c21f38a312fa3998839d3c2c8 IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00010538
0xeab6d1055744e55e81495d9f8050a50b254de303785537c597760e5e64efc655Remove Liquidity537044152023-01-17 14:28:3021 days 16 hrs ago0x344fa9fb177ab5fae90f85a434aa9b277009c72b IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00006775
0x6f16dea1783908ac1f5b2587733cf0efb3961f17e6df415c0ea9361bb2141a2fRemove Liquidity536585722023-01-17 9:38:0321 days 21 hrs ago0x71a240f4ff7d2aad954c8c748f5f2f387f5c08df IN  0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH0.00007082
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70x4ef3d10be7c34e96dfb0d2e3bf39367beaefd6d70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xefabbc8a439f1044be81631a18c4bb1cdea3767b58a9f2aa5a3bd59f661bbe77590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70x4ef3d10be7c34e96dfb0d2e3bf39367beaefd6d70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0xbee56e829b715099483962bda216220a6e2c0ac1786fe37d2699d9aaed956b4f590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70x4ef3d10be7c34e96dfb0d2e3bf39367beaefd6d70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x47b3d3faa83652e599b26bf1e96ef215c3f6e80cdda06d9f149ad9646e9d62c9590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
0x23e61dd668614af341138e02ef814d009cc6eda8e41b735353de0acba25cac85590216622023-02-08 6:38:2635 secs ago 0x8889524a8a86f68f3ad0116c9375e1a2a14284d6 0x95111118bd0b4f82cb6e8ca2533571acb5ce99a70 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SugarSwapRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-01-04
*/

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

pragma solidity >=0.5.0;

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

pragma solidity >=0.5.0;

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

pragma solidity >=0.6.2;

interface ISugarSwapRouter {
  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);

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

pragma solidity >=0.5.0;

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

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::safeApprove::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::safeTransfer::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::safeTransferFrom::TRANSFER_FROM_FAILED');
  }

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

pragma solidity =0.6.12;

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

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

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

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

pragma solidity >=0.5.0;

library SugarSwapLibrary {
  using SugarSwapSafeMath for uint256;

  // 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, "SugarSwapLibrary::sortTokens::IDENTICAL_ADDRESSES");
    (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    require(token0 != address(0), "SugarSwapLibrary::sortTokens::ZERO_ADDRESS");
  }

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

  // fetches and sorts the reserves for a pair
  function getReserves(
    address factory,
    address tokenA,
    address tokenB
  ) internal view returns (uint256 reserveA, uint256 reserveB) {
    (address token0, ) = sortTokens(tokenA, tokenB);
    (uint256 reserve0, uint256 reserve1, ) = ISugarSwapPair(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(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) internal pure returns (uint256 amountB) {
    require(amountA > 0, "SugarSwapLibrary::quote::INSUFFICIENT_AMOUNT");
    require(reserveA > 0 && reserveB > 0, "SugarSwapLibrary::quote::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(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) internal pure returns (uint256 amountOut) {
    require(amountIn > 0, "SugarSwapLibrary::getAmountOut::INSUFFICIENT_INPUT_AMOUNT");
    require(reserveIn > 0 && reserveOut > 0, "SugarSwapLibrary::getAmountOut::INSUFFICIENT_LIQUIDITY");
    uint256 amountInWithFee = amountIn.mul(9975);
    uint256 numerator = amountInWithFee.mul(reserveOut);
    uint256 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(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) internal pure returns (uint256 amountIn) {
    require(amountOut > 0, "SugarSwapLibrary::getAmountIn::INSUFFICIENT_OUTPUT_AMOUNT");
    require(reserveIn > 0 && reserveOut > 0, "SugarSwapLibrary::getAmountIn::INSUFFICIENT_LIQUIDITY");
    uint256 numerator = reserveIn.mul(amountOut).mul(10000);
    uint256 denominator = reserveOut.sub(amountOut).mul(9975);
    amountIn = (numerator / denominator).add(1);
  }

  // performs chained getAmountOut calculations on any number of pairs
  function getAmountsOut(
    address factory,
    uint256 amountIn,
    address[] memory path
  ) internal view returns (uint256[] memory amounts) {
    require(path.length >= 2, "SugarSwapLibrary::getAmountsOut::INVALID_PATH");
    amounts = new uint256[](path.length);
    amounts[0] = amountIn;
    for (uint256 i; i < path.length - 1; i++) {
      (uint256 reserveIn, uint256 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,
    uint256 amountOut,
    address[] memory path
  ) internal view returns (uint256[] memory amounts) {
    require(path.length >= 2, "SugarSwapLibrary::getAmountsIn::INVALID_PATH");
    amounts = new uint256[](path.length);
    amounts[amounts.length - 1] = amountOut;
    for (uint256 i = path.length - 1; i > 0; i--) {
      (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);
      amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
    }
  }
}

pragma solidity =0.6.12;

contract SugarSwapRouter is ISugarSwapRouter {
  using SugarSwapSafeMath for uint256;

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

  modifier ensure(uint256 deadline) {
    require(deadline >= block.timestamp, "SugarSwapRouter::ensure::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,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin
  ) internal virtual returns (uint256 amountA, uint256 amountB) {
    // create the pair if it doesn't exist yet
    if (ISugarSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
      ISugarSwapFactory(factory).createPair(tokenA, tokenB);
    }
    (uint256 reserveA, uint256 reserveB) = SugarSwapLibrary.getReserves(factory, tokenA, tokenB);
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
    } else {
      uint256 amountBOptimal = SugarSwapLibrary.quote(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        require(amountBOptimal >= amountBMin, "SugarSwapRouter::_addLiquidity::INSUFFICIENT_B_AMOUNT");
        (amountA, amountB) = (amountADesired, amountBOptimal);
      } else {
        uint256 amountAOptimal = SugarSwapLibrary.quote(amountBDesired, reserveB, reserveA);
        assert(amountAOptimal <= amountADesired);
        require(amountAOptimal >= amountAMin, "SugarSwapRouter::_addLiquidity::INSUFFICIENT_A_AMOUNT");
        (amountA, amountB) = (amountAOptimal, amountBDesired);
      }
    }
  }

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    )
  {
    (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
    address pair = SugarSwapLibrary.pairFor(factory, tokenA, tokenB);
    TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
    TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
    liquidity = ISugarSwapPair(pair).mint(to);
  }

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    virtual
    override
    ensure(deadline)
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    )
  {
    (amountToken, amountETH) = _addLiquidity(token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin);
    address pair = SugarSwapLibrary.pairFor(factory, token, WETH);
    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
    IWETH(WETH).deposit{ value: amountETH }();
    assert(IWETH(WETH).transfer(pair, amountETH));
    liquidity = ISugarSwapPair(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,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
    address pair = SugarSwapLibrary.pairFor(factory, tokenA, tokenB);
    ISugarSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
    (uint256 amount0, uint256 amount1) = ISugarSwapPair(pair).burn(to);
    (address token0, ) = SugarSwapLibrary.sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, "SugarSwapRouter::removeLiquidity::INSUFFICIENT_A_AMOUNT");
    require(amountB >= amountBMin, "SugarSwapRouter::removeLiquidity::INSUFFICIENT_B_AMOUNT");
  }

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 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,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountA, uint256 amountB) {
    address pair = SugarSwapLibrary.pairFor(factory, tokenA, tokenB);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ISugarSwapPair(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,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
    address pair = SugarSwapLibrary.pairFor(factory, token, WETH);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ISugarSwapPair(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,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) public virtual override ensure(deadline) returns (uint256 amountETH) {
    (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
    TransferHelper.safeTransfer(token, to, ISugarSwapBEP20(token).balanceOf(address(this)));
    IWETH(WETH).withdraw(amountETH);
    TransferHelper.safeTransferETH(to, amountETH);
  }

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external virtual override returns (uint256 amountETH) {
    address pair = SugarSwapLibrary.pairFor(factory, token, WETH);
    uint256 value = approveMax ? uint256(-1) : liquidity;
    ISugarSwapPair(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(
    uint256[] memory amounts,
    address[] memory path,
    address _to
  ) internal virtual {
    for (uint256 i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0, ) = SugarSwapLibrary.sortTokens(input, output);
      uint256 amountOut = amounts[i + 1];
      (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0));
      address to = i < path.length - 2 ? SugarSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
      ISugarSwapPair(SugarSwapLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = SugarSwapLibrary.getAmountsOut(factory, amountIn, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "SugarSwapRouter::swapExactTokensForTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      SugarSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, to);
  }

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= amountInMax, "SugarSwapRouter::swapTokensForExactTokens::EXCESSIVE_INPUT_AMOUNT");
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      SugarSwapLibrary.pairFor(factory, path[0], path[1]),
      amounts[0]
    );
    _swap(amounts, path, to);
  }

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[0] == WETH, "SugarSwapRouter::swapExactETHForTokens::INVALID_PATH");
    amounts = SugarSwapLibrary.getAmountsOut(factory, msg.value, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "SugarSwapRouter::swapExactETHForTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    IWETH(WETH).deposit{ value: amounts[0] }();
    assert(IWETH(WETH).transfer(SugarSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
    _swap(amounts, path, to);
  }

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[path.length - 1] == WETH, "SugarSwapRouter::swapTokensForExactETH::INVALID_PATH");
    amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= amountInMax, "SugarSwapRouter::swapTokensForExactETH::EXCESSIVE_INPUT_AMOUNT");
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      SugarSwapLibrary.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(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[path.length - 1] == WETH, "SugarSwapRouter::swapExactTokensForETH::INVALID_PATH");
    amounts = SugarSwapLibrary.getAmountsOut(factory, amountIn, path);
    require(
      amounts[amounts.length - 1] >= amountOutMin,
      "SugarSwapRouter:swapExactTokensForETH::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    TransferHelper.safeTransferFrom(
      path[0],
      msg.sender,
      SugarSwapLibrary.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(
    uint256 amountOut,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
    require(path[0] == WETH, "SugarSwapRouter::swapETHForExactTokens::INVALID_PATH");
    amounts = SugarSwapLibrary.getAmountsIn(factory, amountOut, path);
    require(amounts[0] <= msg.value, "SugarSwapRouter::swapETHForExactTokens::EXCESSIVE_INPUT_AMOUNT");
    IWETH(WETH).deposit{ value: amounts[0] }();
    assert(IWETH(WETH).transfer(SugarSwapLibrary.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 (uint256 i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0, ) = SugarSwapLibrary.sortTokens(input, output);
      ISugarSwapPair pair = ISugarSwapPair(SugarSwapLibrary.pairFor(factory, input, output));
      uint256 amountInput;
      uint256 amountOutput;
      {
        // scope to avoid stack too deep errors
        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
        (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
        amountInput = ISugarSwapBEP20(input).balanceOf(address(pair)).sub(reserveInput);
        amountOutput = SugarSwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
      }
      (uint256 amount0Out, uint256 amount1Out) = input == token0
        ? (uint256(0), amountOutput)
        : (amountOutput, uint256(0));
      address to = i < path.length - 2 ? SugarSwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    TransferHelper.safeTransferFrom(path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn);
    uint256 balanceBefore = ISugarSwapBEP20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to);
    require(
      ISugarSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      "SugarSwapRouter::swapExactTokensForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
  }

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable virtual override ensure(deadline) {
    require(path[0] == WETH, "SugarSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INVALID_PATH");
    uint256 amountIn = msg.value;
    IWETH(WETH).deposit{ value: amountIn }();
    assert(IWETH(WETH).transfer(SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn));
    uint256 balanceBefore = ISugarSwapBEP20(path[path.length - 1]).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(path, to);
    require(
      ISugarSwapBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
      "SugarSwapRouter::swapExactETHForTokensSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
  }

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external virtual override ensure(deadline) {
    require(
      path[path.length - 1] == WETH,
      "SugarSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INVALID_PATH"
    );
    TransferHelper.safeTransferFrom(path[0], msg.sender, SugarSwapLibrary.pairFor(factory, path[0], path[1]), amountIn);
    _swapSupportingFeeOnTransferTokens(path, address(this));
    uint256 amountOut = ISugarSwapBEP20(WETH).balanceOf(address(this));
    require(
      amountOut >= amountOutMin,
      "SugarSwapRouter::swapExactTokensForETHSupportingFeeOnTransferTokens::INSUFFICIENT_OUTPUT_AMOUNT"
    );
    IWETH(WETH).withdraw(amountOut);
    TransferHelper.safeTransferETH(to, amountOut);
  }

  // **** LIBRARY FUNCTIONS ****
  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure virtual override returns (uint256 amountB) {
    return SugarSwapLibrary.quote(amountA, reserveA, reserveB);
  }

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure virtual override returns (uint256 amountOut) {
    return SugarSwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
  }

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure virtual override returns (uint256 amountIn) {
    return SugarSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
  }

  function getAmountsOut(uint256 amountIn, address[] memory path)
    external
    view
    virtual
    override
    returns (uint256[] memory amounts)
  {
    return SugarSwapLibrary.getAmountsOut(factory, amountIn, path);
  }

  function getAmountsIn(uint256 amountOut, address[] memory path)
    external
    view
    virtual
    override
    returns (uint256[] memory amounts)
  {
    return SugarSwapLibrary.getAmountsIn(factory, amountOut, path);
  }
}

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004cb538038062004cb58339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614b30620001856000398061015f5280610ce45280610d1f5280610e16528061103052806113ba528061151c52806118cb52806119a25280611a7c5280611b4a5280611c8c5280611d145280611f505280611fcb528061207f528061214b52806121dc5280612250528061277052806129da5280612a305280612a645280612ad85280612c665280612da55280612e2d525080610ea05280610f7752806110f6528061112f528061126a528061144452806114fa528061166a5280611bd95280611d465280611ea0528061228252806124fd52806126f5528061271e528061274e52806128bb5280612a0e5280612cf55280612e5f52806136b952806136fc52806139c05280613b365280613f035280613fbc528061406f5250614b306000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110ef945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611125565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b03813516906020013561121f565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136a565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114f2565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611600565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561187d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b02565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e48565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e55565b34801561088157600080fd5b5061088a611f4e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f72565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f7f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612105565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124af565b348015610a1c57600080fd5b5061088a6126f3565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612717945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612744565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612858565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561298b565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c1e565b6000808242811015610cde576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124af565b9093509150610d1d898685612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130e7565b50965096945050505050565b6000610dbe8484846131df565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9b5760405162461bcd60e51b81526004018080602001828103825260348152602001806143116034913960400191505060405180910390fd5b610ef97f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110610f0c57fe5b60200260200101511015610f515760405162461bcd60e51b81526004018080602001828103825260418152602001806144856041913960600191505060405180910390fd5b610fef86866000818110610f6157fe5b905060200201356001600160a01b031633610fd57f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa357fe5b905060200201356001600160a01b03168b8b6001818110610fc057fe5b905060200201356001600160a01b03166133ed565b85600081518110610fe257fe5b60200260200101516134ad565b61102e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061360a915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061106d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050506110e484836001855103815181106110d757fe5b60200260200101516130e7565b509695505050505050565b606061111c7f00000000000000000000000000000000000000000000000000000000000000008484613847565b90505b92915050565b60008060006111557f00000000000000000000000000000000000000000000000000000000000000008f8f6133ed565b9050600087611164578c611168565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111de57600080fd5b505af11580156111f2573d6000803e3d6000fd5b505050506112058f8f8f8f8f8f8f6124af565b809450819550505050509b509b9950505050505050505050565b60608142811015611265576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6112c37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b915086826001845103815181106112d657fe5b6020026020010151101561131b5760405162461bcd60e51b81526004018080602001828103825260458152602001806148936045913960600191505060405180910390fd5b61132b86866000818110610f6157fe5b6110e48287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b606081428110156113b0576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ea57fe5b905060200201356001600160a01b03166001600160a01b03161461143f5760405162461bcd60e51b815260040180806020018281038252603481526020018061496c6034913960400191505060405180910390fd5b61149d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b915086826000815181106114ad57fe5b60200260200101511115610f515760405162461bcd60e51b815260040180806020018281038252603e81526020018061478b603e913960400191505060405180910390fd5b6000806115407f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133ed565b905060008661154f578b611553565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b505050506115ef8d8d8d8d8d8d611f7f565b9d9c50505050505050505050505050565b8042811015611644576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6116b98585600081811061165457fe5b905060200201356001600160a01b0316336116b37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b905060200201356001600160a01b03168a8a6001818110610fc057fe5b8a6134ad565b6000858560001981018181106116cb57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d602081101561175157600080fd5b50516040805160208881028281018201909352888252929350611793929091899189918291850190849080828437600092019190915250889250613969915050565b8661183682888860001981018181106117a857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b505afa158015611818573d6000803e3d6000fd5b505050506040513d602081101561182e57600080fd5b505190613c6b565b10156118735760405162461bcd60e51b8152600401808060200182810382526062815260200180614a386062913960800191505060405180910390fd5b5050505050505050565b80428110156118c1576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106118fb57fe5b905060200201356001600160a01b03166001600160a01b0316146119505760405162461bcd60e51b81526004018080602001828103825260518152602001806145376051913960600191505060405180910390fd5b6119608585600081811061165457fe5b61199e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613969915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d6020811015611a3757600080fd5b5051905086811015611a7a5760405162461bcd60e51b815260040180806020018281038252605f8152602001806146cc605f913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b5050505061187384826130e7565b60608142811015611b48576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b7f57fe5b905060200201356001600160a01b03166001600160a01b031614611bd45760405162461bcd60e51b815260040180806020018281038252603481526020018061472b6034913960400191505060405180910390fd5b611c327f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132b792505050565b91508682600184510381518110611c4557fe5b60200260200101511015611c8a5760405162461bcd60e51b81526004018080602001828103825260428152602001806145b46042913960600191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cc657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cf957600080fd5b505af1158015611d0d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d727f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110611d7f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b505050506040513d6020811015611df757600080fd5b5051611dff57fe5b611e3e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b5095945050505050565b6000610dbe848484613cad565b60608142811015611e9b576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b611ef97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91508682600081518110611f0957fe5b6020026020010151111561131b5760405162461bcd60e51b815260040180806020018281038252604181526020018061468b6041913960600191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613d85565b60008142811015611fc5576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b611ff4887f000000000000000000000000000000000000000000000000000000000000000089898930896124af565b90508092505061207d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561204c57600080fd5b505afa158015612060573d6000803e3d6000fd5b505050506040513d602081101561207657600080fd5b5051612f93565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505050506110e484836130e7565b8042811015612149576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061218057fe5b905060200201356001600160a01b03166001600160a01b0316146121d55760405162461bcd60e51b81526004018080602001828103825260518152602001806144e66051913960600191505060405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561223557600080fd5b505af1158015612249573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122ae7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156122f557600080fd5b505af1158015612309573d6000803e3d6000fd5b505050506040513d602081101561231f57600080fd5b505161232757fe5b60008686600019810181811061233957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561239557600080fd5b505afa1580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b505160408051602089810282810182019093528982529293506124019290918a918a918291850190849080828437600092019190915250899250613969915050565b87612472828989600019810181811061241657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b10156118735760405162461bcd60e51b815260040180806020018281038252605f81526020018061437e605f913960600191505060405180910390fd5b60008082428110156124f6576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b60006125237f00000000000000000000000000000000000000000000000000000000000000008c8c6133ed565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561257e57600080fd5b505af1158015612592573d6000803e3d6000fd5b505050506040513d60208110156125a857600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b505050506040513d604081101561261f57600080fd5b508051602090910151909250905060006126398e8e613e2b565b509050806001600160a01b03168e6001600160a01b03161461265c57818361265f565b82825b90975095508a8710156126a35760405162461bcd60e51b81526004018080602001828103825260378152602001806149a06037913960400191505060405180910390fd5b898610156126e25760405162461bcd60e51b815260040180806020018281038252603781526020018061462a6037913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061111c7f000000000000000000000000000000000000000000000000000000000000000084846132b7565b60008060006127947f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133ed565b90506000876127a3578c6127a7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561281d57600080fd5b505af1158015612831573d6000803e3d6000fd5b505050506128438e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128a1576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b6128af8c8c8c8c8c8c613ef3565b909450925060006128e17f00000000000000000000000000000000000000000000000000000000000000008e8e6133ed565b90506128ef8d3383886134ad565b6128fb8c3383876134ad565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050506040513d602081101561297457600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129d4576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b612a028a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613ef3565b90945092506000612a547f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133ed565b9050612a628b3383886134ad565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612abd57600080fd5b505af1158015612ad1573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b505050506040513d6020811015612b7757600080fd5b5051612b7f57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040513d6020811015612bf857600080fd5b5051925034841015612c1057612c10338534036130e7565b505096509650969350505050565b60608142811015612c64576040805162461bcd60e51b815260206004820181905260248201526000805160206144c6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9b57fe5b905060200201356001600160a01b03166001600160a01b031614612cf05760405162461bcd60e51b81526004018080602001828103825260348152602001806145f66034913960400191505060405180910390fd5b612d4e7f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384792505050565b91503482600081518110612d5e57fe5b60200260200101511115612da35760405162461bcd60e51b815260040180806020018281038252603e8152602001806143dd603e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612ddf57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e8b7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169657fe5b84600081518110612e9857fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051612f1857fe5b612f578287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061360a915050565b81600081518110612f6457fe5b6020026020010151341115611e3e57611e3e3383600081518110612f8457fe5b602002602001015134036130e7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130105780518252601f199092019160209182019101612ff1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613072576040519150601f19603f3d011682016040523d82523d6000602084013e613077565b606091505b50915091508180156130a55750805115806130a557508080602001905160208110156130a257600080fd5b50515b6130e05760405162461bcd60e51b815260040180806020018281038252602d8152602001806148d8602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131335780518252601f199092019160209182019101613114565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613195576040519150601f19603f3d011682016040523d82523d6000602084013e61319a565b606091505b50509050806131da5760405162461bcd60e51b8152600401808060200182810382526034815260200180614a9a6034913960400191505060405180910390fd5b505050565b600080841161321f5760405162461bcd60e51b81526004018080602001828103825260398152602001806143456039913960400191505060405180910390fd5b60008311801561322f5750600082115b61326a5760405162461bcd60e51b81526004018080602001828103825260368152602001806149366036913960400191505060405180910390fd5b6000613278856126f7614184565b905060006132868285614184565b905060006132a08361329a88612710614184565b906141da565b90508082816132ab57fe5b04979650505050505050565b60606002825110156132fa5760405162461bcd60e51b815260040180806020018281038252602d8152602001806142e4602d913960400191505060405180910390fd5b815167ffffffffffffffff8111801561331257600080fd5b5060405190808252806020026020018201604052801561333c578160200160208202803683370190505b509050828160008151811061334d57fe5b60200260200101818152505060005b60018351038110156133e55760008061339f8786858151811061337b57fe5b602002602001015187866001018151811061339257fe5b602002602001015161421c565b915091506133c18484815181106133b257fe5b602002602001015183836131df565b8484600101815181106133d057fe5b6020908102919091010152505060010161335c565b509392505050565b60008060006133fc8585613e2b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f1c12c6027929a7a45a05eac77636e98ac3916558c848f89175d3f798d12cb8a8609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135325780518252601f199092019160209182019101613513565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613594576040519150601f19603f3d011682016040523d82523d6000602084013e613599565b606091505b50915091508180156135c75750805115806135c757508080602001905160208110156135c457600080fd5b50515b6136025760405162461bcd60e51b81526004018080602001828103825260368152602001806148246036913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138415760008084838151811061362857fe5b602002602001015185846001018151811061363f57fe5b60200260200101519150915060006136578383613e2b565b509050600087856001018151811061366b57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136995782600061369d565b6000835b91509150600060028a510388106136b457886136f5565b6136f57f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136e857fe5b60200260200101516133ed565b90506137227f000000000000000000000000000000000000000000000000000000000000000088886133ed565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561375f576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137c75781810151838201526020016137af565b50505050905090810190601f1680156137f45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381657600080fd5b505af115801561382a573d6000803e3d6000fd5b50506001909901985061360d975050505050505050565b50505050565b606060028251101561388a5760405162461bcd60e51b815260040180806020018281038252602c8152602001806149d7602c913960400191505060405180910390fd5b815167ffffffffffffffff811180156138a257600080fd5b506040519080825280602002602001820160405280156138cc578160200160208202803683370190505b50905082816001835103815181106138e057fe5b60209081029190910101528151600019015b80156133e5576000806139228786600186038151811061390e57fe5b602002602001015187868151811061339257fe5b9150915061394484848151811061393557fe5b60200260200101518383613cad565b84600185038151811061395357fe5b60209081029190910101525050600019016138f2565b60005b60018351038110156131da5760008084838151811061398757fe5b602002602001015185846001018151811061399e57fe5b60200260200101519150915060006139b68383613e2b565b50905060006139e67f000000000000000000000000000000000000000000000000000000000000000085856133ed565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a2757600080fd5b505afa158015613a3b573d6000803e3d6000fd5b505050506040513d6060811015613a5157600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613a87578284613a8a565b83835b91509150613adf828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180457600080fd5b9550613aec8683836131df565b945050505050600080856001600160a01b0316886001600160a01b031614613b1657826000613b1a565b6000835b91509150600060028c51038a10613b31578a613b65565b613b657f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136e857fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613bef578181015183820152602001613bd7565b50505050905090810190601f168015613c1c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c3e57600080fd5b505af1158015613c52573d6000803e3d6000fd5b50506001909b019a5061396c9950505050505050505050565b8082038281111561111f5760405162461bcd60e51b815260040180806020018281038252602d815260200180614ace602d913960400191505060405180910390fd5b6000808411613ced5760405162461bcd60e51b815260040180806020018281038252603981526020018061485a6039913960400191505060405180910390fd5b600083118015613cfd5750600082115b613d385760405162461bcd60e51b81526004018080602001828103825260358152602001806144506035913960400191505060405180910390fd5b6000613d50612710613d4a8688614184565b90614184565b90506000613d646126f7613d4a8689613c6b565b9050613d7b6001828481613d7457fe5b04906141da565b9695505050505050565b6000808411613dc55760405162461bcd60e51b815260040180806020018281038252602c815260200180614588602c913960400191505060405180910390fd5b600083118015613dd55750600082115b613e105760405162461bcd60e51b815260040180806020018281038252602f8152602001806147c9602f913960400191505060405180910390fd5b82613e1b8584614184565b81613e2257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613e7f5760405162461bcd60e51b81526004018080602001828103825260318152602001806149056031913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613e9f578284613ea2565b83835b90925090506001600160a01b038216613eec5760405162461bcd60e51b815260040180806020018281038252602a815260200180614661602a913960400191505060405180910390fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d6020811015613fa957600080fd5b50516001600160a01b03161415614067577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561403a57600080fd5b505af115801561404e573d6000803e3d6000fd5b505050506040513d602081101561406457600080fd5b50505b6000806140957f00000000000000000000000000000000000000000000000000000000000000008b8b61421c565b915091508160001480156140a7575080155b156140b757879350869250614177565b60006140c4898484613d85565b9050878111614117578581101561410c5760405162461bcd60e51b8152600401808060200182810382526035815260200180614a036035913960400191505060405180910390fd5b889450925082614175565b6000614124898486613d85565b90508981111561413057fe5b8781101561416f5760405162461bcd60e51b815260040180806020018281038252603581526020018061441b6035913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061419f5750508082028282828161419c57fe5b04145b61111f5760405162461bcd60e51b815260040180806020018281038252602c81526020018061475f602c913960400191505060405180910390fd5b8082018281101561111f5760405162461bcd60e51b815260040180806020018281038252602c8152602001806147f8602c913960400191505060405180910390fd5b600080600061422b8585613e2b565b50905060008061423c8888886133ed565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d606081101561429e57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146142d15780826142d4565b81815b9099909850965050505050505056fe5375676172537761704c6962726172793a3a676574416d6f756e74734f75743a3a494e56414c49445f50415448537567617253776170526f757465723a3a737761704578616374546f6b656e73466f724554483a3a494e56414c49445f504154485375676172537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f494e5055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e54537567617253776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f415f414d4f554e545375676172537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4c4951554944495459537567617253776170526f757465723a737761704578616374546f6b656e73466f724554483a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a656e737572653a3a45585049524544537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f50415448537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e56414c49445f504154485375676172537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a73776170455448466f724578616374546f6b656e733a3a494e56414c49445f50415448537567617253776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f425f414d4f554e545375676172537761704c6962726172793a3a736f7274546f6b656e733a3a5a45524f5f41444452455353537567617253776170526f757465723a3a73776170546f6b656e73466f724578616374546f6b656e733a3a4558434553534956455f494e5055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374455448466f72546f6b656e733a3a494e56414c49445f50415448537567617253776170536166654d6174683a3a6d756c3a3a64732d6d6174682d6d756c2d6f766572666c6f77537567617253776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a4558434553534956455f494e5055545f414d4f554e545375676172537761704c6962726172793a3a71756f74653a3a494e53554646494349454e545f4c4951554944495459537567617253776170536166654d6174683a3a6164643a3a64732d6d6174682d6164642d6f766572666c6f775472616e7366657248656c7065723a3a736166655472616e7366657246726f6d3a3a5452414e534645525f46524f4d5f4641494c45445375676172537761704c6962726172793a3a676574416d6f756e74496e3a3a494e53554646494349454e545f4f55545055545f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a3a5452414e534645525f4641494c45445375676172537761704c6962726172793a3a736f7274546f6b656e733a3a4944454e544943414c5f4144445245535345535375676172537761704c6962726172793a3a676574416d6f756e744f75743a3a494e53554646494349454e545f4c4951554944495459537567617253776170526f757465723a3a73776170546f6b656e73466f7245786163744554483a3a494e56414c49445f50415448537567617253776170526f757465723a3a72656d6f76654c69717569646974793a3a494e53554646494349454e545f415f414d4f554e545375676172537761704c6962726172793a3a676574416d6f756e7473496e3a3a494e56414c49445f50415448537567617253776170526f757465723a3a5f6164644c69717569646974793a3a494e53554646494349454e545f425f414d4f554e54537567617253776170526f757465723a3a737761704578616374546f6b656e73466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e733a3a494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665724554483a3a424e425f5452414e534645525f4641494c4544537567617253776170536166654d6174683a3a7375623a3a64732d6d6174682d7375622d756e646572666c6f77a26469706673582212205b3acaaca553f989097bc46638762fe6d0c8abdf10bf3021c1cc09de5e5a480364736f6c634300060c00330000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede700000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

0000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede700000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _factory (address): 0x1486397b3c0e6feb8c483fad2f03e8c404caede7
Arg [1] : _WETH (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001486397b3c0e6feb8c483fad2f03e8c404caede7
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

15450:18243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15915:10;-1:-1:-1;;;;;15929:4:0;15915:18;;15908:26;;;;15450:18243;;;;;19933:601;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19933:601:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32727:240;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32727:240:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26929:889;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26929:889:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26929:889:0;;;;;;;;;;;;-1:-1:-1;26929:889:0;-1:-1:-1;;;;;;26929:889:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33457:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33457:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33457:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33457:233:0;;-1:-1:-1;33457:233:0;;-1:-1:-1;;;;;33457:233:0:i;20540:664::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20540:664:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24070:658::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24070:658:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24070:658:0;;;;;;;;;;;;-1:-1:-1;24070:658:0;-1:-1:-1;;;;;;24070:658:0;;;;;;;;:::i;26076:847::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26076:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26076:847:0;;;;;;;;;;;;-1:-1:-1;26076:847:0;-1:-1:-1;;;;;;26076:847:0;;;;;;;;:::i;22529:731::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22529:731:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29969:719::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29969:719:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29969:719:0;;;;;;;;;;;;-1:-1:-1;29969:719:0;-1:-1:-1;;;;;;29969:719:0;;;;;;;;:::i;31572:893::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31572:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31572:893:0;;;;;;;;;;;;-1:-1:-1;31572:893:0;-1:-1:-1;;;;;;31572:893:0;;;;;;;;:::i;25355:715::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25355:715:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25355:715:0;;;;;;;;;;;;-1:-1:-1;25355:715:0;-1:-1:-1;;;;;;25355:715:0;;;;;;;;:::i;32973:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32973:239:0;;;;;;;;;;;;:::i;24734:615::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24734:615:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24734:615:0;;;;;;;;;;;;-1:-1:-1;24734:615:0;-1:-1:-1;;;;;;24734:615:0;;;;;;;;:::i;15588:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15588:38:0;;;;;;;;;;;;;;32505:216;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32505:216:0;;;;;;;;;;;;:::i;21945:578::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21945:578:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30694:872::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30694:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30694:872:0;;;;;;;;;;;;-1:-1:-1;30694:872:0;-1:-1:-1;;;;;;30694:872:0;;;;;;;;:::i;19063:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19063:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15542:41::-;;;;;;;;;;;;;:::i;33218:233::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33218:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33218:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33218:233:0;;-1:-1:-1;33218:233:0;;-1:-1:-1;;;;;33218:233:0:i;21210:660::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21210:660:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17347:762::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17347:762:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18115:909;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18115:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27824:799::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27824:799:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27824:799:0;;;;;;;;;;;;-1:-1:-1;27824:799:0;-1:-1:-1;;;;;;27824:799:0;;;;;;;;:::i;19933:601::-;20156:19;20177:17;20137:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;20230:150:::1;20254:5;20268:4;20281:9;20299:14;20322:12;20351:4;20365:8;20230:15;:150::i;:::-;20203:177:::0;;-1:-1:-1;20203:177:0;-1:-1:-1;20387:51:0::1;20415:5:::0;20422:2;20203:177;20387:27:::1;:51::i;:::-;20451:4;-1:-1:-1::0;;;;;20445:20:0::1;;20466:9;20445:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20483:45;20514:2;20518:9;20483:30;:45::i;:::-;19933:601:::0;;;;;;;;;;:::o;32727:240::-;32866:17;32899:62;32929:8;32939:9;32950:10;32899:29;:62::i;:::-;32892:69;32727:240;-1:-1:-1;;;;32727:240:0:o;26929:889::-;27137:24;27118:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27203:4:0::1;27178:29;:4:::0;;-1:-1:-1;;27183:15:0;;27178:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27178:21:0::1;-1:-1:-1::0;;;;;27178:29:0::1;;27170:94;;;;-1:-1:-1::0;;;27170:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27281:55;27312:7;27321:8;27331:4;;27281:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27281:30:0::1;::::0;-1:-1:-1;;;27281:55:0:i:1;:::-;27271:65;;27390:12;27359:7;27384:1;27367:7;:14;:18;27359:27;;;;;;;;;;;;;;:43;;27343:142;;;;-1:-1:-1::0;;;27343:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27492:152;27532:4;;27537:1;27532:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27532:7:0::1;27548:10;27567:51;27592:7;27601:4;;27606:1;27601:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27601:7:0::1;27610:4;;27615:1;27610:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27610:7:0::1;27567:24;:51::i;:::-;27627:7;27635:1;27627:10;;;;;;;;;;;;;;27492:31;:152::i;:::-;27651:35;27657:7;27666:4;;27651:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27680:4:0::1;::::0;-1:-1:-1;27651:5:0::1;::::0;-1:-1:-1;;27651:35:0:i:1;:::-;27699:4;-1:-1:-1::0;;;;;27693:20:0::1;;27714:7;27739:1;27722:7;:14;:18;27714:27;;;;;;;;;;;;;;27693:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27749:63;27780:2;27784:7;27809:1;27792:7;:14;:18;27784:27;;;;;;;;;;;;;;27749:30;:63::i;:::-;26929:889:::0;;;;;;;;;:::o;33457:233::-;33586:24;33629:55;33659:7;33668:9;33679:4;33629:29;:55::i;:::-;33622:62;;33457:233;;;;;:::o;20540:664::-;20839:15;20856;20880:12;20895:49;20920:7;20929:6;20937;20895:24;:49::i;:::-;20880:64;;20951:13;20967:10;:36;;20994:9;20967:36;;;-1:-1:-1;;20967:36:0;21010:80;;;-1:-1:-1;;;21010:80:0;;21038:10;21010:80;;;;21058:4;21010:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20951:52;;-1:-1:-1;;;;;;21010:27:0;;;;;:80;;;;;-1:-1:-1;;21010:80:0;;;;;;;;-1:-1:-1;21010:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21118;21134:6;21142;21150:9;21161:10;21173;21185:2;21189:8;21118:15;:80::i;:::-;21097:101;;;;;;;;20540:664;;;;;;;;;;;;;;;;:::o;24070:658::-;24281:24;24262:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;24324:55:::1;24355:7;24364:8;24374:4;;24324:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24324:30:0::1;::::0;-1:-1:-1;;;24324:55:0:i:1;:::-;24314:65;;24433:12;24402:7;24427:1;24410:7;:14;:18;24402:27;;;;;;;;;;;;;;:43;;24386:146;;;;-1:-1:-1::0;;;24386:146:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24539:152;24579:4;;24584:1;24579:7;;;;;;24539:152;24698:24;24704:7;24713:4;;24698:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24719:2:0;;-1:-1:-1;24698:5:0::1;::::0;-1:-1:-1;;24698:24:0:i:1;26076:847::-:0;26284:24;26265:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26350:4:0::1;26325:29;:4:::0;;-1:-1:-1;;26330:15:0;;26325:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;26325:21:0::1;-1:-1:-1::0;;;;;26325:29:0::1;;26317:94;;;;-1:-1:-1::0;;;26317:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26428:55;26458:7;26467:9;26478:4;;26428:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26428:29:0::1;::::0;-1:-1:-1;;;26428:55:0:i:1;:::-;26418:65;;26512:11;26498:7;26506:1;26498:10;;;;;;;;;;;;;;:25;;26490:100;;;;-1:-1:-1::0;;;26490:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22529:731:::0;22844:17;22870:12;22885:46;22910:7;22919:5;22926:4;22885:24;:46::i;:::-;22870:61;;22938:13;22954:10;:36;;22981:9;22954:36;;;-1:-1:-1;;22954:36:0;22997:80;;;-1:-1:-1;;;22997:80:0;;23025:10;22997:80;;;;23045:4;22997:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22938:52;;-1:-1:-1;;;;;;22997:27:0;;;;;:80;;;;;-1:-1:-1;;22997:80:0;;;;;;;;-1:-1:-1;22997:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23096:158;23152:5;23166:9;23184:14;23207:12;23228:2;23239:8;23096:47;:158::i;:::-;23084:170;22529:731;-1:-1:-1;;;;;;;;;;;;;22529:731:0:o;29969:719::-;30190:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;30207:115:::1;30239:4;;30244:1;30239:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30239:7:0::1;30248:10;30260:51;30285:7;30294:4;;30299:1;30294:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30294:7:0::1;30303:4;;30308:1;30303:7;;;;;;30260:51;30313:8;30207:31;:115::i;:::-;30329:21;30369:4:::0;;-1:-1:-1;;30374:15:0;;30369:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30369:21:0::1;-1:-1:-1::0;;;;;30353:48:0::1;;30402:2;30353:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;30353:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30353:52:0;30412:44:::1;::::0;;30353:52:::1;30412:44:::0;;::::1;::::0;;;;;;;;;;;30353:52;;-1:-1:-1;30412:44:0::1;::::0;;;30447:4;;;;;;30412:44;::::1;::::0;30447:4;;30412:44;30447:4;30412:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30453:2:0;;-1:-1:-1;30412:34:0::1;::::0;-1:-1:-1;;30412:44:0:i:1;:::-;30554:12:::0;30479:71:::1;30536:13:::0;30495:4;;-1:-1:-1;;30500:15:0;;30495:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30495:21:0::1;-1:-1:-1::0;;;;;30479:48:0::1;;30528:2;30479:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;30479:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30479:52:0;;:56:::1;:71::i;:::-;:87;;30463:219;;;;-1:-1:-1::0;;;30463:219:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:1;29969:719:::0;;;;;;;:::o;31572:893::-;31790:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31848:4:0::1;31823:29;:4:::0;;-1:-1:-1;;31828:15:0;;31823:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31823:21:0::1;-1:-1:-1::0;;;;;31823:29:0::1;;31807:144;;;;-1:-1:-1::0;;;31807:144:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31958:115;31990:4;;31995:1;31990:7;;;;;;31958:115;32080:55;32115:4;;32080:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32129:4:0::1;::::0;-1:-1:-1;32080:34:0::1;::::0;-1:-1:-1;;32080:55:0:i:1;:::-;32142:17;32178:4;-1:-1:-1::0;;;;;32162:31:0::1;;32202:4;32162:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;32162:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32162:46:0;;-1:-1:-1;32231:25:0;;::::1;;32215:154;;;;-1:-1:-1::0;;;32215:154:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32382:4;-1:-1:-1::0;;;;;32376:20:0::1;;32397:9;32376:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32414:45;32445:2;32449:9;32414:30;:45::i;25355:715::-:0;25548:24;25529:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;25600:4:::1;-1:-1:-1::0;;;;;25589:15:0::1;:4;;25594:1;25589:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;25589:7:0::1;-1:-1:-1::0;;;;;25589:15:0::1;;25581:80;;;;-1:-1:-1::0;;;25581:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25678:56;25709:7;25718:9;25729:4;;25678:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25678:30:0::1;::::0;-1:-1:-1;;;25678:56:0:i:1;:::-;25668:66;;25788:12;25757:7;25782:1;25765:7;:14;:18;25757:27;;;;;;;;;;;;;;:43;;25741:143;;;;-1:-1:-1::0;;;25741:143:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25897:4;-1:-1:-1::0;;;;;25891:19:0::1;;25919:7;25927:1;25919:10;;;;;;;;;;;;;;25891:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25953:4;-1:-1:-1::0;;;;;25947:20:0::1;;25968:51;25993:7;26002:4;;26007:1;26002:7;;;;;;25968:51;26021:7;26029:1;26021:10;;;;;;;;;;;;;;25947:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;25947:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25947:85:0;25940:93:::1;;;;26040:24;26046:7;26055:4;;26040:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26061:2:0;;-1:-1:-1;26040:5:0::1;::::0;-1:-1:-1;;26040:24:0:i:1;:::-;25355:715:::0;;;;;;;;:::o;32973:239::-;33112:16;33144:62;33173:9;33184;33195:10;33144:28;:62::i;24734:615::-;24945:24;24926:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;24988:55:::1;25018:7;25027:9;25038:4;;24988:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24988:29:0::1;::::0;-1:-1:-1;;;24988:55:0:i:1;:::-;24978:65;;25072:11;25058:7;25066:1;25058:10;;;;;;;;;;;;;;:25;;25050:103;;;;-1:-1:-1::0;;;25050:103:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15588:38:::0;;;:::o;32505:216::-;32633:15;32664:51;32687:7;32696:8;32706;32664:22;:51::i;21945:578::-;22197:17;22178:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;22239:94:::1;22255:5;22262:4;22268:9;22279:14;22295:12;22317:4;22324:8;22239:15;:94::i;:::-;22223:110;;;;;;22340:87;22368:5;22375:2;22395:5;-1:-1:-1::0;;;;;22379:32:0::1;;22420:4;22379:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;22379:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22379:47:0;22340:27:::1;:87::i;:::-;22440:4;-1:-1:-1::0;;;;;22434:20:0::1;;22455:9;22434:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22472:45;22503:2;22507:9;22472:30;:45::i;30694:872::-:0;30897:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;30933:4:::1;-1:-1:-1::0;;;;;30922:15:0::1;:4;;30927:1;30922:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30922:7:0::1;-1:-1:-1::0;;;;;30922:15:0::1;;30914:109;;;;-1:-1:-1::0;;;30914:109:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31030:16;31049:9;31030:28;;31071:4;-1:-1:-1::0;;;;;31065:19:0::1;;31093:8;31065:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31125:4;-1:-1:-1::0;;;;;31119:20:0::1;;31140:51;31165:7;31174:4;;31179:1;31174:7;;;;;;31140:51;31193:8;31119:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31119:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31119:83:0;31112:91:::1;;;;31210:21;31250:4:::0;;-1:-1:-1;;31255:15:0;;31250:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31250:21:0::1;-1:-1:-1::0;;;;;31234:48:0::1;;31283:2;31234:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;31234:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31234:52:0;31293:44:::1;::::0;;31234:52:::1;31293:44:::0;;::::1;::::0;;;;;;;;;;;31234:52;;-1:-1:-1;31293:44:0::1;::::0;;;31328:4;;;;;;31293:44;::::1;::::0;31328:4;;31293:44;31328:4;31293:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31334:2:0;;-1:-1:-1;31293:34:0::1;::::0;-1:-1:-1;;31293:44:0:i:1;:::-;31435:12:::0;31360:71:::1;31417:13:::0;31376:4;;-1:-1:-1;;31381:15:0;;31376:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31376:21:0::1;-1:-1:-1::0;;;;;31360:48:0::1;;31409:2;31360:52;;;;;;;;;;;;;-1:-1:-1::0;;;;;31360:52:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:71;:87;;31344:216;;;;-1:-1:-1::0;;;31344:216:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19063:864:::0;19299:15;19316;19280:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;19340:12:::1;19355:49;19380:7;19389:6;19397;19355:24;:49::i;:::-;19411:62;::::0;;-1:-1:-1;;;19411:62:0;;19445:10:::1;19411:62;::::0;::::1;::::0;-1:-1:-1;;;;;19411:33:0;::::1;:62:::0;;;;;;;;;;;;;;19340:64;;-1:-1:-1;19411:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19411:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;19543:29:0::1;::::0;;-1:-1:-1;;;19543:29:0;;-1:-1:-1;;;;;19543:29:0;;::::1;;::::0;::::1;::::0;;;19507:15:::1;::::0;;;19543:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;19507:15;19543:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19543:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19543:29:0;-1:-1:-1;19580:14:0::1;19600:43;19628:6:::0;19636;19600:27:::1;:43::i;:::-;19579:64;;;19681:6;-1:-1:-1::0;;;;;19671:16:0::1;:6;-1:-1:-1::0;;;;;19671:16:0::1;;:58;;19712:7;19721;19671:58;;;19691:7;19700;19671:58;19650:79:::0;;-1:-1:-1;19650:79:0;-1:-1:-1;19744:21:0;;::::1;;19736:89;;;;-1:-1:-1::0;;;19736:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19851:10;19840:7;:21;;19832:89;;;;-1:-1:-1::0;;;19832:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:1;;;;19063:864:::0;;;;;;;;;;;:::o;15542:41::-;;;:::o;33218:233::-;33347:24;33390:55;33421:7;33430:8;33440:4;33390:30;:55::i;21210:660::-;21496:19;21517:17;21543:12;21558:46;21583:7;21592:5;21599:4;21558:24;:46::i;:::-;21543:61;;21611:13;21627:10;:36;;21654:9;21627:36;;;-1:-1:-1;;21627:36:0;21670:80;;;-1:-1:-1;;;21670:80:0;;21698:10;21670:80;;;;21718:4;21670:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21611:52;;-1:-1:-1;;;;;;21670:27:0;;;;;:80;;;;;-1:-1:-1;;21670:80:0;;;;;;;;-1:-1:-1;21670:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21784;21803:5;21810:9;21821:14;21837:12;21851:2;21855:8;21784:18;:80::i;:::-;21757:107;;;;-1:-1:-1;21210:660:0;-1:-1:-1;;;;;;;;;;;;;21210:660:0:o;17347:762::-;17649:15;17673;17697:17;17617:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;17753:85:::1;17767:6;17775;17783:14;17799;17815:10;17827;17753:13;:85::i;:::-;17732:106:::0;;-1:-1:-1;17732:106:0;-1:-1:-1;17845:12:0::1;17860:49;17885:7;17894:6:::0;17902;17860:24:::1;:49::i;:::-;17845:64;;17916:66;17948:6;17956:10;17968:4;17974:7;17916:31;:66::i;:::-;17989;18021:6;18029:10;18041:4;18047:7;17989:31;:66::i;:::-;18089:4;-1:-1:-1::0;;;;;18074:25:0::1;;18100:2;18074:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18074:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18074:29:0;17347:762;;;;-1:-1:-1;18074:29:0;;-1:-1:-1;17347:762:0;;-1:-1:-1;;;;;;;;;17347:762:0:o;18115:909::-;18392:19;18420:17;18446;18360:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;18508:87:::1;18522:5;18529:4;18535:18;18555:9;18566:14;18582:12;18508:13;:87::i;:::-;18481:114:::0;;-1:-1:-1;18481:114:0;-1:-1:-1;18602:12:0::1;18617:46;18642:7;18651:5:::0;18658:4:::1;18617:24;:46::i;:::-;18602:61;;18670:69;18702:5;18709:10;18721:4;18727:11;18670:31;:69::i;:::-;18752:4;-1:-1:-1::0;;;;;18746:19:0::1;;18774:9;18746:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;18807:4;-1:-1:-1::0;;;;;18801:20:0::1;;18822:4;18828:9;18801:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;18801:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18801:37:0;18794:45:::1;;;;18873:4;-1:-1:-1::0;;;;;18858:25:0::1;;18884:2;18858:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18858:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18858:29:0;;-1:-1:-1;18930:9:0::1;:21:::0;-1:-1:-1;18926:92:0::1;;;18953:65;18984:10;19008:9;18996;:21;18953:30;:65::i;:::-;15753:1;18115:909:::0;;;;;;;;;;;:::o;27824:799::-;28014:24;27995:8;15694:15;15682:8;:27;;15674:72;;;;;-1:-1:-1;;;15674:72:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15674:72:0;;;;;;;;;;;;;;;28066:4:::1;-1:-1:-1::0;;;;;28055:15:0::1;:4;;28060:1;28055:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28055:7:0::1;-1:-1:-1::0;;;;;28055:15:0::1;;28047:80;;;;-1:-1:-1::0;;;28047:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28144:55;28174:7;28183:9;28194:4;;28144:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28144:29:0::1;::::0;-1:-1:-1;;;28144:55:0:i:1;:::-;28134:65;;28228:9;28214:7;28222:1;28214:10;;;;;;;;;;;;;;:23;;28206:98;;;;-1:-1:-1::0;;;28206:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28317:4;-1:-1:-1::0;;;;;28311:19:0::1;;28339:7;28347:1;28339:10;;;;;;;;;;;;;;28311:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28373:4;-1:-1:-1::0;;;;;28367:20:0::1;;28388:51;28413:7;28422:4;;28427:1;28422:7;;;;;;28388:51;28441:7;28449:1;28441:10;;;;;;;;;;;;;;28367:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28367:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28367:85:0;28360:93:::1;;;;28460:24;28466:7;28475:4;;28460:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28481:2:0;;-1:-1:-1;28460:5:0::1;::::0;-1:-1:-1;;28460:24:0:i:1;:::-;28539:7;28547:1;28539:10;;;;;;;;;;;;;;28527:9;:22;28523:94;;;28551:66;28582:10;28606:7;28614:1;28606:10;;;;;;;;;;;;;;28594:9;:22;28551:30;:66::i;9140:361::-:0;9327:45;;;-1:-1:-1;;;;;9327:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9327:45:0;-1:-1:-1;;;9327:45:0;;;9316:57;;;;9281:12;;9295:17;;9316:10;;;;9327:45;9316:57;;;9327:45;9316:57;;9327:45;9316:57;;;;;;;;;;-1:-1:-1;;9316:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9280:93;;;;9388:7;:57;;;;-1:-1:-1;9400:11:0;;:16;;:44;;;9431:4;9420:24;;;;;;;;;;;;;;;-1:-1:-1;9420:24:0;9400:44;9380:115;;;;-1:-1:-1;;;9380:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9140:361;;;;;:::o;9919:202::-;10023:12;;;9985;10023;;;;;;;;;-1:-1:-1;;;;;10002:7:0;;;10016:5;;10002:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10002:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9984:52;;;10051:7;10043:72;;;;-1:-1:-1;;;10043:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9919:202;;;:::o;12985:562::-;13107:17;13152:1;13141:8;:12;13133:82;;;;-1:-1:-1;;;13133:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13242:1;13230:9;:13;:31;;;;;13260:1;13247:10;:14;13230:31;13222:98;;;;-1:-1:-1;;;13222:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13327:23;13353:18;:8;13366:4;13353:12;:18::i;:::-;13327:44;-1:-1:-1;13378:17:0;13398:31;13327:44;13418:10;13398:19;:31::i;:::-;13378:51;-1:-1:-1;13436:19:0;13458:41;13483:15;13458:20;:9;13472:5;13458:13;:20::i;:::-;:24;;:41::i;:::-;13436:63;;13530:11;13518:9;:23;;;;;;;12985:562;-1:-1:-1;;;;;;;12985:562:0:o;14258:530::-;14382:24;14438:1;14423:4;:11;:16;;14415:74;;;;-1:-1:-1;;;14415:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14520:4;:11;14506:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14506:26:0;;14496:36;;14552:8;14539:7;14547:1;14539:10;;;;;;;;;;;;;:21;;;;;14572:9;14567:216;14601:1;14587:4;:11;:15;14583:1;:19;14567:216;;;14619:17;14638:18;14660:42;14672:7;14681:4;14686:1;14681:7;;;;;;;;;;;;;;14690:4;14695:1;14699;14695:5;14690:11;;;;;;;;;;;;;;14660;:42::i;:::-;14618:84;;;;14728:47;14741:7;14749:1;14741:10;;;;;;;;;;;;;;14753:9;14764:10;14728:12;:47::i;:::-;14711:7;14719:1;14723;14719:5;14711:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14604:3:0;;14567:216;;;;14258:530;;;;;:::o;11413:527::-;11522:12;11544:14;11560;11578:26;11589:6;11597;11578:10;:26::i;:::-;11759:32;;;-1:-1:-1;;11759:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11749:43;;;;;;-1:-1:-1;;;;;;11674:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11652:266;;;;;;;;;11413:527;-1:-1:-1;;;;;11413:527:0:o;9507:406::-;9724:51;;;-1:-1:-1;;;;;9724:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9724:51:0;-1:-1:-1;;;9724:51:0;;;9713:63;;;;9678:12;;9692:17;;9713:10;;;;9724:51;9713:63;;;9724:51;9713:63;;9724:51;9713:63;;;;;;;;;;-1:-1:-1;;9713:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9677:99;;;;9791:7;:57;;;;-1:-1:-1;9803:11:0;;:16;;:44;;;9834:4;9823:24;;;;;;;;;;;;;;;-1:-1:-1;9823:24:0;9803:44;9783:124;;;;-1:-1:-1;;;9783:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:406;;;;;;:::o;23365:699::-;23491:9;23486:573;23520:1;23506:4;:11;:15;23502:1;:19;23486:573;;;23538:13;23553:14;23572:4;23577:1;23572:7;;;;;;;;;;;;;;23581:4;23586:1;23590;23586:5;23581:11;;;;;;;;;;;;;;23537:56;;;;23603:14;23623:42;23651:5;23658:6;23623:27;:42::i;:::-;23602:63;;;23674:17;23694:7;23702:1;23706;23702:5;23694:14;;;;;;;;;;;;;;23674:34;;23718:18;23738;23769:6;-1:-1:-1;;;;;23760:15:0;:5;-1:-1:-1;;;;;23760:15:0;;:67;;23805:9;23824:1;23760:67;;;23787:1;23791:9;23760:67;23717:110;;;;23836:10;23867:1;23853:4;:11;:15;23849:1;:19;:82;;23928:3;23849:82;;;23871:54;23896:7;23905:6;23913:4;23918:1;23922;23918:5;23913:11;;;;;;;;;;;;;;23871:24;:54::i;:::-;23836:95;;23955:48;23980:7;23989:5;23996:6;23955:24;:48::i;:::-;-1:-1:-1;;;;;23940:69:0;;24010:10;24022;24034:2;24048:1;24038:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24038:12:0;;23940:111;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23940:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23523:3:0;;;;;-1:-1:-1;23486:573:0;;-1:-1:-1;;;;;;;;23486:573:0;;;23365:699;;;:::o;14865:550::-;14989:24;15045:1;15030:4;:11;:16;;15022:73;;;;-1:-1:-1;;;15022:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15126:4;:11;15112:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15112:26:0;;15102:36;;15175:9;15145:7;15170:1;15153:7;:14;:18;15145:27;;;;;;;;;;;;;;;;;:39;15208:11;;-1:-1:-1;;15208:15:0;15191:219;15225:5;;15191:219;;15247:17;15266:18;15288:42;15300:7;15309:4;15318:1;15314;:5;15309:11;;;;;;;;;;;;;;15322:4;15327:1;15322:7;;;;;;;15288:42;15246:84;;;;15356:46;15368:7;15376:1;15368:10;;;;;;;;;;;;;;15380:9;15391:10;15356:11;:46::i;:::-;15339:7;15351:1;15347;:5;15339:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;15232:3:0;15191:219;;28764:1199;28873:9;28868:1090;28902:1;28888:4;:11;:15;28884:1;:19;28868:1090;;;28920:13;28935:14;28954:4;28959:1;28954:7;;;;;;;;;;;;;;28963:4;28968:1;28972;28968:5;28963:11;;;;;;;;;;;;;;28919:56;;;;28985:14;29005:42;29033:5;29040:6;29005:27;:42::i;:::-;28984:63;;;29056:19;29093:48;29118:7;29127:5;29134:6;29093:24;:48::i;:::-;29056:86;;29151:19;29179:20;29269:16;29287;29309:4;-1:-1:-1;;;;;29309:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29309:18:0;;;;;;;-1:-1:-1;;;;;29268:59:0;;;;-1:-1:-1;29268:59:0;;-1:-1:-1;29339:20:0;;-1:-1:-1;;;;;29386:15:0;;;;;;;:61;;29428:8;29438;29386:61;;;29405:8;29415;29386:61;29338:109;;;;29472:65;29524:12;29488:5;-1:-1:-1;;;;;29472:32:0;;29513:4;29472:47;;;;;;;;;;;;;-1:-1:-1;;;;;29472:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;:65;29458:79;;29563:71;29593:11;29606:12;29620:13;29563:29;:71::i;:::-;29548:86;;28868:1090;;;;29653:18;29673;29704:6;-1:-1:-1;;;;;29695:15:0;:5;-1:-1:-1;;;;;29695:15:0;;:91;;29761:12;29783:1;29695:91;;;29731:1;29735:12;29695:91;29652:134;;;;29795:10;29826:1;29812:4;:11;:15;29808:1;:19;:82;;29887:3;29808:82;;;29830:54;29855:7;29864:6;29872:4;29877:1;29881;29877:5;29872:11;;;;;;;29830:54;29937:12;;;29947:1;29937:12;;;;;;;;;;-1:-1:-1;;;29899:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29899:51:0;;;;;;;;;;;;;;;;;;;;;;29795:95;;-1:-1:-1;29899:9:0;;;;;;29909:10;;29921;;29795:95;;29937:12;;29899:51;;;;;;;;29937:12;;29899:51;;;;29937:12;;29899:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28905:3:0;;;;;-1:-1:-1;28868:1090:0;;-1:-1:-1;;;;;;;;;;28868:1090:0;10447:147;10527:5;;;10522:16;;;;10514:74;;;;-1:-1:-1;;;10514:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13664:516;13786:16;13831:1;13819:9;:13;13811:83;;;;-1:-1:-1;;;13811:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13921:1;13909:9;:13;:31;;;;;13939:1;13926:10;:14;13909:31;13901:97;;;;-1:-1:-1;;;13901:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14005:17;14025:35;14054:5;14025:24;:9;14039;14025:13;:24::i;:::-;:28;;:35::i;:::-;14005:55;-1:-1:-1;14067:19:0;14089:35;14119:4;14089:25;:10;14104:9;14089:14;:25::i;:35::-;14067:57;;14142:32;14172:1;14155:11;14143:9;:23;;;;;;;14142:29;:32::i;:::-;14131:43;13664:516;-1:-1:-1;;;;;;13664:516:0:o;12514:353::-;12625:15;12667:1;12657:7;:11;12649:68;;;;-1:-1:-1;;;12649:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12743:1;12732:8;:12;:28;;;;;12759:1;12748:8;:12;12732:28;12724:88;;;;-1:-1:-1;;;12724:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12853:8;12829:21;:7;12841:8;12829:11;:21::i;:::-;:32;;;;;;;12514:353;-1:-1:-1;;;;12514:353:0:o;10966:359::-;11041:14;11057;11098:6;-1:-1:-1;;;;;11088:16:0;:6;-1:-1:-1;;;;;11088:16:0;;;11080:78;;;;-1:-1:-1;;;11080:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11193:6;-1:-1:-1;;;;;11184:15:0;:6;-1:-1:-1;;;;;11184:15:0;;:53;;11222:6;11230;11184:53;;;11203:6;11211;11184:53;11165:72;;-1:-1:-1;11165:72:0;-1:-1:-1;;;;;;11252:20:0;;11244:75;;;;-1:-1:-1;;;11244:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10966:359;;;;;:::o;16031:1310::-;16235:15;16252;16390:1;-1:-1:-1;;;;;16328:64:0;16346:7;-1:-1:-1;;;;;16328:34:0;;16363:6;16371;16328:50;;;;;;;;;;;;;-1:-1:-1;;;;;16328:50:0;;;;;;-1:-1:-1;;;;;16328:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16328:50:0;-1:-1:-1;;;;;16328:64:0;;16324:140;;;16421:7;-1:-1:-1;;;;;16403:37:0;;16441:6;16449;16403:53;;;;;;;;;;;;;-1:-1:-1;;;;;16403:53:0;;;;;;-1:-1:-1;;;;;16403:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16324:140:0;16471:16;16489;16509:53;16538:7;16547:6;16555;16509:28;:53::i;:::-;16470:92;;;;16573:8;16585:1;16573:13;:30;;;;-1:-1:-1;16590:13:0;;16573:30;16569:767;;;16636:14;;-1:-1:-1;16652:14:0;;-1:-1:-1;16569:767:0;;;16690:22;16715:58;16738:14;16754:8;16764;16715:22;:58::i;:::-;16690:83;;16804:14;16786;:32;16782:547;;16857:10;16839:14;:28;;16831:94;;;;-1:-1:-1;;;16831:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16958:14;;-1:-1:-1;16974:14:0;-1:-1:-1;16974:14:0;16782:547;;;17016:22;17041:58;17064:14;17080:8;17090;17041:22;:58::i;:::-;17016:83;;17135:14;17117;:32;;17110:40;;;;17187:10;17169:14;:28;;17161:94;;;;-1:-1:-1;;;17161:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17288:14;-1:-1:-1;17304:14:0;;-1:-1:-1;16782:547:0;16569:767;;16031:1310;;;;;;;;;;;:::o;10600:160::-;10652:6;10675;;;:30;;-1:-1:-1;;10690:5:0;;;10704:1;10699;10690:5;10699:1;10685:15;;;;;:20;10675:30;10667:87;;;;-1:-1:-1;;;10667:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10295:146;10375:5;;;10370:16;;;;10362:73;;;;-1:-1:-1;;;10362:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11994:411;12107:16;12125;12151:14;12171:26;12182:6;12190;12171:10;:26::i;:::-;12150:47;;;12205:16;12223;12260:32;12268:7;12277:6;12285;12260:7;:32::i;:::-;-1:-1:-1;;;;;12245:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12245:62:0;;;;;;;-1:-1:-1;;;;;12204:103:0;;;;-1:-1:-1;12204:103:0;;-1:-1:-1;;;;;;12337:16:0;;;;;;;:62;;12380:8;12390;12337:62;;;12357:8;12367;12337:62;12314:85;;;;-1:-1:-1;11994:411:0;-1:-1:-1;;;;;;;11994:411:0:o

Metadata Hash

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