Contract 0x8cb2e43e5aeb329de592f7e49b6c454649b61929

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf11eefa98b84e879a5efab703b00a4389f5453b4129f61e13807171e72aa0da6Swap Exact Token...175753842023-02-03 9:58:051 hr 7 mins ago0x4e92b67c1a0dc26f346e822ddf0d7395427285b6 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT52.9596
0xcfe63518a1d37ee9bb082f523c8e4267860a2154e889aa0dc637d2d869cd8765Swap Exact Token...175725032023-02-03 8:19:032 hrs 46 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT67.7232
0x93af6ff26c3719d65c80afd93ad9eb8c12d3891e5ac229ce32ec0bd07b887bd3Swap Exact Token...175724862023-02-03 8:18:292 hrs 47 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT103.4358
0xe810683dac074c9259f2bce9fe500e32c278bc7de185aeef81991418c2f75db6Swap Exact Token...175724712023-02-03 8:17:552 hrs 47 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT101.7666
0xda40be57f4ee375a7fe086b1091f180c125a73b419c23075a794a2d4cab5ff21Swap Exact Token...175709732023-02-03 7:26:273 hrs 39 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT135.6264
0x0b0c80f3b8194d2ba0f2c49739351c32d728021c8f048e33c6e1dca6fe797dd1Swap Exact Token...175709712023-02-03 7:26:233 hrs 39 mins ago0xca9eff53047120b0ec590b87712f2894736107da IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT29.3442
0x0718162131c35478db27b4403cb733b8aeabfc617c9ae1318d36e57461a262faSwap Exact Token...175696762023-02-03 6:41:534 hrs 23 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT67.7232
0xc7771df513909b6a43632684ad9ef632638b57a86e6aef19767f4cc3f24daca0Swap Exact Token...175696672023-02-03 6:41:354 hrs 24 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT103.4358
0x58943eb71351e985063f0c1437d0c0c9da8cecc04adc5aa8d3da808fb9db1cb7Swap Exact Token...175696632023-02-03 6:41:234 hrs 24 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.293870979
0x09c70af72eb2dd8b0fe569c47670335851d25e5f6ce6d36e8dd17159d84e0cd9Swap Exact Token...175696572023-02-03 6:41:114 hrs 24 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT135.6192
0x2395b82e4c1d9e2e61e332ab7bce4c3143541bc440c11194c055584ce3561068Swap Exact Token...175696532023-02-03 6:41:034 hrs 24 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.290270967
0x305769989c16f29ee4d268e0ddcbd62a199cbde363040f9db949b50eaac1f5a4Swap Exact Token...175696462023-02-03 6:40:494 hrs 24 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.290270967
0xb14a29ea44e4175a6c8d102355a17a7c18cc355d4cd6a28be2b70009aa3e06e5Swap Exact Token...175696422023-02-03 6:40:414 hrs 25 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT137.4822
0x27f4f6b00568b40b3822ca6accd21b2e6964a3827b6b052f3449aa98b7c9e9cfSwap Exact Token...175696352023-02-03 6:40:274 hrs 25 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT135.6264
0xdad8ad340ebb566c65bd1708ee380570713f4091f542024eb9d67e2f04064c73Add Liquidity175664282023-02-03 4:50:136 hrs 15 mins ago0xf876883d72bfeb821211c2c54b887fd2c2684ffc IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT47.8521
0x4bfcded81741ab0942f65736aae88ad71fc3302ae3ef97034696a3cd54214a0bSwap Exact Token...175664042023-02-03 4:49:256 hrs 16 mins ago0xf876883d72bfeb821211c2c54b887fd2c2684ffc IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT33.8406
0x5cd7910eb6652237207f134a23fb16152763b8e5fcbda87d65d4a84c47f59612Swap Exact Token...175663322023-02-03 4:46:536 hrs 18 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.290270967
0xa4bc7033fb44e73702393e9672f0ad222bfbf87a127e5a92edf30b9d3bf37f79Swap Exact Token...175661962023-02-03 4:42:136 hrs 23 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.290270967
0x089def712a1a38e27e33dc9be617379bd470caf6a2c3b47db56729cd22c88746Swap Exact Token...175656972023-02-03 4:25:076 hrs 40 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT101.781
0x8c09a7dc567222de99f64db453a93827ed8afb460d0e9144175be41346a73cefSwap Exact Token...175655812023-02-03 4:21:076 hrs 44 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT67.6812
0xa8bc3bdc51714a29ef496742339f500ac1a6585b5ec63549cb03bfe36bafad62Swap Exact Token...175655692023-02-03 4:20:436 hrs 44 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT101.7666
0x9125830440aa31f14ffe87358be2b4a343512504e1d533c5f1e8f51c6730bd61Swap Exact Token...175655432023-02-03 4:19:476 hrs 45 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT67.6884
0xc41b58767c87c0904d93a6d13ddddb8b6a56cac4704ad5771f8f3849874e3e64Swap Exact Token...175654682023-02-03 4:17:136 hrs 48 mins ago0x9740a75a6df384628ebb26219a5062659f47237e IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT51.293870979
0x302a2ab5f9c0467d84ad168c6cfa19e838a21e30604618aa220dc388fbed2832Swap Exact Token...175654412023-02-03 4:16:196 hrs 49 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT67.6812
0x1fa826a7e6193ae206111d4460554d61f7bfc4824ccf8fdaa4da5510cdd6cf41Swap Exact Token...175654302023-02-03 4:15:536 hrs 49 mins ago0xfc8f3324b6d71d14bfd625ecdbd18f3bc29a9935 IN  0x8cb2e43e5aeb329de592f7e49b6c454649b619290 BTT101.538
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xf11eefa98b84e879a5efab703b00a4389f5453b4129f61e13807171e72aa0da6175753842023-02-03 9:58:051 hr 7 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x4e92b67c1a0dc26f346e822ddf0d7395427285b64,004,245.167884557749826186 BTT
0xf11eefa98b84e879a5efab703b00a4389f5453b4129f61e13807171e72aa0da6175753842023-02-03 9:58:051 hr 7 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b619294,004,245.167884557749826186 BTT
0xe03eddbf3edabe0e800aba113cdc21e3ce9476c8cfa9e07a9996839c6d047958175623132023-02-03 2:28:478 hrs 36 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x6fc263ff819609e5f4c3d5b8d742fa94b8a3fead0.000000000000005914 BTT
0xe03eddbf3edabe0e800aba113cdc21e3ce9476c8cfa9e07a9996839c6d047958175623132023-02-03 2:28:478 hrs 36 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e7,434,644.999999999999994086 BTT
0xf9fe2873a1360c8c282839b31b2fb510114649013b8f178379626fbba996388b175622852023-02-03 2:27:478 hrs 37 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x6fc263ff819609e5f4c3d5b8d742fa94b8a3fead7,435,846.855340093561880445 BTT
0xf9fe2873a1360c8c282839b31b2fb510114649013b8f178379626fbba996388b175622852023-02-03 2:27:478 hrs 37 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b619297,435,846.855340093561880445 BTT
0x4c7369a7985ad0d0381e3d45174293c93bc7ef27ede042a0f7f5770407998e99175563362023-02-02 23:03:1712 hrs 2 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x9740a75a6df384628ebb26219a5062659f47237e1,231,505.199456597713782035 BTT
0x4c7369a7985ad0d0381e3d45174293c93bc7ef27ede042a0f7f5770407998e99175563362023-02-02 23:03:1712 hrs 2 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b619291,231,505.199456597713782035 BTT
0x16fd5c4080558665697f600882211c6803570499e5e0d7df10c7dd47b7d00d68175563062023-02-02 23:02:1712 hrs 3 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e1,000 BTT
0x10e949c98007aa905a146020e98d4520d10f38d5717cb4cbff9325721ea84f95175550812023-02-02 22:20:1112 hrs 45 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x960f53196181a6a76ad20eecca5591215c6d0fa419,138,013.002877919542438794 BTT
0x10e949c98007aa905a146020e98d4520d10f38d5717cb4cbff9325721ea84f95175550812023-02-02 22:20:1112 hrs 45 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b6192919,138,013.002877919542438794 BTT
0xb180e2dc6a53d35c8148b737f90be66c6b408a5173a241d2159c7eab379d9f27175495602023-02-02 19:10:2115 hrs 55 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x4e92b67c1a0dc26f346e822ddf0d7395427285b68,025,573.0563158042456835 BTT
0xb180e2dc6a53d35c8148b737f90be66c6b408a5173a241d2159c7eab379d9f27175495602023-02-02 19:10:2115 hrs 55 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b619298,025,573.0563158042456835 BTT
0x0d1d6d452c3f141a4574e63bf5bc077436ca52370bd593c5399556811a17bf28175382942023-02-02 12:43:0522 hrs 22 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e10,000,000 BTT
0xf4a8599b6257f3c5d264d95cd7085bbc1e91281cb00089a3ae8e29091456d41e175376872023-02-02 12:22:1522 hrs 43 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e3,000,000 BTT
0xa9d18019772c0f2e1fc38fcf49e7d8362d6298df3d7ec308ec8da31f619b7c3a175347092023-02-02 10:39:511 day 25 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e13,607,003.984569285358858512 BTT
0x86bdaaa0d57e655362fdc46a630369d4d50b0a54b0ae2961b6648d00d5d74502175346932023-02-02 10:39:191 day 26 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290xca9eff53047120b0ec590b87712f2894736107da13,816,000 BTT
0x86bdaaa0d57e655362fdc46a630369d4d50b0a54b0ae2961b6648d00d5d74502175346932023-02-02 10:39:191 day 26 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b6192913,816,000 BTT
0xe73156f8e9821dc2aae00e01e7f6441e4c843a61314fbe51ae40c5e2a6004452175345922023-02-02 10:35:531 day 29 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290xca9eff53047120b0ec590b87712f2894736107da0.00000000000000292 BTT
0xe73156f8e9821dc2aae00e01e7f6441e4c843a61314fbe51ae40c5e2a6004452175345922023-02-02 10:35:531 day 29 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e342,210,199.99999999999999708 BTT
0x2a5fdabf81dfbb2326f48a6bb50de632d15e039bf557ef81e432d76a21157626175345542023-02-02 10:34:331 day 31 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290xca9eff53047120b0ec590b87712f2894736107da25,509,828.17578940071014119 BTT
0x2a5fdabf81dfbb2326f48a6bb50de632d15e039bf557ef81e432d76a21157626175345542023-02-02 10:34:331 day 31 mins ago 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e 0x8cb2e43e5aeb329de592f7e49b6c454649b6192925,509,828.17578940071014119 BTT
0xafee57398a875d41f7f5d3540a74aa75bb56c286da8d8074293b3e0cad53b9c0175344632023-02-02 10:31:231 day 34 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b619290x22df8ff50c6b61e62d9ff21f7a3da117c304bf900.000000000000704056 BTT
0xafee57398a875d41f7f5d3540a74aa75bb56c286da8d8074293b3e0cad53b9c0175344632023-02-02 10:31:231 day 34 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e1,358,179,000.333393293388222982 BTT
0x4833652f246bac027421dc87aba97ea2ecc7ddc51b910a7e4f1f0f5c23225a47175342902023-02-02 10:25:291 day 40 mins ago 0x8cb2e43e5aeb329de592f7e49b6c454649b61929 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e1,000,000 BTT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SoyFinanceRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at bttcscan.com on 2022-04-25
*/

// SPDX-License-Identifier: No License (None)
pragma solidity >=0.6.6;

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

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

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

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

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

interface ISoyFinanceRouter01 {
    function factory() external pure returns (address);
    function WCLO() 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 addLiquidityCLO(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountCLO, 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 removeLiquidityCLO(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountCLO);
    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 removeLiquidityCLOWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountCLO);
    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 swapExactCLOForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactCLO(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForCLO(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapCLOForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

interface ISoyFinanceRouter02 is ISoyFinanceRouter01 {
    function removeLiquidityCLOSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) external returns (uint amountCLO);
    function removeLiquidityCLOWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountCLO);

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

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

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

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

library SoyFinanceLibrary {
    using SafeMath for uint;

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

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

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

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

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

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

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

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

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

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

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

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

contract SoyFinanceRouter is ISoyFinanceRouter02 {
    using SafeMath for uint;

    address public immutable override factory;
    address public immutable override WCLO;
    mapping(address => mapping(address => uint)) public balanceERC223;    // user => token => value
    address public msgSender;   // ERC223 sender
    address public tokenAddress; // ERC223 token address
    event Swap(address _sender, address _tokenIn, address _tokenOut, uint _amountIn, uint _amountOut);
    event AddLiquidity(address _sender, address _tokenA, address _tokenB, uint _amountA, uint _amountB);
    event RemoveLiquidity(address _sender, address _tokenA, address _tokenB, uint _amountA, uint _amountB);

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

    modifier noERC223() {
        require(msg.sender != address(this), "ERC223 not accepted");
        _;
    }

    constructor(address _factory, address _WCLO) public {
        factory = _factory;
        WCLO = _WCLO;
    }

    function tokenReceived(address _from, uint _value, bytes calldata _data) external {
        balanceERC223[_from][msg.sender] = balanceERC223[_from][msg.sender] + _value;   // add token to user balance
        if (_data.length >= 36) { // signature + at least 1 parameter
            msgSender = _from;
            tokenAddress = msg.sender;
            (bool success,) = address(this).call{value:0}(_data);
            require(success, "ERC223 internal call failed");
        }
    }

    // allow user to withdraw transferred ERC223 tokens
    function withdraw(address token, uint amount) external {
        uint userBalance = balanceERC223[msg.sender][token];
        require(userBalance >= amount, "Not enough tokens");
        balanceERC223[msg.sender][token] = userBalance - amount;
        TransferHelper.safeTransfer(token, msg.sender, amount);
    }

    function transferTo(address token, address to, uint amount) internal {
        address sender = msg.sender;
        if (msg.sender == address(this)) {
            require(token == tokenAddress, "Transfer wrong token");
            sender = msgSender;
        }
        uint balance = balanceERC223[sender][token];
        if (balance >= amount) { // ERC223 tokens were transferred 
            uint rest;
            if (balance > amount) rest = balance - amount;
            balanceERC223[sender][token] = 0;
            if (rest != 0) TransferHelper.safeTransfer(token, sender, rest); // refund rest of tokens to sender
            TransferHelper.safeTransfer(token, to, amount);
        } else if (msg.sender != address(this)) {   // not ERC223 callback
            TransferHelper.safeTransferFrom(token, msg.sender, to, amount);
        } else {
            revert("Not enough ERC223 balance");
        }
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (ISoyFinanceFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ISoyFinanceFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = SoyFinanceLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SoyFinanceLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'SoyFinanceRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SoyFinanceLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'SoyFinanceRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
        emit AddLiquidity(tx.origin, tokenA, tokenB, amountA, amountB);
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) noERC223 returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = SoyFinanceLibrary.pairFor(factory, tokenA, tokenB);
        transferTo(tokenA, pair, amountA);
        transferTo(tokenB, pair, amountB);
        liquidity = ISoyFinancePair(pair).mint(to);
    }
    function addLiquidityCLO(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) noERC223 returns (uint amountToken, uint amountCLO, uint liquidity) {
        (amountToken, amountCLO) = _addLiquidity(
            token,
            WCLO,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountCLOMin
        );
        address pair = SoyFinanceLibrary.pairFor(factory, token, WCLO);
        transferTo(token, pair, amountToken);
        IWCLO(WCLO).deposit{value: amountCLO}();
        assert(IWCLO(WCLO).transfer(pair, amountCLO));
        liquidity = ISoyFinancePair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountCLO) TransferHelper.safeTransferCLO(msg.sender, msg.value - amountCLO);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = SoyFinanceLibrary.pairFor(factory, tokenA, tokenB);
        transferTo(pair, pair, liquidity); // send liquidity to pair
        //ISoyFinancePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = ISoyFinancePair(pair).burn(to);
        (address token0,) = SoyFinanceLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'SoyFinanceRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'SoyFinanceRouter: INSUFFICIENT_B_AMOUNT');
        emit RemoveLiquidity(tx.origin, tokenA, tokenB, amountA, amountB);
    }
    function removeLiquidityCLO(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountCLO) {
        (amountToken, amountCLO) = removeLiquidity(
            token,
            WCLO,
            liquidity,
            amountTokenMin,
            amountCLOMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWCLO(WCLO).withdraw(amountCLO);
        TransferHelper.safeTransferCLO(to, amountCLO);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override noERC223 returns (uint amountA, uint amountB) {
        address pair = SoyFinanceLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        ISoyFinancePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityCLOWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override noERC223 returns (uint amountToken, uint amountCLO) {
        address pair = SoyFinanceLibrary.pairFor(factory, token, WCLO);
        uint value = approveMax ? uint(-1) : liquidity;
        ISoyFinancePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountCLO) = removeLiquidityCLO(token, liquidity, amountTokenMin, amountCLOMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityCLOSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountCLO) {
        (, amountCLO) = removeLiquidity(
            token,
            WCLO,
            liquidity,
            amountTokenMin,
            amountCLOMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC223(token).balanceOf(address(this)));
        IWCLO(WCLO).withdraw(amountCLO);
        TransferHelper.safeTransferCLO(to, amountCLO);
    }
    function removeLiquidityCLOWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountCLOMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override noERC223 returns (uint amountCLO) {
        address pair = SoyFinanceLibrary.pairFor(factory, token, WCLO);
        uint value = approveMax ? uint(-1) : liquidity;
        ISoyFinancePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountCLO = removeLiquidityCLOSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountCLOMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SoyFinanceLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? SoyFinanceLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ISoyFinancePair(SoyFinanceLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
        emit Swap(tx.origin, path[0], path[path.length - 1], amounts[0], amounts[amounts.length - 1]);
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = SoyFinanceLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = SoyFinanceLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SoyFinanceRouter: EXCESSIVE_INPUT_AMOUNT');
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactCLOForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        noERC223
        returns (uint[] memory amounts)
    {
        require(path[0] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        amounts = SoyFinanceLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWCLO(WCLO).deposit{value: amounts[0]}();
        assert(IWCLO(WCLO).transfer(SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactCLO(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        amounts = SoyFinanceLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SoyFinanceRouter: EXCESSIVE_INPUT_AMOUNT');
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWCLO(WCLO).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferCLO(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForCLO(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        amounts = SoyFinanceLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWCLO(WCLO).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferCLO(to, amounts[amounts.length - 1]);
    }
    function swapCLOForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        noERC223
        returns (uint[] memory amounts)
    {
        require(path[0] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        amounts = SoyFinanceLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'SoyFinanceRouter: EXCESSIVE_INPUT_AMOUNT');
        IWCLO(WCLO).deposit{value: amounts[0]}();
        assert(IWCLO(WCLO).transfer(SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferCLO(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SoyFinanceLibrary.sortTokens(input, output);
            ISoyFinancePair pair = ISoyFinancePair(SoyFinanceLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC223(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = SoyFinanceLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? SoyFinanceLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        require(path.length > 1, 'SoyFinanceRouter: INVALID_PATH');        
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC223(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        uint amountOut = IERC223(path[path.length - 1]).balanceOf(to).sub(balanceBefore);
        require(
            amountOut >= amountOutMin,
            'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );        
        emit Swap(tx.origin, path[0], path[path.length - 1], amountIn, amountOut);
    }
    function swapExactCLOForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
        noERC223
    {
        require(path.length > 1, 'SoyFinanceRouter: INVALID_PATH');        
        require(path[0] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWCLO(WCLO).deposit{value: amountIn}();
        assert(IWCLO(WCLO).transfer(SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC223(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        uint amountOut = IERC223(path[path.length - 1]).balanceOf(to).sub(balanceBefore);
        require(
            amountOut >= amountOutMin,
            'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
        emit Swap(tx.origin, path[0], path[path.length - 1], amountIn, amountOut);
    }
    function swapExactTokensForCLOSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path.length > 1, 'SoyFinanceRouter: INVALID_PATH');        
        require(path[path.length - 1] == WCLO, 'SoyFinanceRouter: INVALID_PATH');
        transferTo(
            path[0], SoyFinanceLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC223(WCLO).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'SoyFinanceRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWCLO(WCLO).withdraw(amountOut);
        TransferHelper.safeTransferCLO(to, amountOut);
        emit Swap(tx.origin, path[0], path[path.length - 1], amountIn, amountOut);
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WCLO","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenA","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountB","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenA","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountB","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"_tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountOut","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"WCLO","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":"amountCLOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityCLO","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCLO","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balanceERC223","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"msgSender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCLOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityCLO","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCLO","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":"amountCLOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityCLOSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountCLO","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":"amountCLOMin","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":"removeLiquidityCLOWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCLO","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":"amountCLOMin","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":"removeLiquidityCLOWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountCLO","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":"swapCLOForExactTokens","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":"swapExactCLOForTokens","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":"swapExactCLOForTokensSupportingFeeOnTransferTokens","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":"swapExactTokensForCLO","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":"swapExactTokensForCLOSupportingFeeOnTransferTokens","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":"swapTokensForExactCLO","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"tokenReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b506040516200524d3803806200524d8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6150c862000185600039806101d65280610ec75280611022528061115752806111925280611432528061157852806116005280611cc95280611e595280611fa052806120e3528061216b52806122d352806125a3528061267e528061275852806128e052806129945280612aee5280612b835280612bf75280612f53528061337852806133ce52806134015280613475525080610ea55280611000528061122b52806112af52806114c5528061163252806117b1528061188752806119c35280611d575280612033528061219d528061234d5280612c295280612fe152806130ea52806133ac52806135bd52806135e652806136e35280613f745280613fb7528061436652806144dc52806148cd52806149865280614a3952506150c86000f3fe6080604052600436106101c65760003560e01c80638943ec02116100f7578063baa2abde11610095578063d62dfe2211610064578063d62dfe2214610d51578063d737d0c714610d8c578063e8e3370014610da1578063f3fef3a314610e03576101ff565b8063baa2abde14610bc6578063c2a63cd814610c23578063c45a015514610c87578063d06ca61f14610c9c576101ff565b8063a00628c3116100d1578063a00628c314610a23578063a42d442f14610a76578063a6e8385214610afa578063ad615dec14610b90576101ff565b80638943ec02146108e85780639550b9a3146109785780639d76ea5814610a0e576101ff565b806338ed173911610164578063710db8ef1161013e578063710db8ef1461076757806379cce4f5146107eb57806385f8c2591461081c5780638803dbee14610852576101ff565b806338ed1739146105a55780635c11d7951461063b5780635ea83ae9146106d1576101ff565b80631b9dd7b6116101a05780631b9dd7b61461034b5780631f00ca741461039e5780632195995c146104a35780632e9b3dc314610521576101ff565b8063054d50d41461020457806306a071651461024c5780630984f17a146102bf576101ff565b366101ff57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101fd57fe5b005b600080fd5b34801561021057600080fd5b5061023a6004803603606081101561022757600080fd5b5080359060208101359060400135610e3c565b60408051918252519081900360200190f35b34801561025857600080fd5b5061023a600480360361014081101561027057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610e51565b3480156102cb57600080fd5b5061033260048036036101408110156102e357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610fab565b6040805192835260208301919091528051918290030190f35b34801561035757600080fd5b50610332600480360360c081101561036e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561110a565b3480156103aa57600080fd5b50610453600480360360408110156103c157600080fd5b81359190810190604081016020820135600160201b8111156103e257600080fd5b8201836020820111156103f457600080fd5b803590602001918460208302840111600160201b8311171561041557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611224945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561048f578181015183820152602001610477565b505050509050019250505060405180910390f35b3480156104af57600080fd5b5061033260048036036101608110156104c757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561125a565b6104536004803603608081101561053757600080fd5b81359190810190604081016020820135600160201b81111561055857600080fd5b82018360208201111561056a57600080fd5b803590602001918460208302840111600160201b8311171561058b57600080fd5b91935091506001600160a01b03813516906020013561139f565b3480156105b157600080fd5b50610453600480360360a08110156105c857600080fd5b813591602081013591810190606081016040820135600160201b8111156105ee57600080fd5b82018360208201111561060057600080fd5b803590602001918460208302840111600160201b8311171561062157600080fd5b91935091506001600160a01b038135169060200135611766565b34801561064757600080fd5b506101fd600480360360a081101561065e57600080fd5b813591602081013591810190606081016040820135600160201b81111561068457600080fd5b82018360208201111561069657600080fd5b803590602001918460208302840111600160201b831117156106b757600080fd5b91935091506001600160a01b038135169060200135611917565b3480156106dd57600080fd5b50610453600480360360a08110156106f457600080fd5b813591602081013591810190606081016040820135600160201b81111561071a57600080fd5b82018360208201111561072c57600080fd5b803590602001918460208302840111600160201b8311171561074d57600080fd5b91935091506001600160a01b038135169060200135611c79565b6104536004803603608081101561077d57600080fd5b81359190810190604081016020820135600160201b81111561079e57600080fd5b8201836020820111156107b057600080fd5b803590602001918460208302840111600160201b831117156107d157600080fd5b91935091506001600160a01b038135169060200135611f0d565b3480156107f757600080fd5b506108006122d1565b604080516001600160a01b039092168252519081900360200190f35b34801561082857600080fd5b5061023a6004803603606081101561083f57600080fd5b50803590602081013590604001356122f5565b34801561085e57600080fd5b50610453600480360360a081101561087557600080fd5b813591602081013591810190606081016040820135600160201b81111561089b57600080fd5b8201836020820111156108ad57600080fd5b803590602001918460208302840111600160201b831117156108ce57600080fd5b91935091506001600160a01b038135169060200135612302565b3480156108f457600080fd5b506101fd6004803603606081101561090b57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561093a57600080fd5b82018360208201111561094c57600080fd5b803590602001918460018302840111600160201b8311171561096d57600080fd5b5090925090506123fb565b34801561098457600080fd5b506101fd600480360360a081101561099b57600080fd5b813591602081013591810190606081016040820135600160201b8111156109c157600080fd5b8201836020820111156109d357600080fd5b803590602001918460208302840111600160201b831117156109f457600080fd5b91935091506001600160a01b038135169060200135612512565b348015610a1a57600080fd5b50610800612885565b348015610a2f57600080fd5b5061023a600480360360c0811015610a4657600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612894565b6101fd60048036036080811015610a8c57600080fd5b81359190810190604081016020820135600160201b811115610aad57600080fd5b820183602082011115610abf57600080fd5b803590602001918460208302840111600160201b83111715610ae057600080fd5b91935091506001600160a01b038135169060200135612a1a565b348015610b0657600080fd5b50610453600480360360a0811015610b1d57600080fd5b813591602081013591810190606081016040820135600160201b811115610b4357600080fd5b820183602082011115610b5557600080fd5b803590602001918460208302840111600160201b83111715610b7657600080fd5b91935091506001600160a01b038135169060200135612f03565b348015610b9c57600080fd5b5061023a60048036036060811015610bb357600080fd5b508035906020810135906040013561308f565b348015610bd257600080fd5b50610332600480360360e0811015610be957600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c0013561309c565b610c69600480360360c0811015610c3957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356132de565b60408051938452602084019290925282820152519081900360600190f35b348015610c9357600080fd5b506108006135bb565b348015610ca857600080fd5b5061045360048036036040811015610cbf57600080fd5b81359190810190604081016020820135600160201b811115610ce057600080fd5b820183602082011115610cf257600080fd5b803590602001918460208302840111600160201b83111715610d1357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506135df945050505050565b348015610d5d57600080fd5b5061023a60048036036040811015610d7457600080fd5b506001600160a01b038135811691602001351661360c565b348015610d9857600080fd5b50610800613626565b348015610dad57600080fd5b50610c696004803603610100811015610dc557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613635565b348015610e0f57600080fd5b506101fd60048036036040811015610e2657600080fd5b506001600160a01b0381351690602001356137b1565b6000610e49848484613853565b949350505050565b600033301415610e9e576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b6000610eeb7f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061392b565b9050600086610efa578b610efe565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610f7457600080fd5b505af1158015610f88573d6000803e3d6000fd5b50505050610f9a8d8d8d8d8d8d612894565b9d9c50505050505050505050505050565b60008033301415610ff9576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b60006110467f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061392b565b9050600087611055578c611059565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506110f58e8e8e8e8e8e61110a565b909f909e509c50505050505050505050505050565b6000808242811015611151576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b611180897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61309c565b90935091506111908986856139eb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b505050506112188583613b4e565b50965096945050505050565b60606112517f00000000000000000000000000000000000000000000000000000000000000008484613c41565b90505b92915050565b600080333014156112a8576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b60006112d57f00000000000000000000000000000000000000000000000000000000000000008f8f61392b565b90506000876112e4578c6112e8565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b505050506113858f8f8f8f8f8f8f61309c565b809450819550505050509b509b9950505050505050505050565b606081428110156113e5576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b33301415611430576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061146757fe5b905060200201356001600160a01b03166001600160a01b0316146114c0576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b61151e7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d8e92505050565b9150868260018451038151811061153157fe5b602002602001015110156115765760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106115b257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156115e557600080fd5b505af11580156115f9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116907f00000000000000000000000000000000000000000000000000000000000000008989600081811061165e57fe5b905060200201356001600160a01b03168a8a600181811061167b57fe5b905060200201356001600160a01b031661392b565b8460008151811061169d57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116eb57600080fd5b505af11580156116ff573d6000803e3d6000fd5b505050506040513d602081101561171557600080fd5b505161171d57fe5b61175c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ec5915050565b5095945050505050565b606081428110156117ac576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b61180a7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d8e92505050565b9150868260018451038151811061181d57fe5b602002602001015110156118625760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b6118cd8686600081811061187257fe5b905060200201356001600160a01b03166118b37f00000000000000000000000000000000000000000000000000000000000000008989600081811061165e57fe5b846000815181106118c057fe5b60200260200101516141b8565b61190c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ec5915050565b509695505050505050565b804281101561195b576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b6001841161199e576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b611a12858560008181106119ae57fe5b905060200201356001600160a01b0316611a0c7f0000000000000000000000000000000000000000000000000000000000000000888860008181106119ef57fe5b905060200201356001600160a01b03168989600181811061167b57fe5b896141b8565b600085856000198101818110611a2457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a8057600080fd5b505afa158015611a94573d6000803e3d6000fd5b505050506040513d6020811015611aaa57600080fd5b50516040805160208881028281018201909352888252929350611aec92909189918991829185019084908082843760009201919091525088925061430f915050565b6000611b908288886000198101818110611b0257fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b5e57600080fd5b505afa158015611b72573d6000803e3d6000fd5b505050506040513d6020811015611b8857600080fd5b505190614611565b905087811015611bd15760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b600080516020614fa78339815191523288886000818110611bee57fe5b905060200201356001600160a01b0316898960018c8c905003818110611c1057fe5b905060200201356001600160a01b03168c8560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a1505050505050505050565b60608142811015611cbf576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110611cf957fe5b905060200201356001600160a01b03166001600160a01b031614611d52576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b611db07f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613d8e92505050565b91508682600184510381518110611dc357fe5b60200260200101511015611e085760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b611e188686600081811061187257fe5b611e5782878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ec5915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185510381518110611e9657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ed457600080fd5b505af1158015611ee8573d6000803e3d6000fd5b5050505061190c8483600185510381518110611f0057fe5b6020026020010151613b4e565b60608142811015611f53576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b33301415611f9e576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611fd557fe5b905060200201356001600160a01b03166001600160a01b03161461202e576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b61208c7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4192505050565b9150348260008151811061209c57fe5b602002602001015111156120e15760405162461bcd60e51b8152600401808060200182810382526028815260200180614e7c6028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061211d57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215057600080fd5b505af1158015612164573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121c97f00000000000000000000000000000000000000000000000000000000000000008989600081811061165e57fe5b846000815181106121d657fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561222457600080fd5b505af1158015612238573d6000803e3d6000fd5b505050506040513d602081101561224e57600080fd5b505161225657fe5b61229582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ec5915050565b816000815181106122a257fe5b602002602001015134111561175c5761175c33836000815181106122c257fe5b60200260200101513403613b4e565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e49848484614661565b60608142811015612348576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b6123a67f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4192505050565b915086826000815181106123b657fe5b602002602001015111156118625760405162461bcd60e51b8152600401808060200182810382526028815260200180614e7c6028913960400191505060405180910390fd5b6001600160a01b03841660009081526020818152604080832033845290915290208054840190556024811061250c57600180546001600160a01b0386166001600160a01b03199182161790915560028054909116331790556040516000903090829085908590808383808284376040519201945060009350909150508083038185875af1925050503d80600081146124af576040519150601f19603f3d011682016040523d82523d6000602084013e6124b4565b606091505b505090508061250a576040805162461bcd60e51b815260206004820152601b60248201527f45524332323320696e7465726e616c2063616c6c206661696c65640000000000604482015290519081900360640190fd5b505b50505050565b8042811015612556576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b60018411612599576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106125d357fe5b905060200201356001600160a01b03166001600160a01b03161461262c576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b61263c858560008181106119ae57fe5b61267a85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061430f915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126e957600080fd5b505afa1580156126fd573d6000803e3d6000fd5b505050506040513d602081101561271357600080fd5b50519050868110156127565760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156127bc57600080fd5b505af11580156127d0573d6000803e3d6000fd5b505050506127de8482613b4e565b600080516020614fa783398151915232878760008181106127fb57fe5b905060200201356001600160a01b0316888860018b8b90500381811061281d57fe5b905060200201356001600160a01b03168b8560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050505050505050565b6002546001600160a01b031681565b600081428110156128da576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b612909887f0000000000000000000000000000000000000000000000000000000000000000898989308961309c565b90508092505061299288858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561296157600080fd5b505afa158015612975573d6000803e3d6000fd5b505050506040513d602081101561298b57600080fd5b50516139eb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156129f857600080fd5b505af1158015612a0c573d6000803e3d6000fd5b5050505061190c8483613b4e565b8042811015612a5e576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b33301415612aa9576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b60018411612aec576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110612b2357fe5b905060200201356001600160a01b03166001600160a01b031614612b7c576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612c557f00000000000000000000000000000000000000000000000000000000000000008989600081811061165e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c9c57600080fd5b505af1158015612cb0573d6000803e3d6000fd5b505050506040513d6020811015612cc657600080fd5b5051612cce57fe5b600086866000198101818110612ce057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3c57600080fd5b505afa158015612d50573d6000803e3d6000fd5b505050506040513d6020811015612d6657600080fd5b50516040805160208981028281018201909352898252929350612da89290918a918a91829185019084908082843760009201919091525089925061430f915050565b6000612e1a8289896000198101818110612dbe57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b5e57600080fd5b905088811015612e5b5760405162461bcd60e51b815260040180806020018281038252602c815260200180615067602c913960400191505060405180910390fd5b600080516020614fa78339815191523289896000818110612e7857fe5b905060200201356001600160a01b03168a8a60018d8d905003818110612e9a57fe5b905060200201356001600160a01b0316868560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a1505050505050505050565b60608142811015612f49576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110612f8357fe5b905060200201356001600160a01b03166001600160a01b031614612fdc576040805162461bcd60e51b815260206004820152601e6024820152600080516020614ed1833981519152604482015290519081900360640190fd5b61303a7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4192505050565b9150868260008151811061304a57fe5b60200260200101511115611e085760405162461bcd60e51b8152600401808060200182810382526028815260200180614e7c6028913960400191505060405180910390fd5b6000610e49848484614739565b60008082428110156130e3576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b60006131107f00000000000000000000000000000000000000000000000000000000000000008c8c61392b565b905061311d81828b6141b8565b600080826001600160a01b03166389afcb44896040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b15801561316e57600080fd5b505af1158015613182573d6000803e3d6000fd5b505050506040513d604081101561319857600080fd5b508051602090910151909250905060006131b28e8e6147df565b509050806001600160a01b03168e6001600160a01b0316146131d55781836131d8565b82825b90975095508a87101561321c5760405162461bcd60e51b81526004018080602001828103825260278152602001806150406027913960400191505060405180910390fd5b8986101561325b5760405162461bcd60e51b8152600401808060200182810382526027815260200180614f176027913960400191505060405180910390fd5b7fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef9328f8f8a8a60405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a1505050505097509795505050505050565b60008060008342811015613327576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b33301415613372576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b6133a08a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6148bd565b909450925060006133f27f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061392b565b90506133ff8b82876141b8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561345a57600080fd5b505af115801561346e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156134ea57600080fd5b505af11580156134fe573d6000803e3d6000fd5b505050506040513d602081101561351457600080fd5b505161351c57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561356b57600080fd5b505af115801561357f573d6000803e3d6000fd5b505050506040513d602081101561359557600080fd5b50519250348410156135ad576135ad33853403613b4e565b505096509650969350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606112517f00000000000000000000000000000000000000000000000000000000000000008484613d8e565b600060208181529281526040808220909352908152205481565b6001546001600160a01b031681565b6000806000834281101561367e576040805162461bcd60e51b81526020600482015260196024820152600080516020614f87833981519152604482015290519081900360640190fd5b333014156136c9576040805162461bcd60e51b8152602060048201526013602482015272115490cc8c8cc81b9bdd081858d8d95c1d1959606a1b604482015290519081900360640190fd5b6136d78c8c8c8c8c8c6148bd565b909450925060006137097f00000000000000000000000000000000000000000000000000000000000000008e8e61392b565b90506137168d82876141b8565b6137218c82866141b8565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050506040513d602081101561379a57600080fd5b5051949d939c50939a509198505050505050505050565b336000908152602081815260408083206001600160a01b03861684529091529020548181101561381c576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b336000818152602081815260408083206001600160a01b03881684529091529020838303905561384e908490846139eb565b505050565b60008084116138935760405162461bcd60e51b815260040180806020018281038252602c815260200180614fc7602c913960400191505060405180910390fd5b6000831180156138a35750600082115b6138de5760405162461bcd60e51b8152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b60006138ec856103e6614ba5565b905060006138fa8285614ba5565b905060006139148361390e886103e8614ba5565b90614c08565b905080828161391f57fe5b04979650505050505050565b600080600061393a85856147df565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fe410ea0a25ce340e309f2f0fe9d58d787bb87dd63d02333e8a9a747230f61758609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310613a685780518252601f199092019160209182019101613a49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613aca576040519150601f19603f3d011682016040523d82523d6000602084013e613acf565b606091505b5091509150818015613afd575080511580613afd5750808060200190516020811015613afa57600080fd5b50515b61250a576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310613b9a5780518252601f199092019160209182019101613b7b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613bfc576040519150601f19603f3d011682016040523d82523d6000602084013e613c01565b606091505b505090508061384e5760405162461bcd60e51b8152600401808060200182810382526023815260200180614f646023913960400191505060405180910390fd5b6060600282511015613c9a576040805162461bcd60e51b815260206004820152601f60248201527f536f7946696e616e63654c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613cb257600080fd5b50604051908082528060200260200182016040528015613cdc578160200160208202803683370190505b5090508281600183510381518110613cf057fe5b60209081029190910101528151600019015b8015613d8657600080613d3f87866001860381518110613d1e57fe5b6020026020010151878681518110613d3257fe5b6020026020010151614c57565b91509150613d61848481518110613d5257fe5b60200260200101518383614661565b846001850381518110613d7057fe5b6020908102919091010152505060001901613d02565b509392505050565b6060600282511015613de7576040805162461bcd60e51b815260206004820152601f60248201527f536f7946696e616e63654c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613dff57600080fd5b50604051908082528060200260200182016040528015613e29578160200160208202803683370190505b5090508281600081518110613e3a57fe5b60200260200101818152505060005b6001835103811015613d8657600080613e7f87868581518110613e6857fe5b6020026020010151878660010181518110613d3257fe5b91509150613ea1848481518110613e9257fe5b60200260200101518383613853565b848460010181518110613eb057fe5b60209081029190910101525050600101613e49565b60005b60018351038110156140fc57600080848381518110613ee357fe5b6020026020010151858460010181518110613efa57fe5b6020026020010151915091506000613f1283836147df565b5090506000878560010181518110613f2657fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613f5457826000613f58565b6000835b91509150600060028a51038810613f6f5788613fb0565b613fb07f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613fa357fe5b602002602001015161392b565b9050613fdd7f0000000000000000000000000000000000000000000000000000000000000000888861392b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561401a576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561408257818101518382015260200161406a565b50505050905090810190601f1680156140af5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156140d157600080fd5b505af11580156140e5573d6000803e3d6000fd5b505060019099019850613ec8975050505050505050565b50600080516020614fa7833981519152328360008151811061411a57fe5b60200260200101518460018651038151811061413257fe5b60200260200101518660008151811061414757fe5b60200260200101518760018951038151811061415f57fe5b602002602001015160405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a1505050565b3330811415614228576002546001600160a01b0385811691161461421a576040805162461bcd60e51b81526020600482015260146024820152732a3930b739b332b9103bb937b733903a37b5b2b760611b604482015290519081900360640190fd5b506001546001600160a01b03165b6001600160a01b03808216600090815260208181526040808320938816835292905220548281106142aa5760008382111561426257508281035b6001600160a01b03808416600090815260208181526040808320938a168352929052908120558015614299576142998684836139eb565b6142a48686866139eb565b5061250a565b3330146142c2576142bd85338686614d1e565b61250a565b6040805162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f756768204552433232332062616c616e636500000000000000604482015290519081900360640190fd5b60005b600183510381101561384e5760008084838151811061432d57fe5b602002602001015185846001018151811061434457fe5b602002602001015191509150600061435c83836147df565b509050600061438c7f0000000000000000000000000000000000000000000000000000000000000000858561392b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156143cd57600080fd5b505afa1580156143e1573d6000803e3d6000fd5b505050506040513d60608110156143f757600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a81169089161461442d578284614430565b83835b91509150614485828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b5e57600080fd5b9550614492868383613853565b945050505050600080856001600160a01b0316886001600160a01b0316146144bc578260006144c0565b6000835b91509150600060028c51038a106144d7578a61450b565b61450b7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613fa357fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561459557818101518382015260200161457d565b50505050905090810190601f1680156145c25780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145e457600080fd5b505af11580156145f8573d6000803e3d6000fd5b50506001909b019a506143129950505050505050505050565b80820382811115611254576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116146a15760405162461bcd60e51b815260040180806020018281038252602d815260200180614ea4602d913960400191505060405180910390fd5b6000831180156146b15750600082115b6146ec5760405162461bcd60e51b8152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b60006147046103e86146fe8688614ba5565b90614ba5565b905060006147186103e66146fe8689614611565b905061472f600182848161472857fe5b0490614c08565b9695505050505050565b60008084116147795760405162461bcd60e51b8152600401808060200182810382526026815260200180614ef16026913960400191505060405180910390fd5b6000831180156147895750600082115b6147c45760405162461bcd60e51b8152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b826147cf8584614ba5565b816147d657fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156148335760405162461bcd60e51b8152600401808060200182810382526026815260200180614f3e6026913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614853578284614856565b83835b90925090506001600160a01b0382166148b6576040805162461bcd60e51b815260206004820152601f60248201527f536f7946696e616e63654c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561494957600080fd5b505afa15801561495d573d6000803e3d6000fd5b505050506040513d602081101561497357600080fd5b50516001600160a01b03161415614a31577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015614a0457600080fd5b505af1158015614a18573d6000803e3d6000fd5b505050506040513d6020811015614a2e57600080fd5b50505b600080614a5f7f00000000000000000000000000000000000000000000000000000000000000008b8b614c57565b91509150816000148015614a71575080155b15614a8157879350869250614b41565b6000614a8e898484614739565b9050878111614ae15785811015614ad65760405162461bcd60e51b8152600401808060200182810382526027815260200180614f176027913960400191505060405180910390fd5b889450925082614b3f565b6000614aee898486614739565b905089811115614afa57fe5b87811015614b395760405162461bcd60e51b81526004018080602001828103825260278152602001806150406027913960400191505060405180910390fd5b94508793505b505b604080513281526001600160a01b03808d1660208301528b1681830152606081018690526080810185905290517fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd99181900360a00190a15050965096945050505050565b6000811580614bc057505080820282828281614bbd57fe5b04145b611254576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611254576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000614c6685856147df565b509050600080614c7788888861392b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614caf57600080fd5b505afa158015614cc3573d6000803e3d6000fd5b505050506040513d6060811015614cd957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614d0c578082614d0f565b81815b90999098509650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310614da35780518252601f199092019160209182019101614d84565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614e05576040519150601f19603f3d011682016040523d82523d6000602084013e614e0a565b606091505b5091509150818015614e38575080511580614e385750808060200190516020811015614e3557600080fd5b50515b614e735760405162461bcd60e51b815260040180806020018281038252602481526020018061501c6024913960400191505060405180910390fd5b50505050505056fe536f7946696e616e6365526f757465723a204558434553534956455f494e5055545f414d4f554e54536f7946696e616e63654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54536f7946696e616e6365526f757465723a20494e56414c49445f504154480000536f7946696e616e63654c6962726172793a20494e53554646494349454e545f414d4f554e54536f7946696e616e6365526f757465723a20494e53554646494349454e545f425f414d4f554e54536f7946696e616e63654c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a20434c4f5f5452414e534645525f4641494c4544536f7946696e616e6365526f757465723a204558504952454400000000000000cd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062536f7946696e616e63654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54536f7946696e616e63654c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544536f7946696e616e6365526f757465723a20494e53554646494349454e545f415f414d4f554e54536f7946696e616e6365526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54a264697066735822122076255039af9e6794c1e02af383abff50e8ef2f8610b6f6aa850ec15faa748cf864736f6c634300060c0033000000000000000000000000bf6c50889d3a620eb42c0f188b65ade90de958c400000000000000000000000033e85f0e26600a6644b6c910639b0bc7a99fd34e

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

000000000000000000000000bf6c50889d3a620eb42c0f188b65ade90de958c400000000000000000000000033e85f0e26600a6644b6c910639b0bc7a99fd34e

-----Decoded View---------------
Arg [0] : _factory (address): 0xbf6c50889d3a620eb42c0f188b65ade90de958c4
Arg [1] : _WCLO (address): 0x33e85f0e26600a6644b6c910639b0bc7a99fd34e

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bf6c50889d3a620eb42c0f188b65ade90de958c4
Arg [1] : 00000000000000000000000033e85f0e26600a6644b6c910639b0bc7a99fd34e


Deployed ByteCode Sourcemap

15511:21785:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18462:10;-1:-1:-1;;;;;18476:4:0;18462:18;;18455:26;;;;15511:21785;;;;;36236:263;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36236:263:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25608:729;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25608:729:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24142:680::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24142:680:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22769:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22769:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37039:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37039:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37039:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37039:254:0;;-1:-1:-1;37039:254:0;;-1:-1:-1;;;;;37039:254:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23448:688;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23448:688:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28483:719::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28483:719:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28483:719:0;;;;;;;;;;;;-1:-1:-1;28483:719:0;-1:-1:-1;;;;;;28483:719:0;;;;;;;;:::i;27297:598::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27297:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27297:598:0;;;;;;;;;;;;-1:-1:-1;27297:598:0;-1:-1:-1;;;;;;27297:598:0;;;;;;;;:::i;33046:891::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33046:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33046:891:0;;;;;;;;;;;;-1:-1:-1;33046:891:0;-1:-1:-1;;;;;;33046:891:0;;;;;;;;:::i;30013:821::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30013:821:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30013:821:0;;;;;;;;;;;;-1:-1:-1;30013:821:0;-1:-1:-1;;;;;;30013:821:0;;;;;;;;:::i;30840:832::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30840:832:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30840:832:0;;;;;;;;;;;;-1:-1:-1;30840:832:0;-1:-1:-1;;;;;;30840:832:0;;;;;;;;:::i;15647:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;15647:38:0;;;;;;;;;;;;;;36507:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36507:262:0;;;;;;;;;;;;:::i;27901:576::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27901:576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27901:576:0;;;;;;;;;;;;-1:-1:-1;27901:576:0;-1:-1:-1;;;;;;27901:576:0;;;;;;;;:::i;16595:491::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16595:491:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16595:491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16595:491:0;;;;;;;;;;-1:-1:-1;16595:491:0;;-1:-1:-1;16595:491:0;-1:-1:-1;16595:491:0;:::i;35020:975::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35020:975:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35020:975:0;;;;;;;;;;;;-1:-1:-1;35020:975:0;-1:-1:-1;;;;;;35020:975:0;;;;;;;;:::i;15843:27::-;;;;;;;;;;;;;:::i;24901:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24901:701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33943:1071::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33943:1071:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33943:1071:0;;;;;;;;;;;;-1:-1:-1;33943:1071:0;-1:-1:-1;;;;;;33943:1071:0;;;;;;;;:::i;29208:799::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29208:799:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29208:799:0;;;;;;;;;;;;-1:-1:-1;29208:799:0;-1:-1:-1;;;;;;29208:799:0;;;;;;;;:::i;36039:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36039:189:0;;;;;;;;;;;;:::i;21744:1019::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21744:1019:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20749:952::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20749:952:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;15599:41;;;;;;;;;;;;;:::i;36777:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36777:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36777:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36777:254:0;;-1:-1:-1;36777:254:0;;-1:-1:-1;;;;;36777:254:0:i;15692:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15692:65:0;;;;;;;;;;:::i;15793:24::-;;;;;;;;;;;;;:::i;20060:683::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20060:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17151:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17151:318:0;;;;;;;;:::i;36236:263::-;36389:14;36428:63;36459:8;36469:9;36480:10;36428:30;:63::i;:::-;36421:70;36236:263;-1:-1:-1;;;;36236:263:0:o;25608:729::-;25935:14;16396:10;16418:4;16396:27;;16388:59;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;;;25962:12:::1;25977:47;26003:7;26012:5;26019:4;25977:25;:47::i;:::-;25962:62;;26035:10;26048;:33;;26072:9;26048:33;;;-1:-1:-1::0;;26048:33:0::1;26092:81;::::0;;-1:-1:-1;;;26092:81:0;;26121:10:::1;26092:81;::::0;::::1;::::0;26141:4:::1;26092:81:::0;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;26035:46;;-1:-1:-1;;;;;;26092:28:0;::::1;::::0;::::1;::::0;:81;;;;;-1:-1:-1;;26092:81:0;;;;;;;;-1:-1:-1;26092:28:0;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26196:133;26258:5;26265:9;26276:14;26292:12;26306:2;26310:8;26196:47;:133::i;:::-;26184:145:::0;25608:729;-1:-1:-1;;;;;;;;;;;;;25608:729:0:o;24142:680::-;24440:16;;16396:10;16418:4;16396:27;;16388:59;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;;;24485:12:::1;24500:47;24526:7;24535:5;24542:4;24500:25;:47::i;:::-;24485:62;;24558:10;24571;:33;;24595:9;24571:33;;;-1:-1:-1::0;;24571:33:0::1;24615:81;::::0;;-1:-1:-1;;;24615:81:0;;24644:10:::1;24615:81;::::0;::::1;::::0;24664:4:::1;24615:81:::0;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;24558:46;;-1:-1:-1;;;;;;24615:28:0;::::1;::::0;::::1;::::0;:81;;;;;-1:-1:-1;;24615:81:0;;;;;;;;-1:-1:-1;24615:28:0;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24734:80;24753:5;24760:9;24771:14;24787:12;24801:2;24805:8;24734:18;:80::i;:::-;24707:107:::0;;;;-1:-1:-1;24142:680:0;-1:-1:-1;;;;;;;;;;;;;24142:680:0:o;22769:673::-;23006:16;23024:14;22987:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;23078:196:::1;23108:5;23128:4;23147:9;23171:14;23200:12;23235:4;23255:8;23078:15;:196::i;:::-;23051:223:::0;;-1:-1:-1;23051:223:0;-1:-1:-1;23285:51:0::1;23313:5:::0;23320:2;23051:223;23285:27:::1;:51::i;:::-;23353:4;-1:-1:-1::0;;;;;23347:20:0::1;;23368:9;23347:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23389:45;23420:2;23424:9;23389:30;:45::i;:::-;22769:673:::0;;;;;;;;;;:::o;37039:254::-;37183:21;37229:56;37260:7;37269:9;37280:4;37229:30;:56::i;:::-;37222:63;;37039:254;;;;;:::o;23448:688::-;23763:12;;16396:10;16418:4;16396:27;;16388:59;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;;;23802:12:::1;23817:50;23843:7;23852:6;23860;23817:25;:50::i;:::-;23802:65;;23878:10;23891;:33;;23915:9;23891:33;;;-1:-1:-1::0;;23891:33:0::1;23935:81;::::0;;-1:-1:-1;;;23935:81:0;;23964:10:::1;23935:81;::::0;::::1;::::0;23984:4:::1;23935:81:::0;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;23878:46;;-1:-1:-1;;;;;;23935:28:0;::::1;::::0;::::1;::::0;:81;;;;;-1:-1:-1;;23935:81:0;;;;;;;;-1:-1:-1;23935:28:0;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24048:80;24064:6;24072;24080:9;24091:10;24103;24115:2;24119:8;24048:15;:80::i;:::-;24027:101;;;;;;;;16458:1;;23448:688:::0;;;;;;;;;;;;;;:::o;28483:719::-;28717:21;28671:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;16396:10:::1;16418:4;16396:27;;16388:59;;;::::0;;-1:-1:-1;;;16388:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;::::1;;28775:4:::2;-1:-1:-1::0;;;;;28764:15:0::2;:4;;28769:1;28764:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28764:7:0::2;-1:-1:-1::0;;;;;28764:15:0::2;;28756:58;;;::::0;;-1:-1:-1;;;28756:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;28756:58:0;;;;;;;;;;;;;::::2;;28835:57;28867:7;28876:9;28887:4;;28835:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;28835:31:0::2;::::0;-1:-1:-1;;;28835:57:0:i:2;:::-;28825:67;;28942:12;28911:7;28936:1;28919:7;:14;:18;28911:27;;;;;;;;;;;;;;:43;;28903:100;;;;-1:-1:-1::0;;;28903:100:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29020:4;-1:-1:-1::0;;;;;29014:19:0::2;;29041:7;29049:1;29041:10;;;;;;;;;;;;;;29014:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;29078:4;-1:-1:-1::0;;;;;29072:20:0::2;;29093:52;29119:7;29128:4;;29133:1;29128:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29128:7:0::2;29137:4;;29142:1;29137:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29137:7:0::2;29093:25;:52::i;:::-;29147:7;29155:1;29147:10;;;;;;;;;;;;;;29072:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;29072:86:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;29072:86:0;29065:94:::2;;;;29170:24;29176:7;29185:4;;29170:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;29191:2:0;;-1:-1:-1;29170:5:0::2;::::0;-1:-1:-1;;29170:24:0:i:2;:::-;28483:719:::0;;;;;;;;:::o;27297:598::-;27521:21;27502:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;27565:56:::1;27597:7;27606:8;27616:4;;27565:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27565:31:0::1;::::0;-1:-1:-1;;;27565:56:0:i:1;:::-;27555:66;;27671:12;27640:7;27665:1;27648:7;:14;:18;27640:27;;;;;;;;;;;;;;:43;;27632:100;;;;-1:-1:-1::0;;;27632:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27743:109;27768:4;;27773:1;27768:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27768:7:0::1;27777:52;27803:7;27812:4;;27817:1;27812:7;;;;;;27777:52;27831:7;27839:1;27831:10;;;;;;;;;;;;;;27743;:109::i;:::-;27863:24;27869:7;27878:4;;27863:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27884:2:0;;-1:-1:-1;27863:5:0::1;::::0;-1:-1:-1;;27863:24:0:i:1;:::-;27297:598:::0;;;;;;;;;:::o;33046:891::-;33280:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;33323:1:::1;33309:15:::0;::::1;33301:58;;;::::0;;-1:-1:-1;;;33301:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33301:58:0;;;;;;;;;;;;;::::1;;33378:107;33403:4;;33408:1;33403:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33403:7:0::1;33412:52;33438:7;33447:4;;33452:1;33447:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33447:7:0::1;33456:4;;33461:1;33456:7;;;;;;33412:52;33466:8;33378:10;:107::i;:::-;33496:18;33525:4:::0;;-1:-1:-1;;33530:15:0;;33525:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33525:21:0::1;-1:-1:-1::0;;;;;33517:40:0::1;;33558:2;33517:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33517:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33517:44:0;33572::::1;::::0;;33517::::1;33572::::0;;::::1;::::0;;;;;;;;;;;33517;;-1:-1:-1;33572:44:0::1;::::0;;;33607:4;;;;;;33572:44;::::1;::::0;33607:4;;33572:44;33607:4;33572:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33613:2:0;;-1:-1:-1;33572:34:0::1;::::0;-1:-1:-1;;33572:44:0:i:1;:::-;33627:14;33644:63;33693:13:::0;33652:4;;-1:-1:-1;;33657:15:0;;33652:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33652:21:0::1;-1:-1:-1::0;;;;;33644:40:0::1;;33685:2;33644:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33644:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33644:44:0;;:48:::1;:63::i;:::-;33627:80;;33753:12;33740:9;:25;;33718:119;;;;-1:-1:-1::0;;;33718:119:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;33866:9:0::1;33877:4;;33882:1;33877:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33877:7:0::1;33886:4;;33905:1;33891:4;;:11;;:15;33886:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;33886:21:0::1;33909:8;33919:9;33861:68;;;;-1:-1:-1::0;;;;;33861:68:0::1;;;;;;-1:-1:-1::0;;;;;33861:68:0::1;;;;;;-1:-1:-1::0;;;;;33861:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16340:1;;33046:891:::0;;;;;;;:::o;30013:821::-;30227:21;30199:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30299:4:0::1;30274:29;:4:::0;;-1:-1:-1;;30279:15:0;;30274:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30274:21:0::1;-1:-1:-1::0;;;;;30274:29:0::1;;30266:72;;;::::0;;-1:-1:-1;;;30266:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;30266:72:0;;;;;;;;;;;;;::::1;;30359:56;30391:7;30400:8;30410:4;;30359:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30359:31:0::1;::::0;-1:-1:-1;;;30359:56:0:i:1;:::-;30349:66;;30465:12;30434:7;30459:1;30442:7;:14;:18;30434:27;;;;;;;;;;;;;;:43;;30426:100;;;;-1:-1:-1::0;;;30426:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30537:109;30562:4;;30567:1;30562:7;;;;;;30537:109;30657:35;30663:7;30672:4;;30657:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30686:4:0::1;::::0;-1:-1:-1;30657:5:0::1;::::0;-1:-1:-1;;30657:35:0:i:1;:::-;30709:4;-1:-1:-1::0;;;;;30703:20:0::1;;30724:7;30749:1;30732:7;:14;:18;30724:27;;;;;;;;;;;;;;30703:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30763:63;30794:2;30798:7;30823:1;30806:7;:14;:18;30798:27;;;;;;;;;;;;;;30763:30;:63::i;30840:832::-:0;31071:21;31025:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;16396:10:::1;16418:4;16396:27;;16388:59;;;::::0;;-1:-1:-1;;;16388:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;::::1;;31129:4:::2;-1:-1:-1::0;;;;;31118:15:0::2;:4;;31123:1;31118:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31118:7:0::2;-1:-1:-1::0;;;;;31118:15:0::2;;31110:58;;;::::0;;-1:-1:-1;;;31110:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;31110:58:0;;;;;;;;;;;;;::::2;;31189:56;31220:7;31229:9;31240:4;;31189:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;31189:30:0::2;::::0;-1:-1:-1;;;31189:56:0:i:2;:::-;31179:66;;31278:9;31264:7;31272:1;31264:10;;;;;;;;;;;;;;:23;;31256:76;;;;-1:-1:-1::0;;;31256:76:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31349:4;-1:-1:-1::0;;;;;31343:19:0::2;;31370:7;31378:1;31370:10;;;;;;;;;;;;;;31343:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;31407:4;-1:-1:-1::0;;;;;31401:20:0::2;;31422:52;31448:7;31457:4;;31462:1;31457:7;;;;;;31422:52;31476:7;31484:1;31476:10;;;;;;;;;;;;;;31401:86;;;;;;;;;;;;;-1:-1:-1::0;;;;;31401:86:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;31401:86:0;31394:94:::2;;;;31499:24;31505:7;31514:4;;31499:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;31520:2:0;;-1:-1:-1;31499:5:0::2;::::0;-1:-1:-1;;31499:24:0:i:2;:::-;31586:7;31594:1;31586:10;;;;;;;;;;;;;;31574:9;:22;31570:94;;;31598:66;31629:10;31653:7;31661:1;31653:10;;;;;;;;;;;;;;31641:9;:22;31598:30;:66::i;15647:38::-:0;;;:::o;36507:262::-;36660:13;36698:63;36728:9;36739;36750:10;36698:29;:63::i;27901:576::-;28125:21;28106:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;28169:56:::1;28200:7;28209:9;28220:4;;28169:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28169:30:0::1;::::0;-1:-1:-1;;;28169:56:0:i:1;:::-;28159:66;;28258:11;28244:7;28252:1;28244:10;;;;;;;;;;;;;;:25;;28236:78;;;;-1:-1:-1::0;;;28236:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16595:491:::0;-1:-1:-1;;;;;16723:20:0;;:13;:20;;;;;;;;;;;16744:10;16723:32;;;;;;;;;:41;;16688:76;;16826:2;16810:18;;16806:273;;16881:9;:17;;-1:-1:-1;;;;;16881:17:0;;-1:-1:-1;;;;;;16881:17:0;;;;;;;16913:12;:25;;;;;16928:10;16913:25;;;16971:34;;16881:9;;16979:4;;16881:9;;16999:5;;;;16971:34;16999:5;;;;16971:34;;;;;;;-1:-1:-1;16971:34:0;;-1:-1:-1;16971:34:0;;-1:-1:-1;;16971:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16953:52;;;17028:7;17020:47;;;;;-1:-1:-1;;;17020:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16806:273;;16595:491;;;;:::o;35020:975::-;35287:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;35335:1:::1;35321:15:::0;::::1;35313:58;;;::::0;;-1:-1:-1;;;35313:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35313:58:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35423:4:0::1;35398:29;:4:::0;;-1:-1:-1;;35403:15:0;;35398:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35398:21:0::1;-1:-1:-1::0;;;;;35398:29:0::1;;35390:72;;;::::0;;-1:-1:-1;;;35390:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35390:72:0;;;;;;;;;;;;;::::1;;35473:107;35498:4;;35503:1;35498:7;;;;;;35473:107;35591:55;35626:4;;35591:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35640:4:0::1;::::0;-1:-1:-1;35591:34:0::1;::::0;-1:-1:-1;;35591:55:0:i:1;:::-;35657:14;35682:4;-1:-1:-1::0;;;;;35674:23:0::1;;35706:4;35674:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;35674:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35674:38:0;;-1:-1:-1;35731:25:0;;::::1;;35723:82;;;;-1:-1:-1::0;;;35723:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35822:4;-1:-1:-1::0;;;;;35816:20:0::1;;35837:9;35816:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35858:45;35889:2;35893:9;35858:30;:45::i;:::-;-1:-1:-1::0;;;;;;;;;;;35924:9:0::1;35935:4;;35940:1;35935:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35935:7:0::1;35944:4;;35963:1;35949:4;;:11;;:15;35944:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;35944:21:0::1;35967:8;35977:9;35919:68;;;;-1:-1:-1::0;;;;;35919:68:0::1;;;;;;-1:-1:-1::0;;;;;35919:68:0::1;;;;;;-1:-1:-1::0;;;;;35919:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16340:1;35020:975:::0;;;;;;;:::o;15843:27::-;;;-1:-1:-1;;;;;15843:27:0;;:::o;24901:701::-;25167:14;25148:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;25210:196:::1;25240:5;25260:4;25279:9;25303:14;25332:12;25367:4;25387:8;25210:15;:196::i;:::-;25194:212;;;;;;25417:79;25445:5;25452:2;25464:5;-1:-1:-1::0;;;;;25456:24:0::1;;25489:4;25456:39;;;;;;;;;;;;;-1:-1:-1::0;;;;;25456:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25456:39:0;25417:27:::1;:79::i;:::-;25513:4;-1:-1:-1::0;;;;;25507:20:0::1;;25528:9;25507:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25549:45;25580:2;25584:9;25549:30;:45::i;33943:1071::-:0;34203:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;16396:10:::1;16418:4;16396:27;;16388:59;;;::::0;;-1:-1:-1;;;16388:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;::::1;;34269:1:::2;34255:15:::0;::::2;34247:58;;;::::0;;-1:-1:-1;;;34247:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;34247:58:0;;;;;;;;;;;;;::::2;;34343:4;-1:-1:-1::0;;;;;34332:15:0::2;:4;;34337:1;34332:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34332:7:0::2;-1:-1:-1::0;;;;;34332:15:0::2;;34324:58;;;::::0;;-1:-1:-1;;;34324:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;;;;;;;34324:58:0;;;;;;;;;;;;;::::2;;34393:13;34409:9;34393:25;;34435:4;-1:-1:-1::0;;;;;34429:19:0::2;;34456:8;34429:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;34491:4;-1:-1:-1::0;;;;;34485:20:0::2;;34506:52;34532:7;34541:4;;34546:1;34541:7;;;;;;34506:52;34560:8;34485:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;34485:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34485:84:0;34478:92:::2;;;;34581:18;34610:4:::0;;-1:-1:-1;;34615:15:0;;34610:21;;::::2;;;;;;;;;;;-1:-1:-1::0;;;;;34610:21:0::2;-1:-1:-1::0;;;;;34602:40:0::2;;34643:2;34602:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;34602:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34602:44:0;34657::::2;::::0;;34602::::2;34657::::0;;::::2;::::0;;;;;;;;;;;34602;;-1:-1:-1;34657:44:0::2;::::0;;;34692:4;;;;;;34657:44;::::2;::::0;34692:4;;34657:44;34692:4;34657:44;::::2;;::::0;::::2;::::0;;;;-1:-1:-1;34698:2:0;;-1:-1:-1;34657:34:0::2;::::0;-1:-1:-1;;34657:44:0:i:2;:::-;34712:14;34729:63;34778:13:::0;34737:4;;-1:-1:-1;;34742:15:0;;34737:21;;::::2;;;;;;;;;;;-1:-1:-1::0;;;;;34737:21:0::2;-1:-1:-1::0;;;;;34729:40:0::2;;34770:2;34729:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;34729:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;:63;34712:80;;34838:12;34825:9;:25;;34803:119;;;;-1:-1:-1::0;;;34803:119:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;34943:9:0::2;34954:4;;34959:1;34954:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34954:7:0::2;34963:4;;34982:1;34968:4;;:11;;:15;34963:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;34963:21:0::2;34986:8;34996:9;34938:68;;;;-1:-1:-1::0;;;;;34938:68:0::2;;;;;;-1:-1:-1::0;;;;;34938:68:0::2;;;;;;-1:-1:-1::0;;;;;34938:68:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16458:1;;;33943:1071:::0;;;;;;:::o;29208:799::-;29422:21;29394:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29494:4:0::1;29469:29;:4:::0;;-1:-1:-1;;29474:15:0;;29469:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;29469:21:0::1;-1:-1:-1::0;;;;;29469:29:0::1;;29461:72;;;::::0;;-1:-1:-1;;;29461:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29461:72:0;;;;;;;;;;;;;::::1;;29554:56;29585:7;29594:9;29605:4;;29554:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29554:30:0::1;::::0;-1:-1:-1;;;29554:56:0:i:1;:::-;29544:66;;29643:11;29629:7;29637:1;29629:10;;;;;;;;;;;;;;:25;;29621:78;;;;-1:-1:-1::0;;;29621:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36039:189:::0;36136:12;36168:52;36192:7;36201:8;36211;36168:23;:52::i;21744:1019::-;21998:12;22012;21979:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;22037:12:::1;22052:50;22078:7;22087:6;22095;22052:25;:50::i;:::-;22037:65;;22113:33;22124:4;22130;22136:9;22113:10;:33::i;:::-;22286:12;22300::::0;22332:4:::1;-1:-1:-1::0;;;;;22316:26:0::1;;22343:2;22316:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;22316:30:0::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22316:30:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;22316:30:0;-1:-1:-1;22358:14:0::1;22377:44;22406:6:::0;22414;22377:28:::1;:44::i;:::-;22357:64;;;22463:6;-1:-1:-1::0;;;;;22453:16:0::1;:6;-1:-1:-1::0;;;;;22453:16:0::1;;:58;;22494:7;22503;22453:58;;;22473:7;22482;22453:58;22432:79:::0;;-1:-1:-1;22432:79:0;-1:-1:-1;22530:21:0;;::::1;;22522:73;;;;-1:-1:-1::0;;;22522:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22625:10;22614:7;:21;;22606:73;;;;-1:-1:-1::0;;;22606:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22695:60;22711:9;22722:6;22730;22738:7;22747;22695:60;;;;-1:-1:-1::0;;;;;22695:60:0::1;;;;;;-1:-1:-1::0;;;;;22695:60:0::1;;;;;;-1:-1:-1::0;;;;;22695:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16340:1;;;;21744:1019:::0;;;;;;;;;;;:::o;20749:952::-;21011:16;21029:14;21045;20983:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;16396:10:::1;16418:4;16396:27;;16388:59;;;::::0;;-1:-1:-1;;;16388:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;::::1;;21099:176:::2;21127:5;21147:4;21166:18;21199:9;21223:14;21252:12;21099:13;:176::i;:::-;21072:203:::0;;-1:-1:-1;21072:203:0;-1:-1:-1;21286:12:0::2;21301:47;21327:7;21336:5:::0;21343:4:::2;21301:25;:47::i;:::-;21286:62;;21359:36;21370:5;21377:4;21383:11;21359:10;:36::i;:::-;21412:4;-1:-1:-1::0;;;;;21406:19:0::2;;21433:9;21406:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;21469:4;-1:-1:-1::0;;;;;21463:20:0::2;;21484:4;21490:9;21463:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;21463:37:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21463:37:0;21456:45:::2;;;;21540:4;-1:-1:-1::0;;;;;21524:26:0::2;;21551:2;21524:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;21524:30:0::2;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21524:30:0;;-1:-1:-1;21605:9:0::2;:21:::0;-1:-1:-1;21601:92:0::2;;;21628:65;21659:10;21683:9;21671;:21;21628:30;:65::i;:::-;16458:1;20749:952:::0;;;;;;;;;;;:::o;15599:41::-;;;:::o;36777:254::-;36921:21;36967:56;36999:7;37008:8;37018:4;36967:31;:56::i;15692:65::-;;;;;;;;;;;;;;;;;;;;;;:::o;15793:24::-;;;-1:-1:-1;;;;;15793:24:0;;:::o;20060:683::-;20357:12;20371;20385:14;20329:8;16284:15;16272:8;:27;;16264:65;;;;;-1:-1:-1;;;16264:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16264:65:0;;;;;;;;;;;;;;;16396:10:::1;16418:4;16396:27;;16388:59;;;::::0;;-1:-1:-1;;;16388:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16388:59:0;;;;;;;;;;;;;::::1;;20433:85:::2;20447:6;20455;20463:14;20479;20495:10;20507;20433:13;:85::i;:::-;20412:106:::0;;-1:-1:-1;20412:106:0;-1:-1:-1;20529:12:0::2;20544:50;20570:7;20579:6:::0;20587;20544:25:::2;:50::i;:::-;20529:65;;20605:33;20616:6;20624:4;20630:7;20605:10;:33::i;:::-;20649;20660:6;20668:4;20674:7;20649:10;:33::i;:::-;20721:4;-1:-1:-1::0;;;;;20705:26:0::2;;20732:2;20705:30;;;;;;;;;;;;;-1:-1:-1::0;;;;;20705:30:0::2;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;20705:30:0;20060:683;;;;-1:-1:-1;20705:30:0;;-1:-1:-1;20060:683:0;;-1:-1:-1;;;;;;;;;20060:683:0:o;17151:318::-;17250:10;17217:16;17236:25;;;;;;;;;;;-1:-1:-1;;;;;17236:32:0;;;;;;;;;;17287:21;;;;17279:51;;;;;-1:-1:-1;;;17279:51:0;;;;;;;;;;;;-1:-1:-1;;;17279:51:0;;;;;;;;;;;;;;;17355:10;17341:13;:25;;;;;;;;;;;-1:-1:-1;;;;;17341:32:0;;;;;;;;;17376:20;;;17341:55;;17407:54;;17367:5;;17390:6;17407:27;:54::i;:::-;17151:318;;;:::o;12190:519::-;12283:14;12329:1;12318:8;:12;12310:69;;;;-1:-1:-1;;;12310:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12410:1;12398:9;:13;:31;;;;;12428:1;12415:10;:14;12398:31;12390:85;;;;-1:-1:-1;;;12390:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12486:20;12509:17;:8;12522:3;12509:12;:17::i;:::-;12486:40;-1:-1:-1;12537:14:0;12554:31;12486:40;12574:10;12554:19;:31::i;:::-;12537:48;-1:-1:-1;12596:16:0;12615:40;12639:15;12615:19;:9;12629:4;12615:13;:19::i;:::-;:23;;:40::i;:::-;12596:59;;12690:11;12678:9;:23;;;;;;;12190:519;-1:-1:-1;;;;;;;12190:519:0:o;10694:478::-;10783:12;10809:14;10825;10843:26;10854:6;10862;10843:10;:26::i;:::-;11007:32;;;-1:-1:-1;;11007:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10997:43;;;;;;-1:-1:-1;;;;;;10910:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10900:262;;;;;;;;;10694:478;-1:-1:-1;;;;;10694:478:0:o;584:361::-;779:45;;;-1:-1:-1;;;;;779:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;779:45:0;-1:-1:-1;;;779:45:0;;;768:57;;;;733:12;;747:17;;768:10;;;;779:45;768:57;;;779:45;768:57;;779:45;768:57;;;;;;;;;;-1:-1:-1;;768:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;732:93;;;;844:7;:57;;;;-1:-1:-1;856:11:0;;:16;;:44;;;887:4;876:24;;;;;;;;;;;;;;;-1:-1:-1;876:24:0;856:44;836:101;;;;;-1:-1:-1;;;836:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1363:195;1471:12;;;1433;1471;;;;;;;;;-1:-1:-1;;;;;1450:7:0;;;1464:5;;1450:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1450:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1432:52;;;1503:7;1495:55;;;;-1:-1:-1;;;1495:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13979:533;14080:21;14137:1;14122:4;:11;:16;;14114:60;;;;;-1:-1:-1;;;14114:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14206:4;:11;14195:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14195:23:0;;14185:33;;14259:9;14229:7;14254:1;14237:7;:14;:18;14229:27;;;;;;;;;;;;;;;;;:39;14293:11;;-1:-1:-1;;14293:15:0;14279:226;14310:5;;14279:226;;14338:14;14354:15;14373:42;14385:7;14394:4;14403:1;14399;:5;14394:11;;;;;;;;;;;;;;14407:4;14412:1;14407:7;;;;;;;;;;;;;;14373:11;:42::i;:::-;14337:78;;;;14447:46;14459:7;14467:1;14459:10;;;;;;;;;;;;;;14471:9;14482:10;14447:11;:46::i;:::-;14430:7;14442:1;14438;:5;14430:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14317:3:0;14279:226;;;;13979:533;;;;;:::o;13386:512::-;13487:21;13544:1;13529:4;:11;:16;;13521:60;;;;;-1:-1:-1;;;13521:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13613:4;:11;13602:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13602:23:0;;13592:33;;13649:8;13636:7;13644:1;13636:10;;;;;;;;;;;;;:21;;;;;13673:6;13668:223;13699:1;13685:4;:11;:15;13681:1;:19;13668:223;;;13723:14;13739:15;13758:42;13770:7;13779:4;13784:1;13779:7;;;;;;;;;;;;;;13788:4;13793:1;13797;13793:5;13788:11;;;;;;;13758:42;13722:78;;;;13832:47;13845:7;13853:1;13845:10;;;;;;;;;;;;;;13857:9;13868:10;13832:12;:47::i;:::-;13815:7;13823:1;13827;13823:5;13815:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13702:3:0;;13668:223;;26448:843;26555:6;26550:630;26581:1;26567:4;:11;:15;26563:1;:19;26550:630;;;26605:13;26620:14;26639:4;26644:1;26639:7;;;;;;;;;;;;;;26648:4;26653:1;26657;26653:5;26648:11;;;;;;;;;;;;;;26604:56;;;;26676:14;26695:43;26724:5;26731:6;26695:28;:43::i;:::-;26675:63;;;26753:14;26770:7;26778:1;26782;26778:5;26770:14;;;;;;;;;;;;;;26753:31;;26800:15;26817;26845:6;-1:-1:-1;;;;;26836:15:0;:5;-1:-1:-1;;;;;26836:15:0;;:61;;26878:9;26894:1;26836:61;;;26860:1;26864:9;26836:61;26799:98;;;;26912:10;26943:1;26929:4;:11;:15;26925:1;:19;:83;;27005:3;26925:83;;;26947:55;26973:7;26982:6;26990:4;26995:1;26999;26995:5;26990:11;;;;;;;;;;;;;;26947:25;:55::i;:::-;26912:96;;27039:49;27065:7;27074:5;27081:6;27039:25;:49::i;:::-;-1:-1:-1;;;;;27023:71:0;;27113:10;27125;27137:2;27151:1;27141:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27141:12:0;;27023:145;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27023:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26584:3:0;;;;;-1:-1:-1;26550:630:0;;-1:-1:-1;;;;;;;;26550:630:0;;;-1:-1:-1;;;;;;;;;;;27200:9:0;27211:4;27216:1;27211:7;;;;;;;;;;;;;;27220:4;27239:1;27225:4;:11;:15;27220:21;;;;;;;;;;;;;;27243:7;27251:1;27243:10;;;;;;;;;;;;;;27255:7;27280:1;27263:7;:14;:18;27255:27;;;;;;;;;;;;;;27195:88;;;;-1:-1:-1;;;;;27195:88:0;;;;;;-1:-1:-1;;;;;27195:88:0;;;;;;-1:-1:-1;;;;;27195:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26448:843;;;:::o;17477:932::-;17574:10;17621:4;17599:27;;17595:147;;;17660:12;;-1:-1:-1;;;;;17651:21:0;;;17660:12;;17651:21;17643:54;;;;;-1:-1:-1;;;17643:54:0;;;;;;;;;;;;-1:-1:-1;;;17643:54:0;;;;;;;;;;;;;;;-1:-1:-1;17721:9:0;;-1:-1:-1;;;;;17721:9:0;17595:147;-1:-1:-1;;;;;17767:21:0;;;17752:12;17767:21;;;;;;;;;;;:28;;;;;;;;;;17810:17;;;17806:596;;17879:9;17917:6;17907:7;:16;17903:45;;;-1:-1:-1;17932:16:0;;;17903:45;-1:-1:-1;;;;;17963:21:0;;;17994:1;17963:21;;;;;;;;;;;:28;;;;;;;;;;;:32;18014:9;;18010:63;;18025:48;18053:5;18060:6;18068:4;18025:27;:48::i;:::-;18123:46;18151:5;18158:2;18162:6;18123:27;:46::i;:::-;17806:596;;;;18191:10;18213:4;18191:27;18187:215;;18260:62;18292:5;18299:10;18311:2;18315:6;18260:31;:62::i;:::-;18187:215;;;18355:35;;;-1:-1:-1;;;18355:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31819:1221;31932:6;31927:1106;31958:1;31944:4;:11;:15;31940:1;:19;31927:1106;;;31982:13;31997:14;32016:4;32021:1;32016:7;;;;;;;;;;;;;;32025:4;32030:1;32034;32030:5;32025:11;;;;;;;;;;;;;;31981:56;;;;32053:14;32072:43;32101:5;32108:6;32072:28;:43::i;:::-;32052:63;;;32130:20;32169:49;32195:7;32204:5;32211:6;32169:25;:49::i;:::-;32130:89;;32234:16;32265:17;32353:13;32368;32386:4;-1:-1:-1;;;;;32386:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32386:18:0;;;;;;;-1:-1:-1;;;;;32352:52:0;;;;-1:-1:-1;32352:52:0;;-1:-1:-1;32420:17:0;;-1:-1:-1;;;;;32461:15:0;;;;;;;:61;;32503:8;32513;32461:61;;;32480:8;32490;32461:61;32419:103;;;;32551:57;32595:12;32559:5;-1:-1:-1;;;;;32551:24:0;;32584:4;32551:39;;;;;;;;;;;;;-1:-1:-1;;;;;32551:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;:57;32537:71;;32638:72;32669:11;32682:12;32696:13;32638:30;:72::i;:::-;32623:87;;31927:1106;;;;32741:15;32758;32786:6;-1:-1:-1;;;;;32777:15:0;:5;-1:-1:-1;;;;;32777:15:0;;:67;;32822:12;32841:1;32777:67;;;32801:1;32805:12;32777:67;32740:104;;;;32859:10;32890:1;32876:4;:11;:15;32872:1;:19;:83;;32952:3;32872:83;;;32894:55;32920:7;32929:6;32937:4;32942:1;32946;32942:5;32937:11;;;;;;;32894:55;33008:12;;;33018:1;33008:12;;;;;;;;;;-1:-1:-1;;;32970:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32970:51:0;;;;;;;;;;;;;;;;;;;;;;32859:96;;-1:-1:-1;32970:9:0;;;;;;32980:10;;32992;;32859:96;;33008:12;;32970:51;;;;;;;;33008:12;;32970:51;;;;33008:12;;32970:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31961:3:0;;;;;-1:-1:-1;31927:1106:0;;-1:-1:-1;;;;;;;;;;31927:1106:0;9799:129;9883:5;;;9878:16;;;;9870:50;;;;;-1:-1:-1;;;9870:50:0;;;;;;;;;;;;-1:-1:-1;;;9870:50:0;;;;;;;;;;;;;;12830:474;12923:13;12969:1;12957:9;:13;12949:71;;;;-1:-1:-1;;;12949:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13051:1;13039:9;:13;:31;;;;;13069:1;13056:10;:14;13039:31;13031:85;;;;-1:-1:-1;;;13031:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:14;13144:34;13173:4;13144:24;:9;13158;13144:13;:24::i;:::-;:28;;:34::i;:::-;13127:51;-1:-1:-1;13189:16:0;13208:34;13238:3;13208:25;:10;13223:9;13208:14;:25::i;:34::-;13189:53;;13264:32;13294:1;13277:11;13265:9;:23;;;;;;;13264:29;:32::i;:::-;13253:43;12830:474;-1:-1:-1;;;;;;12830:474:0:o;11745:323::-;11827:12;11870:1;11860:7;:11;11852:62;;;;-1:-1:-1;;;11852:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11944:1;11933:8;:12;:28;;;;;11960:1;11949:8;:12;11933:28;11925:82;;;;-1:-1:-1;;;11925:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12052:8;12028:21;:7;12040:8;12028:11;:21::i;:::-;:32;;;;;;;11745:323;-1:-1:-1;;;;11745:323:0:o;10251:351::-;10326:14;10342;10387:6;-1:-1:-1;;;;;10377:16:0;:6;-1:-1:-1;;;;;10377:16:0;;;10369:67;;;;-1:-1:-1;;;10369:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10475:6;-1:-1:-1;;;;;10466:15:0;:6;-1:-1:-1;;;;;10466:15:0;;:53;;10504:6;10512;10466:53;;;10485:6;10493;10466:53;10447:72;;-1:-1:-1;10447:72:0;-1:-1:-1;;;;;;10538:20:0;;10530:64;;;;;-1:-1:-1;;;10530:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10251:351;;;;;:::o;18584:1470::-;18802:12;18816;18960:1;-1:-1:-1;;;;;18897:65:0;18916:7;-1:-1:-1;;;;;18897:35:0;;18933:6;18941;18897:51;;;;;;;;;;;;;-1:-1:-1;;;;;18897:51:0;;;;;;-1:-1:-1;;;;;18897:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18897:51:0;-1:-1:-1;;;;;18897:65:0;;18893:152;;;18998:7;-1:-1:-1;;;;;18979:38:0;;19018:6;19026;18979:54;;;;;;;;;;;;;-1:-1:-1;;;;;18979:54:0;;;;;;-1:-1:-1;;;;;18979:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18893:152:0;19056:13;19071;19088:54;19118:7;19127:6;19135;19088:29;:54::i;:::-;19055:87;;;;19157:8;19169:1;19157:13;:30;;;;-1:-1:-1;19174:13:0;;19157:30;19153:821;;;19226:14;;-1:-1:-1;19242:14:0;;-1:-1:-1;19153:821:0;;;19290:19;19312:59;19336:14;19352:8;19362;19312:23;:59::i;:::-;19290:81;;19408:14;19390;:32;19386:577;;19469:10;19451:14;:28;;19443:80;;;;-1:-1:-1;;;19443:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19564:14;;-1:-1:-1;19580:14:0;-1:-1:-1;19580:14:0;19386:577;;;19636:19;19658:59;19682:14;19698:8;19708;19658:23;:59::i;:::-;19636:81;;19761:14;19743;:32;;19736:40;;;;19821:10;19803:14;:28;;19795:80;;;;-1:-1:-1;;;19795:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19916:14;-1:-1:-1;19932:14:0;;-1:-1:-1;19386:577:0;19153:821;;19989:57;;;20002:9;19989:57;;-1:-1:-1;;;;;19989:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18584:1470;;;;;;;;;;;:::o;9936:142::-;9988:6;10015;;;:30;;-1:-1:-1;;10030:5:0;;;10044:1;10039;10030:5;10039:1;10025:15;;;;;:20;10015:30;10007:63;;;;;-1:-1:-1;;;10007:63:0;;;;;;;;;;;;-1:-1:-1;;;10007:63:0;;;;;;;;;;;;;;9663:128;9747:5;;;9742:16;;;;9734:49;;;;;-1:-1:-1;;;9734:49:0;;;;;;;;;;;;-1:-1:-1;;;9734:49:0;;;;;;;;;;;;;;11230:402;11323:13;11338;11365:14;11384:26;11395:6;11403;11384:10;:26::i;:::-;11364:46;;;11432:13;11447;11481:32;11489:7;11498:6;11506;11481:7;:32::i;:::-;-1:-1:-1;;;;;11465:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11465:63:0;;;;;;;-1:-1:-1;;;;;11431:97:0;;;;-1:-1:-1;11431:97:0;;-1:-1:-1;;;;;;11562:16:0;;;;;;;:62;;11605:8;11615;11562:62;;;11582:8;11592;11562:62;11539:85;;;;-1:-1:-1;11230:402:0;-1:-1:-1;;;;;;;11230:402:0:o;953:::-;1178:51;;;-1:-1:-1;;;;;1178:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1178:51:0;-1:-1:-1;;;1178:51:0;;;1167:63;;;;1132:12;;1146:17;;1167:10;;;;1178:51;1167:63;;;1178:51;1167:63;;1178:51;1167:63;;;;;;;;;;-1:-1:-1;;1167:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1131:99;;;;1249:7;:57;;;;-1:-1:-1;1261:11:0;;:16;;:44;;;1292:4;1281:24;;;;;;;;;;;;;;;-1:-1:-1;1281:24:0;1261:44;1241:106;;;;-1:-1:-1;;;1241:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;953:402;;;;;;:::o

Swarm Source

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