Contract 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x82cf1da3ca6da579bf7c18a0f53ace9bd05e2b8f7c5b3cb0448d582d7f5d72a2Add Liquidity ET...192222022021-10-16 6:07:574 mins ago0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf9.988444586801272 FTM0.022193398547
0x0775fc6c08602f0663b1d0a7c7524744f6f21e718c1d2ee249ac71df84699887Swap Exact ETH F...192220402021-10-16 6:04:517 mins ago0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf10 FTM0.018143210289
0x8d3cf7135bb346734858211abb928223ec5be32e7cb176129874ea965caa93a5Swap Exact Token...192218942021-10-16 6:02:419 mins ago0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.017019980303
0x6fb1b65bc8c061c02aa688ee25802683076973314c58ae0606cfc766d701b2e5Swap Exact Token...192214912021-10-16 5:56:0915 mins ago0xff1fc55b3b5d2cc62b82d1f77da88355e8175254 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.02262210544
0x82ffa9055ccb4848c12d115ff2c28cfeba4a8c7c4e3f965ea13d167ef2a978b0Swap Exact Token...192212872021-10-16 5:53:0118 mins ago0xb92f1a40aade2f9dd011136a25da3f173b44ae76 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.01493019
0xbf46752a1045ab226f27108ae59e8c543cfe5272bf0690f76a87bd0fed15128aAdd Liquidity ET...192210522021-10-16 5:49:2322 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf16.722989926072681 FTM0.023175417564
0x220871bb2ab3f300ddff8bd0b86525d3f35f0cc8179eda79364b055cc8e24ec5Swap Exact Token...192209632021-10-16 5:48:0123 mins ago0xb0a8873c7bff967b702555dce95f6c8e8223fd5f IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.017037042947
0x9458131edfa160254654e920a6bca303de5ee2c17c349328bf1a16fdc2b218f5Add Liquidity192206772021-10-16 5:43:4728 mins ago0xa0f5678aa569c6163954c09b1e1a344248616f6e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.024689142024
0x5480b222f62082a6d9f3d60279175beebecce2975b0e37b60eb0e74404efef0cSwap Exact Token...192206442021-10-16 5:43:1528 mins ago0xa0f5678aa569c6163954c09b1e1a344248616f6e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.0253899913
0xff2b636068f76324d7b12c0bceb52830244a82d505629e109d837f8f4d4e79f8Swap Exact Token...192206422021-10-16 5:43:1428 mins ago0xa3602aa3924300d9b69a2b7d2c8702adaef6ef91 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.014233034513
0xd9eefcd80f8249b1a101869b7669e6b5ea3a94e5de6beb58eeb28fe5fa229cb6Swap Exact Token...192205642021-10-16 5:42:0129 mins ago0xa3602aa3924300d9b69a2b7d2c8702adaef6ef91 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.014240354084
0x31e357b0e2bae0c2993abc1b16dd175541717bb302f0fc88876ca802ed4aac92Swap Exact Token...192204232021-10-16 5:39:5732 mins ago0xa3602aa3924300d9b69a2b7d2c8702adaef6ef91 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.014300949439
0x1c844863a7012cde39f634d8c91e29cd1892565b9676b9de16134c44be8119c9Swap Exact Token...192204002021-10-16 5:39:3332 mins ago0xff1fc55b3b5d2cc62b82d1f77da88355e8175254 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.023764369552
0x0b6ec886b91ded35cb4b9a6db0096855a6030eb0de190e1debd139e27ebc6404Swap Exact Token...192202842021-10-16 5:37:5833 mins ago0xc7748db7338cc106aeb041b59965d0101eda8636 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.11078379
0x7bdec6bf0a866b948c6bac9a04d50a563c8c44d381fef9fa77fee700f18c4679Add Liquidity192202542021-10-16 5:37:2834 mins ago0xa0f5678aa569c6163954c09b1e1a344248616f6e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.027509658314
0xfb164fe94405269646788719e04a9a39cd9c71a57567149b59d1e63f96e8093aSwap Exact Token...192202462021-10-16 5:37:2234 mins ago0xff1fc55b3b5d2cc62b82d1f77da88355e8175254 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.024100726896
0xead7325e701a33c52ffc180ae6bb578ec001b3ddbbead9949e656e732d4d8d2aSwap Exact Token...192202112021-10-16 5:36:5135 mins ago0xa0f5678aa569c6163954c09b1e1a344248616f6e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.031464475655
0xdad71721ac8e1c61db043d9d443c3b6237fd64ede3474c8c8a856f8d781c552eSwap Exact Token...192202072021-10-16 5:36:4235 mins ago0xa0f5678aa569c6163954c09b1e1a344248616f6e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.02006409322
0x216ed17ce470d55c7d511aa68673192fae681a6dec342971b5ad4f79fd9dbebaSwap Exact Token...192197662021-10-16 5:25:0246 mins ago0x9935f59aab8ed7bb8723707fbcb3b45bb104aeea IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.01713171438
0x87d4e8c8f36f7ad0f51518cb5622881a7a23d8e8b9590c667334e158068ceb18Swap Exact Token...192196982021-10-16 5:24:0847 mins ago0x2ee09bc24e992bcb920f179d3a783c877da1f095 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.017194991239
0x03093549948b6a6e3234c05fa8760ce0d6bac809a731575c3f17e3db3c245f1eSwap Exact Token...192195212021-10-16 5:21:1650 mins ago0x146a8f8cf4ebab10814bc45b2b9b5b6258083932 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.023558573596
0x32bf60047d76de8d5df4fb63a280999825e65f14081b815bbe30f5c14bac0842Remove Liquidity192194032021-10-16 5:19:4152 mins ago0x4cf7e47900fcd74f1066e98a37ddcea87616552e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.018479231126
0x4422cc67b526f577b1f0c22b8259519bb219f93ce880108f76b907d3dd59e027Swap Exact Token...192193672021-10-16 5:19:1052 mins ago0x6529ce32ce87d9af127817bd004511ea454ca40b IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.036528265905
0x9811a38aa1c208c3476867bf35e6eaa1ef020449784de586c9c4682b12553762Swap Exact Token...192193022021-10-16 5:18:1153 mins ago0x3ba5f4bf028b83631f41819636179b5b88c207e7 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.019427149655
0xf0f1e7e8eabc7baff8ab4310e37333f6251f73630d72566f34ff7dc60b12b944Swap Exact Token...192192622021-10-16 5:17:3954 mins ago0x4cf7e47900fcd74f1066e98a37ddcea87616552e IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.026667019876
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x82cf1da3ca6da579bf7c18a0f53ace9bd05e2b8f7c5b3cb0448d582d7f5d72a2192222022021-10-16 6:07:574 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token9.988444586801272017 FTM
0x82cf1da3ca6da579bf7c18a0f53ace9bd05e2b8f7c5b3cb0448d582d7f5d72a2192222022021-10-16 6:07:574 mins ago 0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf9.988444586801272017 FTM
0x0775fc6c08602f0663b1d0a7c7524744f6f21e718c1d2ee249ac71df84699887192220402021-10-16 6:04:517 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token10 FTM
0x0775fc6c08602f0663b1d0a7c7524744f6f21e718c1d2ee249ac71df84699887192220402021-10-16 6:04:517 mins ago 0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf10 FTM
0x8d3cf7135bb346734858211abb928223ec5be32e7cb176129874ea965caa93a5192218942021-10-16 6:02:419 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xd1cac257c5eee33c0d9f264a2c453e1ce1ce10ab25.229535844178707197 FTM
0x8d3cf7135bb346734858211abb928223ec5be32e7cb176129874ea965caa93a5192218942021-10-16 6:02:419 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf25.229535844178707197 FTM
0x82ffa9055ccb4848c12d115ff2c28cfeba4a8c7c4e3f965ea13d167ef2a978b0192212872021-10-16 5:53:0118 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xb92f1a40aade2f9dd011136a25da3f173b44ae766.633916283068535004 FTM
0x82ffa9055ccb4848c12d115ff2c28cfeba4a8c7c4e3f965ea13d167ef2a978b0192212872021-10-16 5:53:0118 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf6.633916283068535004 FTM
0xbf46752a1045ab226f27108ae59e8c543cfe5272bf0690f76a87bd0fed15128a192210522021-10-16 5:49:2322 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token16.722989926072681253 FTM
0xbf46752a1045ab226f27108ae59e8c543cfe5272bf0690f76a87bd0fed15128a192210522021-10-16 5:49:2322 mins ago 0xb0a8873c7bff967b702555dce95f6c8e8223fd5f 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf16.722989926072681253 FTM
0x220871bb2ab3f300ddff8bd0b86525d3f35f0cc8179eda79364b055cc8e24ec5192209632021-10-16 5:48:0123 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xb0a8873c7bff967b702555dce95f6c8e8223fd5f29.363579547166344831 FTM
0x220871bb2ab3f300ddff8bd0b86525d3f35f0cc8179eda79364b055cc8e24ec5192209632021-10-16 5:48:0123 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf29.363579547166344831 FTM
0x216ed17ce470d55c7d511aa68673192fae681a6dec342971b5ad4f79fd9dbeba192197662021-10-16 5:25:0246 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x9935f59aab8ed7bb8723707fbcb3b45bb104aeea8.500463201763936552 FTM
0x216ed17ce470d55c7d511aa68673192fae681a6dec342971b5ad4f79fd9dbeba192197662021-10-16 5:25:0246 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf8.500463201763936552 FTM
0x87d4e8c8f36f7ad0f51518cb5622881a7a23d8e8b9590c667334e158068ceb18192196982021-10-16 5:24:0847 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x2ee09bc24e992bcb920f179d3a783c877da1f09517.81485940711734647 FTM
0x87d4e8c8f36f7ad0f51518cb5622881a7a23d8e8b9590c667334e158068ceb18192196982021-10-16 5:24:0847 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf17.81485940711734647 FTM
0x9811a38aa1c208c3476867bf35e6eaa1ef020449784de586c9c4682b12553762192193022021-10-16 5:18:1153 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x3ba5f4bf028b83631f41819636179b5b88c207e716.221452747651719363 FTM
0x9811a38aa1c208c3476867bf35e6eaa1ef020449784de586c9c4682b12553762192193022021-10-16 5:18:1153 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf16.221452747651719363 FTM
0x81b3577830d441d210edeb15da7fa52cc8a4caeea7658810c55549c2021c758c192188092021-10-16 5:10:371 hr 1 min ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token25.855608264640770957 FTM
0x81b3577830d441d210edeb15da7fa52cc8a4caeea7658810c55549c2021c758c192188092021-10-16 5:10:371 hr 1 min ago 0xf9b26398731b85665c9dcafbe860097adaf1239c 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf25.855608264640770957 FTM
0x22f12086175f707719b3c978079521fc008ad427dce11477779159a1d374de7c192188032021-10-16 5:10:291 hr 1 min ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xf9b26398731b85665c9dcafbe860097adaf1239c24.718004545921669256 FTM
0x22f12086175f707719b3c978079521fc008ad427dce11477779159a1d374de7c192188032021-10-16 5:10:291 hr 1 min ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf24.718004545921669256 FTM
0x89009b210eea78c3cfe89c61c32a4df8c6f01c2fd7e21ac17abe949dcf09d4d7192184002021-10-16 5:04:261 hr 7 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x9631cd8faf49f0ce67e43fbd7fbff9665d6713b86.054120839273208624 FTM
0x89009b210eea78c3cfe89c61c32a4df8c6f01c2fd7e21ac17abe949dcf09d4d7192184002021-10-16 5:04:261 hr 7 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf6.054120839273208624 FTM
0xd7d76b6a5eacaad10ac2ef4d5f035a257bb07c167a465bcd1b762bc4fbb12b38192175072021-10-16 4:50:121 hr 21 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token55 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SoulSwapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-09-02
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

// File: soulswap-core/contracts/interfaces/IERC20.sol

interface IERC20 {

    // events
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed owner, address indexed spender, uint value);

    // token details
    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);

    // address details
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function getOwner() external view returns (address);

    // token actions
    function approve(address spender, uint value) external returns (bool);
    function transfer(address recipient, uint value) external returns (bool);
    function transferFrom(address sender, address recipient, uint value) external returns (bool);
}

// File: contracts/interfaces/ISoulSwapRouter01.sol

pragma solidity >=0.6.2;

interface ISoulSwapRouter01 {
    function factory() external view returns (address);
    function WETH() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

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

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external returns (uint[] memory amounts);

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external payable returns (uint[] memory amounts);

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

// File: contracts/interfaces/ISoulSwapRouter02.sol

pragma solidity >=0.6.2;

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

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

// File: contracts/interfaces/ISoulSwapFactory.sol

pragma solidity >=0.5.0;

interface ISoulSwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    event SetFeeTo(address indexed user, address indexed _feeTo);
    event SetMigrator(address indexed user, address indexed _migrator);
    event FeeToSetter(address indexed user, address indexed _feeToSetter);

    function feeTo() external view returns (address _feeTo);
    function feeToSetter() external view returns (address _feeToSetter);
    function migrator() external view returns (address _migrator);

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

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setMigrator(address) external;
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: soulswap-lib/contracts/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

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

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

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

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

// File: soulswap-core/contracts/interfaces/ISoulSwapPair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: soulswap-core/contracts/libraries/SafeMath.sol

pragma solidity >=0.5.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// File: contracts/libraries/SoulSwapLibrary.sol

pragma solidity >=0.5.0;

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

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISoulSwapPair(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, 'SoulSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SoulSwapLibrary: 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, 'SoulSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SoulSwapLibrary: 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, 'SoulSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SoulSwapLibrary: 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, 'SoulSwapLibrary: 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, 'SoulSwapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/SoulSwapRouter.sol

pragma solidity >=0.6.6;

contract SoulSwapRouter is ISoulSwapRouter02 {
    using SafeMath for uint256;

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

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "SoulSwapRouter: EXPIRED");
        _;
    }

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (ISoulSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ISoulSwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) =
            SoulSwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal =
                SoulSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "SoulSwapRouter: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal =
                    SoulSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "SoulSwapRouter: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

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

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = SoulSwapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ISoulSwapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH)
            TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = SoulSwapLibrary.pairFor(factory, tokenA, tokenB);
        ISoulSwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = ISoulSwapPair(pair).burn(to);
        (address token0, ) = SoulSwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(amountA >= amountAMin, "SoulSwapRouter: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "SoulSwapRouter: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = SoulSwapLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        ISoulSwapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountA, amountB) = removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            to,
            deadline
        );
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external virtual override returns (uint256 amountToken, uint256 amountETH) {
        address pair = SoulSwapLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        ISoulSwapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountToken, amountETH) = removeLiquidityETH(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(
            token,
            to,
            IERC20(token).balanceOf(address(this))
        );
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountETH) {
        address pair = SoulSwapLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        ISoulSwapPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

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

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

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

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

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, "SoulSwapRouter: INVALID_PATH");
        amounts = SoulSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "SoulSwapRouter: EXCESSIVE_INPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            SoulSwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, "SoulSwapRouter: INVALID_PATH");
        amounts = SoulSwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "SoulSwapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            SoulSwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, "SoulSwapRouter: INVALID_PATH");
        amounts = SoulSwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "SoulSwapRouter: EXCESSIVE_INPUT_AMOUNT");
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SoulSwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0])
            TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = SoulSwapLibrary.sortTokens(input, output);
            ISoulSwapPair pair = ISoulSwapPair(SoulSwapLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) =
                    input == token0
                        ? (reserve0, reserve1)
                        : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(
                    reserveInput
                );
                amountOutput = SoulSwapLibrary.getAmountOut(
                    amountInput,
                    reserveInput,
                    reserveOutput
                );
            }
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0
                    ? (uint256(0), amountOutput)
                    : (amountOutput, uint256(0));
            address to =
                i < path.length - 2
                    ? SoulSwapLibrary.pairFor(factory, output, path[i + 2])
                    : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

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

60c060405234801561001057600080fd5b506040516200484b3803806200484b8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6146c6620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b528061277952806129ec5280612a425280612a765280612aea5280612c8a5280612dcd5280612e55525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad528061250652806126fe5280612727528061275752806128c45280612a205280612d1d5280612e875280613718528061375b5280613a3e5280613bbd5280613fdf528061408d528061410d52506146c66000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a6126fc565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612720945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561274d565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612861565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561299d565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c42565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da58583613118565b50965096945050505050565b6000610dbe848484613210565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602a815260200180614567602a913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b031661344c565b85600081518110610fe657fe5b602002602001015161350c565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613669915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b6020026020010151613118565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138af565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f61344c565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614567602a913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b815260040180806020018281038252602681526020018061461a6026913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061344c565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a61350c565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a49290918991899182918501908490808284376000920191909152508892506139e7915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613cf216565b10156118935760405162461bcd60e51b815260040180806020018281038252602a815260200180614567602a913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c28585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139e7915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b815260040180806020018281038252602a815260200180614567602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b505050506118938482613118565b60608142811015611b67576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330092505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b815260040180806020018281038252602a815260200180614567602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b5095945050505050565b6000610dbe848484613d34565b60608142811015611ec7576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b815260040180806020018281038252602681526020018061461a6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e24565b60008142811015611ff1576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e88483613118565b8042811015612170576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a9182918501908490808284376000920191909152508992506139e7915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c61344c565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613ed0565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126ac5760405162461bcd60e51b81526004018080602001828103825260258152602001806145916025913960400191505060405180910390fd5b898610156126eb5760405162461bcd60e51b81526004018080602001828103825260258152602001806144406025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613300565b600080600061279d7f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061344c565b90506000876127ac578c6127b0565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b5050505061284c8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128aa576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b6128b88c8c8c8c8c8c613fae565b909450925060006128ea7f00000000000000000000000000000000000000000000000000000000000000008e8e61344c565b90506128f88d33838861350c565b6129048c33838761350c565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129e6576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b612a148a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fae565b90945092506000612a667f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061344c565b9050612a748b33838861350c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b6857600080fd5b505af1158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b5051612b9a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b505050506040513d6020811015612c1c57600080fd5b5051925034841015612c3457612c3433853403613118565b505096509650969350505050565b60608142811015612c88576040805162461bcd60e51b815260206004820152601760248201526000805160206145fa833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cbf57fe5b905060200201356001600160a01b03166001600160a01b031614612d18576040805162461bcd60e51b815260206004820152601c60248201526000805160206145b6833981519152604482015290519081900360640190fd5b612d767f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138af92505050565b91503482600081518110612d8657fe5b60200260200101511115612dcb5760405162461bcd60e51b815260040180806020018281038252602681526020018061461a6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3a57600080fd5b505af1158015612e4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612eb37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612ec057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f1757600080fd5b505af1158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051612f4957fe5b612f8882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613669915050565b81600081518110612f9557fe5b6020026020010151341115611e6a57611e6a3383600081518110612fb557fe5b60200260200101513403613118565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130415780518252601f199092019160209182019101613022565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b50915091508180156130d65750805115806130d657508080602001905160208110156130d357600080fd5b50515b6131115760405162461bcd60e51b815260040180806020018281038252602d815260200180614640602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131645780518252601f199092019160209182019101613145565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131c6576040519150601f19603f3d011682016040523d82523d6000602084013e6131cb565b606091505b505090508061320b5760405162461bcd60e51b81526004018080602001828103825260348152602001806145126034913960400191505060405180910390fd5b505050565b60008084116132505760405162461bcd60e51b815260040180806020018281038252602a8152602001806144e8602a913960400191505060405180910390fd5b6000831180156132605750600082115b61329b5760405162461bcd60e51b81526004018080602001828103825260278152602001806144656027913960400191505060405180910390fd5b60006132af856103e663ffffffff61422216565b905060006132c3828563ffffffff61422216565b905060006132e9836132dd886103e863ffffffff61422216565b9063ffffffff61427b16565b90508082816132f457fe5b04979650505050505050565b6060600282511015613359576040805162461bcd60e51b815260206004820152601d60248201527f536f756c537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561337157600080fd5b5060405190808252806020026020018201604052801561339b578160200160208202803683370190505b50905082816000815181106133ac57fe5b60200260200101818152505060005b6001835103811015613444576000806133fe878685815181106133da57fe5b60200260200101518786600101815181106133f157fe5b60200260200101516142d5565b9150915061342084848151811061341157fe5b60200260200101518383613210565b84846001018151811061342f57fe5b602090810291909101015250506001016133bb565b509392505050565b600080600061345b8585613ed0565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527ff3dcc3c6c6e34d3981dd429ac942301b9ebdd05de1be17f646b55476c44dc951609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135915780518252601f199092019160209182019101613572565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146135f3576040519150601f19603f3d011682016040523d82523d6000602084013e6135f8565b606091505b5091509150818015613626575080511580613626575080806020019051602081101561362357600080fd5b50515b6136615760405162461bcd60e51b81526004018080602001828103825260318152602001806144b76031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138a95760008084838151811061368757fe5b602002602001015185846001018151811061369e57fe5b60200260200101519150915060006136b68383613ed0565b50905060008785600101815181106136ca57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136f8578260006136fc565b6000835b91509150600060028a510388106137135788613754565b6137547f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061374757fe5b602002602001015161344c565b90506137817f0000000000000000000000000000000000000000000000000000000000000000888861344c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137be576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561382f578181015183820152602001613817565b50505050905090810190601f16801561385c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506001909901985061366c975050505050505050565b50505050565b6060600282511015613908576040805162461bcd60e51b815260206004820152601d60248201527f536f756c537761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561392057600080fd5b5060405190808252806020026020018201604052801561394a578160200160208202803683370190505b509050828160018351038151811061395e57fe5b60209081029190910101528151600019015b8015613444576000806139a08786600186038151811061398c57fe5b60200260200101518786815181106133f157fe5b915091506139c28484815181106139b357fe5b60200260200101518383613d34565b8460018503815181106139d157fe5b6020908102919091010152505060001901613970565b60005b600183510381101561320b57600080848381518110613a0557fe5b6020026020010151858460010181518110613a1c57fe5b6020026020010151915091506000613a348383613ed0565b5090506000613a647f0000000000000000000000000000000000000000000000000000000000000000858561344c565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613aa557600080fd5b505afa158015613ab9573d6000803e3d6000fd5b505050506040513d6060811015613acf57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b05578284613b08565b83835b91509150613b66828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613b73868383613210565b945050505050600080856001600160a01b0316886001600160a01b031614613b9d57826000613ba1565b6000835b91509150600060028c51038a10613bb8578a613bec565b613bec7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061374757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c76578181015183820152602001613c5e565b50505050905090810190601f168015613ca35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cc557600080fd5b505af1158015613cd9573d6000803e3d6000fd5b50506001909b019a506139ea9950505050505050505050565b600061112083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506143a8565b6000808411613d745760405162461bcd60e51b815260040180806020018281038252602b81526020018061448c602b913960400191505060405180910390fd5b600083118015613d845750600082115b613dbf5760405162461bcd60e51b81526004018080602001828103825260278152602001806144656027913960400191505060405180910390fd5b6000613de36103e8613dd7868863ffffffff61422216565b9063ffffffff61422216565b90506000613dfd6103e6613dd7868963ffffffff613cf216565b9050613e1a6001828481613e0d57fe5b049063ffffffff61427b16565b9695505050505050565b6000808411613e645760405162461bcd60e51b815260040180806020018281038252602481526020018061466d6024913960400191505060405180910390fd5b600083118015613e745750600082115b613eaf5760405162461bcd60e51b81526004018080602001828103825260278152602001806144656027913960400191505060405180910390fd5b82613ec0858463ffffffff61422216565b81613ec757fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f245760405162461bcd60e51b81526004018080602001828103825260248152602001806145d66024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f44578284613f47565b83835b90925090506001600160a01b038216613fa7576040805162461bcd60e51b815260206004820152601d60248201527f536f756c537761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561402857600080fd5b505afa15801561403c573d6000803e3d6000fd5b505050506040513d602081101561405257600080fd5b50516001600160a01b0316141561410557604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156140d857600080fd5b505af11580156140ec573d6000803e3d6000fd5b505050506040513d602081101561410257600080fd5b50505b6000806141337f00000000000000000000000000000000000000000000000000000000000000008b8b6142d5565b91509150816000148015614145575080155b1561415557879350869250614215565b6000614162898484613e24565b90508781116141b557858110156141aa5760405162461bcd60e51b81526004018080602001828103825260258152602001806144406025913960400191505060405180910390fd5b889450925082614213565b60006141c2898486613e24565b9050898111156141ce57fe5b8781101561420d5760405162461bcd60e51b81526004018080602001828103825260258152602001806145916025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008261423157506000611123565b8282028284828161423e57fe5b04146111205760405162461bcd60e51b81526004018080602001828103825260218152602001806145466021913960400191505060405180910390fd5b600082820183811015611120576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006142e48585613ed0565b5090506142f286868661344c565b5060008061430188888861344c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561433957600080fd5b505afa15801561434d573d6000803e3d6000fd5b505050506040513d606081101561436357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614396578082614399565b81815b90999098509650505050505050565b600081848411156144375760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143fc5781810151838201526020016143e4565b50505050905090810190601f1680156144295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe536f756c53776170526f757465723a20494e53554646494349454e545f425f414d4f554e54536f756c537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459536f756c537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c6564536f756c537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536f756c53776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54536f756c53776170526f757465723a20494e53554646494349454e545f415f414d4f554e54536f756c53776170526f757465723a20494e56414c49445f5041544800000000536f756c537761704c6962726172793a204944454e544943414c5f414444524553534553536f756c53776170526f757465723a2045585049524544000000000000000000536f756c53776170526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564536f756c537761704c6962726172793a20494e53554646494349454e545f414d4f554e54a2646970667358221220c2ec86b51a8a1668f4332af7ff95a46dcf44ef72895d7a6f6f4487d79382ce5e64736f6c634300060600330000000000000000000000001120e150da9def6fe930f4feded18ef57c0ca7ef00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

0000000000000000000000001120e150da9def6fe930f4feded18ef57c0ca7ef00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x1120e150da9def6fe930f4feded18ef57c0ca7ef
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001120e150da9def6fe930f4feded18ef57c0ca7ef
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

22355:20764:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22838:10;-1:-1:-1;;;;;22852:4:0;22838:18;;22831:26;;;;22355:20764;;12:1:-1;9;2:12;27587:691:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27587:691:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27587:691:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42144:257;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42144:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42144:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35939:899;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35939:899:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35939:899:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35939:899:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35939:899:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35939:899:0;;-1:-1:-1;35939:899:0;-1:-1:-1;;;;;;35939:899:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35939:899:0;;;;;;;;;;;;;;;;;42899:217;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42899:217:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;42899:217:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42899:217:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42899:217:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42899:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42899:217:0;;-1:-1:-1;42899:217:0;;-1:-1:-1;;;;;42899:217:0:i;28286:930::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28286:930:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28286:930:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33000:690::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33000:690:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33000:690:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33000:690:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33000:690:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33000:690:0;;-1:-1:-1;33000:690:0;-1:-1:-1;;;;;;33000:690:0;;;;;;;;:::i;35054:877::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35054:877:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35054:877:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35054:877:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35054:877:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35054:877:0;;-1:-1:-1;35054:877:0;-1:-1:-1;;;;;;35054:877:0;;;;;;;;:::i;30994:931::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30994:931:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;30994:931:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39425:763::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39425:763:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;39425:763:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39425:763:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39425:763:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39425:763:0;;-1:-1:-1;39425:763:0;-1:-1:-1;;;;;;39425:763:0;;;;;;;;:::i;41009:850::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41009:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;41009:850:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;41009:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41009:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41009:850:0;;-1:-1:-1;41009:850:0;-1:-1:-1;;;;;;41009:850:0;;;;;;;;:::i;34360:686::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34360:686:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34360:686:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34360:686:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34360:686:0;;-1:-1:-1;34360:686:0;-1:-1:-1;;;;;;34360:686:0;;;;;;;;:::i;42409:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42409:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42409:256:0;;;;;;;;;;;;:::i;33698:654::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33698:654:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33698:654:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33698:654:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33698:654:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33698:654:0;;-1:-1:-1;33698:654:0;-1:-1:-1;;;;;;33698:654:0;;;;;;;;:::i;22490:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22490:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;22490:38:0;;;;;;;;;;;;;;41903:233;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41903:233:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41903:233:0;;;;;;;;;;;;:::i;30221:765::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30221:765:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;30221:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40196:805::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;40196:805:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;40196:805:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40196:805:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40196:805:0;;-1:-1:-1;40196:805:0;-1:-1:-1;;;;;;40196:805:0;;;;;;;;:::i;26669:910::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26669:910:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26669:910:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22442:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22442:41:0;;;:::i;42673:218::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42673:218:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;42673:218:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42673:218:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42673:218:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42673:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42673:218:0;;-1:-1:-1;42673:218:0;;-1:-1:-1;;;;;42673:218:0:i;29224:918::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29224:918:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;29224:918:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24554:949::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24554:949:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24554:949:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25511:1115;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;25511:1115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36846:812::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36846:812:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36846:812:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36846:812:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36846:812:0;;-1:-1:-1;36846:812:0;-1:-1:-1;;;;;;36846:812:0;;;;;;;;:::i;27587:691::-;27836:19;27857:17;27817:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;27914:196:::1;27944:5;27964:4;27983:9;28007:14;28036:12;28071:4;28091:8;27914:15;:196::i;:::-;27887:223:::0;;-1:-1:-1;27887:223:0;-1:-1:-1;28121:51:0::1;28149:5:::0;28156:2;27887:223;28121:27:::1;:51::i;:::-;28189:4;-1:-1:-1::0;;;;;28183:20:0::1;;28204:9;28183:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28183:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28183:31:0;;;;28225:45;28256:2;28260:9;28225:30;:45::i;:::-;27587:691:::0;;;;;;;;;;:::o;42144:257::-;42295:17;42332:61;42361:8;42371:9;42382:10;42332:28;:61::i;:::-;42325:68;42144:257;-1:-1:-1;;;;42144:257:0:o;35939:899::-;36169:24;36150:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36239:4:0::1;36214:29;:4:::0;;-1:-1:-1;;36219:15:0;;36214:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36214:21:0::1;-1:-1:-1::0;;;;;36214:29:0::1;;36206:70;;;::::0;;-1:-1:-1;;;36206:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36206:70:0;;;;;;;;;;;;;::::1;;36297:54;36327:7;36336:8;36346:4;;36297:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36297:29:0::1;::::0;-1:-1:-1;;;36297:54:0:i:1;:::-;36287:64;;36401:12;36370:7;36395:1;36378:7;:14;:18;36370:27;;;;;;;;;;;;;;:43;;36362:98;;;;-1:-1:-1::0;;;36362:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36471:179;36517:4;;36522:1;36517:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36517:7:0::1;36539:10;36564:50;36588:7;36597:4;;36602:1;36597:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36597:7:0::1;36606:4;;36611:1;36606:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36606:7:0::1;36564:23;:50::i;:::-;36629:7;36637:1;36629:10;;;;;;;;;;;;;;36471:31;:179::i;:::-;36661:35;36667:7;36676:4;;36661:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36690:4:0::1;::::0;-1:-1:-1;36661:5:0::1;::::0;-1:-1:-1;;36661:35:0:i:1;:::-;36713:4;-1:-1:-1::0;;;;;36707:20:0::1;;36728:7;36753:1;36736:7;:14;:18;36728:27;;;;;;;;;;;;;;36707:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36707:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36707:49:0;;;;36767:63;36798:2;36802:7;36827:1;36810:7;:14;:18;36802:27;;;;;;;;;;;;;;36767:30;:63::i;:::-;35939:899:::0;;;;;;;;;:::o;42899:217::-;43010:24;43054:54;43083:7;43092:9;43103:4;43054:28;:54::i;:::-;43047:61;;42899:217;;;;;:::o;28286:930::-;28631:15;28648;28676:12;28691:48;28715:7;28724:6;28732;28691:23;:48::i;:::-;28676:63;;28750:13;28766:10;:36;;28793:9;28766:36;;;-1:-1:-1;;28766:36:0;28813:181;;;-1:-1:-1;;;28813:181:0;;28854:10;28813:181;;;;28887:4;28813:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28750:52;;-1:-1:-1;;;;;;28813:26:0;;;;;:181;;;;;-1:-1:-1;;28813:181:0;;;;;;;;-1:-1:-1;28813:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;28813:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28813:181:0;;;;29026:182;29056:6;29077;29098:9;29122:10;29147;29172:2;29189:8;29026:15;:182::i;:::-;29005:203;;;;;;;;28286:930;;;;;;;;;;;;;;;;:::o;33000:690::-;33233:24;33214:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;33280:54:::1;33310:7;33319:8;33329:4;;33280:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33280:29:0::1;::::0;-1:-1:-1;;;33280:54:0:i:1;:::-;33270:64;;33385:12;33354:7;33379:1;33362:7;:14;:18;33354:27;;;;;;;;;;;;;;:43;;33345:112;;;;-1:-1:-1::0;;;33345:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33468:179;33514:4;;33519:1;33514:7;;;;;;33468:179;33658:24;33664:7;33673:4;;33658:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33679:2:0;;-1:-1:-1;33658:5:0::1;::::0;-1:-1:-1;;33658:24:0:i:1;35054:877::-:0;35284:24;35265:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35354:4:0::1;35329:29;:4:::0;;-1:-1:-1;;35334:15:0;;35329:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35329:21:0::1;-1:-1:-1::0;;;;;35329:29:0::1;;35321:70;;;::::0;;-1:-1:-1;;;35321:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35321:70:0;;;;;;;;;;;;;::::1;;35412:54;35441:7;35450:9;35461:4;;35412:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35412:28:0::1;::::0;-1:-1:-1;;;35412:54:0:i:1;:::-;35402:64;;35499:11;35485:7;35493:1;35485:10;;;;;;;;;;;;;;:25;;35477:76;;;;-1:-1:-1::0;;;35477:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30994:931:::0;31351:17;31381:12;31396:45;31420:7;31429:5;31436:4;31396:23;:45::i;:::-;31381:60;;31452:13;31468:10;:36;;31495:9;31468:36;;;-1:-1:-1;;31468:36:0;31515:181;;;-1:-1:-1;;;31515:181:0;;31556:10;31515:181;;;;31589:4;31515:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31452:52;;-1:-1:-1;;;;;;31515:26:0;;;;;:181;;;;;-1:-1:-1;;31515:181:0;;;;;;;;-1:-1:-1;31515:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;31515:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31515:181:0;;;;31719:198;31781:5;31801:9;31825:14;31854:12;31881:2;31898:8;31719:47;:198::i;:::-;31707:210;30994:931;-1:-1:-1;;;;;;;;;;;;;30994:931:0:o;39425:763::-;39668:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;39689:177:::1;39735:4;;39740:1;39735:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;39735:7:0::1;39757:10;39782:50;39806:7;39815:4;;39820:1;39815:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;39815:7:0::1;39824:4;;39829:1;39824:7;;;;;;39782:50;39847:8;39689:31;:177::i;:::-;39877:21;39908:4:::0;;-1:-1:-1;;39913:15:0;;39908:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;39908:21:0::1;-1:-1:-1::0;;;;;39901:39:0::1;;39941:2;39901:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;39901:43:0::1;-1:-1:-1::0;;;;;39901:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39901:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39901:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;39901:43:0;39955:44:::1;::::0;;39901:43:::1;39955:44:::0;;::::1;::::0;;;;;;;;;;;39901:43;;-1:-1:-1;39955:44:0::1;::::0;;;39990:4;;;;;;39955:44;::::1;::::0;39990:4;;39955:44;39990:4;39955:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39996:2:0;;-1:-1:-1;39955:34:0::1;::::0;-1:-1:-1;;39955:44:0:i:1;:::-;40098:12:::0;40032:62:::1;40080:13:::0;40039:4;;-1:-1:-1;;40044:15:0;;40039:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40039:21:0::1;-1:-1:-1::0;;;;;40032:39:0::1;;40072:2;40032:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40032:43:0::1;-1:-1:-1::0;;;;;40032:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40032:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40032:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40032:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;40010:170;;;;-1:-1:-1::0;;;40010:170:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22656:1;39425:763:::0;;;;;;;:::o;41009:850::-;41249:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41303:4:0::1;41278:29;:4:::0;;-1:-1:-1;;41283:15:0;;41278:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41278:21:0::1;-1:-1:-1::0;;;;;41278:29:0::1;;41270:70;;;::::0;;-1:-1:-1;;;41270:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41270:70:0;;;;;;;;;;;;;::::1;;41351:177;41397:4;;41402:1;41397:7;;;;;;41351:177;41539:55;41574:4;;41539:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41588:4:0::1;::::0;-1:-1:-1;41539:34:0::1;::::0;-1:-1:-1;;41539:55:0:i:1;:::-;41625:37;::::0;;-1:-1:-1;;;41625:37:0;;41656:4:::1;41625:37;::::0;::::1;::::0;;;41605:17:::1;::::0;-1:-1:-1;;;;;41632:4:0::1;41625:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;41625:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41625:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41625:37:0;;-1:-1:-1;41681:25:0;;::::1;;41673:80;;;;-1:-1:-1::0;;;41673:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41770:4;-1:-1:-1::0;;;;;41764:20:0::1;;41785:9;41764:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41764:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41764:31:0;;;;41806:45;41837:2;41841:9;41806:30;:45::i;34360:686::-:0;34571:24;34552:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;34627:4:::1;-1:-1:-1::0;;;;;34616:15:0::1;:4;;34621:1;34616:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34616:7:0::1;-1:-1:-1::0;;;;;34616:15:0::1;;34608:56;;;::::0;;-1:-1:-1;;;34608:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34608:56:0;;;;;;;;;;;;;::::1;;34685:55;34715:7;34724:9;34735:4;;34685:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34685:29:0::1;::::0;-1:-1:-1;;;34685:55:0:i:1;:::-;34675:65;;34790:12;34759:7;34784:1;34767:7;:14;:18;34759:27;;;;;;;;;;;;;;:43;;34751:98;;;;-1:-1:-1::0;;;34751:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34866:4;-1:-1:-1::0;;;;;34860:19:0::1;;34887:7;34895:1;34887:10;;;;;;;;;;;;;;34860:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34860:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34860:40:0;;;;;34924:4;-1:-1:-1::0;;;;;34918:20:0::1;;34939:50;34963:7;34972:4;;34977:1;34972:7;;;;;;34939:50;34991:7;34999:1;34991:10;;;;;;;;;;;;;;34918:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;34918:84:0::1;-1:-1:-1::0;;;;;34918:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34918:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34918:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34918:84:0;34911:92:::1;;;;35014:24;35020:7;35029:4;;35014:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35035:2:0;;-1:-1:-1;35014:5:0::1;::::0;-1:-1:-1;;35014:24:0:i:1;:::-;34360:686:::0;;;;;;;;:::o;42409:256::-;42560:16;42596:61;42624:9;42635;42646:10;42596:27;:61::i;33698:654::-;33931:24;33912:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;33978:54:::1;34007:7;34016:9;34027:4;;33978:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33978:28:0::1;::::0;-1:-1:-1;;;33978:54:0:i:1;:::-;33968:64;;34065:11;34051:7;34059:1;34051:10;;;;;;;;;;;;;;:25;;34043:76;;;;-1:-1:-1::0;;;34043:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22490:38:::0;;;:::o;41903:233::-;42043:15;42078:50;42100:7;42109:8;42119;42078:21;:50::i;30221:765::-;30499:17;30480:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;30545:196:::1;30575:5;30595:4;30614:9;30638:14;30667:12;30702:4;30722:8;30545:15;:196::i;:::-;30831:38;::::0;;-1:-1:-1;;;30831:38:0;;30863:4:::1;30831:38;::::0;::::1;::::0;;;30529:212;;-1:-1:-1;30752:128:0::1;::::0;-1:-1:-1;30794:5:0;;30814:2;;-1:-1:-1;;;;;30831:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;30831:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30831:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30831:38:0;30752:27:::1;:128::i;:::-;30897:4;-1:-1:-1::0;;;;;30891:20:0::1;;30912:9;30891:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30891:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30891:31:0;;;;30933:45;30964:2;30968:9;30933:30;:45::i;40196:805::-:0;40417:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;40457:4:::1;-1:-1:-1::0;;;;;40446:15:0::1;:4;;40451:1;40446:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;40446:7:0::1;-1:-1:-1::0;;;;;40446:15:0::1;;40438:56;;;::::0;;-1:-1:-1;;;40438:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;40438:56:0;;;;;;;;;;;;;::::1;;40505:16;40524:9;40505:28;;40550:4;-1:-1:-1::0;;;;;40544:19:0::1;;40571:8;40544:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40544:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40544:38:0;;;;;40616:4;-1:-1:-1::0;;;;;40610:20:0::1;;40631:50;40655:7;40664:4;;40669:1;40664:7;;;;;;40631:50;40683:8;40610:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;40610:82:0::1;-1:-1:-1::0;;;;;40610:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40610:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40610:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40610:82:0;40603:90:::1;;;;40704:21;40735:4:::0;;-1:-1:-1;;40740:15:0;;40735:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40735:21:0::1;-1:-1:-1::0;;;;;40728:39:0::1;;40768:2;40728:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40728:43:0::1;-1:-1:-1::0;;;;;40728:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40728:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40728:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;40728:43:0;40782:44:::1;::::0;;40728:43:::1;40782:44:::0;;::::1;::::0;;;;;;;;;;;40728:43;;-1:-1:-1;40782:44:0::1;::::0;;;40817:4;;;;;;40782:44;::::1;::::0;40817:4;;40782:44;40817:4;40782:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;40823:2:0;;-1:-1:-1;40782:34:0::1;::::0;-1:-1:-1;;40782:44:0:i:1;:::-;40921:12:::0;40855:62:::1;40903:13:::0;40862:4;;-1:-1:-1;;40867:15:0;;40862:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40862:21:0::1;-1:-1:-1::0;;;;;40855:39:0::1;;40895:2;40855:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40855:43:0::1;-1:-1:-1::0;;;;;40855:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;26669:910:0::0;26935:15;26952;26916:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;26980:12:::1;26995:48;27019:7;27028:6;27036;26995:23;:48::i;:::-;27054:61;::::0;;-1:-1:-1;;;27054:61:0;;27087:10:::1;27054:61;::::0;::::1;::::0;-1:-1:-1;;;;;27054:32:0;::::1;:61:::0;;;;;;;;;;;;;;26980:63;;-1:-1:-1;27054:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;27054:32:0;:61;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;27054:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27054:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;27189:28:0::1;::::0;;-1:-1:-1;;;27189:28:0;;-1:-1:-1;;;;;27189:28:0;;::::1;;::::0;::::1;::::0;;;27153:15:::1;::::0;;;27189:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;27153:15;27189:24;:28;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;27189:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27189:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27189:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;27189:28:0;-1:-1:-1;27229:14:0::1;27249:42;27276:6:::0;27284;27249:26:::1;:42::i;:::-;27228:63;;;27333:6;-1:-1:-1::0;;;;;27323:16:0::1;:6;-1:-1:-1::0;;;;;27323:16:0::1;;:84;;27390:7;27399;27323:84;;;27356:7;27365;27323:84;27302:105:::0;;-1:-1:-1;27302:105:0;-1:-1:-1;27426:21:0;;::::1;;27418:71;;;;-1:-1:-1::0;;;27418:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27519:10;27508:7;:21;;27500:71;;;;-1:-1:-1::0;;;27500:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22656:1;;;;26669:910:::0;;;;;;;;;;;:::o;22442:41::-;;;:::o;42673:218::-;42785:24;42829:54;42859:7;42868:8;42878:4;42829:29;:54::i;29224:918::-;29561:19;29582:17;29612:12;29627:45;29651:7;29660:5;29667:4;29627:23;:45::i;:::-;29612:60;;29683:13;29699:10;:36;;29726:9;29699:36;;;-1:-1:-1;;29699:36:0;29746:181;;;-1:-1:-1;;;29746:181:0;;29787:10;29746:181;;;;29820:4;29746:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29683:52;;-1:-1:-1;;;;;;29746:26:0;;;;;:181;;;;;-1:-1:-1;;29746:181:0;;;;;;;;-1:-1:-1;29746:26:0;:181;;;2:2:-1;;;;27:1;24;17:12;2:2;29746:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29746:181:0;;;;29965:169;29998:5;30018:9;30042:14;30071:12;30098:2;30115:8;29965:18;:169::i;:::-;29938:196;;;;-1:-1:-1;29224:918:0;-1:-1:-1;;;;;;;;;;;;;29224:918:0:o;24554:949::-;24916:15;24946;24976:17;24874:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;25042:174:::1;25070:6;25091;25112:14;25141;25170:10;25195;25042:13;:174::i;:::-;25021:195:::0;;-1:-1:-1;25021:195:0;-1:-1:-1;25227:12:0::1;25242:48;25266:7;25275:6:::0;25283;25242:23:::1;:48::i;:::-;25227:63;;25301:66;25333:6;25341:10;25353:4;25359:7;25301:31;:66::i;:::-;25378;25410:6;25418:10;25430:4;25436:7;25378:31;:66::i;:::-;25481:4;-1:-1:-1::0;;;;;25467:24:0::1;;25492:2;25467:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;25467:28:0::1;-1:-1:-1::0;;;;;25467:28:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;25467:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25467:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25467:28:0;24554:949;;;;-1:-1:-1;25467:28:0;;-1:-1:-1;24554:949:0;;-1:-1:-1;;;;;;;;;24554:949:0:o;25511:1115::-;25844:19;25878:17;25910;25802:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;25982:176:::1;26010:5;26030:4;26049:18;26082:9;26106:14;26135:12;25982:13;:176::i;:::-;25955:203:::0;;-1:-1:-1;25955:203:0;-1:-1:-1;26169:12:0::1;26184:45;26208:7;26217:5:::0;26224:4:::1;26184:23;:45::i;:::-;26169:60;;26240:69;26272:5;26279:10;26291:4;26297:11;26240:31;:69::i;:::-;26326:4;-1:-1:-1::0;;;;;26320:19:0::1;;26347:9;26320:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26320:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26320:39:0;;;;;26383:4;-1:-1:-1::0;;;;;26377:20:0::1;;26398:4;26404:9;26377:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;26377:37:0::1;-1:-1:-1::0;;;;;26377:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26377:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26377:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26377:37:0;26370:45:::1;;;;26452:4;-1:-1:-1::0;;;;;26438:24:0::1;;26463:2;26438:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;26438:28:0::1;-1:-1:-1::0;;;;;26438:28:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26438:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26438:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26438:28:0;;-1:-1:-1;26517:9:0::1;:21:::0;-1:-1:-1;26513:105:0::1;;;26553:65;26584:10;26608:9;26596;:21;26553:30;:65::i;:::-;22656:1;25511:1115:::0;;;;;;;;;;;:::o;36846:812::-;37054:24;37035:8;22602:15;22590:8;:27;;22582:63;;;;;-1:-1:-1;;;22582:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22582:63:0;;;;;;;;;;;;;;;37110:4:::1;-1:-1:-1::0;;;;;37099:15:0::1;:4;;37104:1;37099:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37099:7:0::1;-1:-1:-1::0;;;;;37099:15:0::1;;37091:56;;;::::0;;-1:-1:-1;;;37091:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37091:56:0;;;;;;;;;;;;;::::1;;37168:54;37197:7;37206:9;37217:4;;37168:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37168:28:0::1;::::0;-1:-1:-1;;;37168:54:0:i:1;:::-;37158:64;;37255:9;37241:7;37249:1;37241:10;;;;;;;;;;;;;;:23;;37233:74;;;;-1:-1:-1::0;;;37233:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37324:4;-1:-1:-1::0;;;;;37318:19:0::1;;37345:7;37353:1;37345:10;;;;;;;;;;;;;;37318:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37318:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37318:40:0;;;;;37382:4;-1:-1:-1::0;;;;;37376:20:0::1;;37397:50;37421:7;37430:4;;37435:1;37430:7;;;;;;37397:50;37449:7;37457:1;37449:10;;;;;;;;;;;;;;37376:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;37376:84:0::1;-1:-1:-1::0;;;;;37376:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37376:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37376:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37376:84:0;37369:92:::1;;;;37472:24;37478:7;37487:4;;37472:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37493:2:0;;-1:-1:-1;37472:5:0::1;::::0;-1:-1:-1;;37472:24:0:i:1;:::-;37559:7;37567:1;37559:10;;;;;;;;;;;;;;37547:9;:22;37543:107;;;37584:66;37615:10;37639:7;37647:1;37639:10;;;;;;;;;;;;;;37627:9;:22;37584:30;:66::i;7981:449::-:0;8213:45;;;-1:-1:-1;;;;;8213:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8213:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8202:57:0;;;;8167:12;;8181:17;;8202:10;;;;8213:45;8202:57;;;25:18:-1;8202:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8202:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;8166:93:0;;;;8292:7;:57;;;;-1:-1:-1;8304:11:0;;:16;;:44;;;8335:4;8324:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8324:24:0;8304:44;8270:152;;;;-1:-1:-1;;;8270:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7981:449;;;;;:::o;8944:217::-;9057:12;;;9017;9057;;;;;;;;;-1:-1:-1;;;;;9035:7:0;;;9050:5;;9035:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9035:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;9016:54:0;;;9089:7;9081:72;;;;-1:-1:-1;;;9081:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8944:217;;;:::o;19955:515::-;20048:14;20094:1;20083:8;:12;20075:67;;;;-1:-1:-1;;;20075:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20173:1;20161:9;:13;:31;;;;;20191:1;20178:10;:14;20161:31;20153:83;;;;-1:-1:-1;;;20153:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20247:20;20270:17;:8;20283:3;20270:17;:12;:17;:::i;:::-;20247:40;-1:-1:-1;20298:14:0;20315:31;20247:40;20335:10;20315:31;:19;:31;:::i;:::-;20298:48;-1:-1:-1;20357:16:0;20376:40;20400:15;20376:19;:9;20390:4;20376:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;20357:59;;20451:11;20439:9;:23;;;;;;;19955:515;-1:-1:-1;;;;;;;19955:515:0:o;21143:510::-;21244:21;21301:1;21286:4;:11;:16;;21278:58;;;;;-1:-1:-1;;;21278:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21368:4;:11;21357:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21357:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;21357:23:0;;21347:33;;21404:8;21391:7;21399:1;21391:10;;;;;;;;;;;;;:21;;;;;21428:6;21423:223;21454:1;21440:4;:11;:15;21436:1;:19;21423:223;;;21478:14;21494:15;21513:42;21525:7;21534:4;21539:1;21534:7;;;;;;;;;;;;;;21543:4;21548:1;21552;21548:5;21543:11;;;;;;;;;;;;;;21513;:42::i;:::-;21477:78;;;;21587:47;21600:7;21608:1;21600:10;;;;;;;;;;;;;;21612:9;21623:10;21587:12;:47::i;:::-;21570:7;21578:1;21582;21578:5;21570:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;21457:3:0;;21423:223;;;;21143:510;;;;;:::o;18432:478::-;18521:12;18547:14;18563;18581:26;18592:6;18600;18581:10;:26::i;:::-;18745:32;;;-1:-1:-1;;18745:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;18745:32:0;;;;;18735:43;;;;;;-1:-1:-1;;;;;;18648:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18648:251:0;;;;;;;18638:262;;;;;;;;;18432:478;-1:-1:-1;;;;;18432:478:0:o;8438:498::-;8709:51;;;-1:-1:-1;;;;;8709:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8709:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8698:63:0;;;;8663:12;;8677:17;;8698:10;;;;8709:51;8698:63;;;25:18:-1;8698:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8698:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;8662:99:0;;;;8794:7;:57;;;;-1:-1:-1;8806:11:0;;:16;;:44;;;8837:4;8826:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8826:24:0;8806:44;8772:156;;;;-1:-1:-1;;;8772:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8438:498;;;;;;:::o;32036:956::-;32180:9;32175:810;32209:1;32195:4;:11;:15;32191:1;:19;32175:810;;;32233:13;32248:14;32267:4;32272:1;32267:7;;;;;;;;;;;;;;32276:4;32281:1;32285;32281:5;32276:11;;;;;;;;;;;;;;32232:56;;;;32304:14;32324:41;32351:5;32358:6;32324:26;:41::i;:::-;32303:62;;;32380:17;32400:7;32408:1;32412;32408:5;32400:14;;;;;;;;;;;;;;32380:34;;32430:18;32450;32498:6;-1:-1:-1;;;;;32489:15:0;:5;-1:-1:-1;;;;;32489:15:0;;:109;;32576:9;32595:1;32489:109;;;32537:1;32541:9;32489:109;32429:169;;;;32613:10;32661:1;32647:4;:11;:15;32643:1;:19;:123;;32763:3;32643:123;;;32686:53;32710:7;32719:6;32727:4;32732:1;32736;32732:5;32727:11;;;;;;;;;;;;;;32686:23;:53::i;:::-;32613:153;;32795:47;32819:7;32828:5;32835:6;32795:23;:47::i;:::-;-1:-1:-1;;;;;32781:67:0;;32867:10;32896;32925:2;32956:1;32946:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;32946:12:0;87:42:-1;143:17;;-1:-1;32946:12:0;;32781:192;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32781:192:0;-1:-1:-1;;;;;32781:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32781:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32781:192:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32212:3:0;;;;;-1:-1:-1;32175:810:0;;-1:-1:-1;;;;;;;;32175:810:0;;;32036:956;;;:::o;21734:545::-;21835:21;21906:1;21891:4;:11;:16;;21869:72;;;;;-1:-1:-1;;;21869:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21973:4;:11;21962:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21962:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;21962:23:0;;21952:33;;22026:9;21996:7;22021:1;22004:7;:14;:18;21996:27;;;;;;;;;;;;;;;;;:39;22060:11;;-1:-1:-1;;22060:15:0;22046:226;22077:5;;22046:226;;22105:14;22121:15;22140:42;22152:7;22161:4;22170:1;22166;:5;22161:11;;;;;;;;;;;;;;22174:4;22179:1;22174:7;;;;;;;22140:42;22104:78;;;;22214:46;22226:7;22234:1;22226:10;;;;;;;;;;;;;;22238:9;22249:10;22214:11;:46::i;:::-;22197:7;22209:1;22205;:5;22197:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;22084:3:0;22046:226;;37805:1612;37943:9;37938:1472;37972:1;37958:4;:11;:15;37954:1;:19;37938:1472;;;37996:13;38011:14;38030:4;38035:1;38030:7;;;;;;;;;;;;;;38039:4;38044:1;38048;38044:5;38039:11;;;;;;;;;;;;;;37995:56;;;;38067:14;38087:41;38114:5;38121:6;38087:26;:41::i;:::-;38066:62;;;38143:18;38178:47;38202:7;38211:5;38218:6;38178:23;:47::i;:::-;38143:83;;38241:19;38275:20;38387:16;38405;38427:4;-1:-1:-1;;;;;38427:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38427:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38427:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38427:18:0;;;;;;;-1:-1:-1;;;;;38386:59:0;;;;-1:-1:-1;38386:59:0;;-1:-1:-1;38465:20:0;;-1:-1:-1;;;;;38533:15:0;;;;;;;:111;;38625:8;38635;38533:111;;;38577:8;38587;38533:111;38464:180;;;;38677:96;38742:12;38684:5;-1:-1:-1;;;;;38677:23:0;;38709:4;38677:38;;;;;;;;;;;;;-1:-1:-1;;;;;38677:38:0;-1:-1:-1;;;;;38677:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;38677:96:0;38663:110;;38807:152;38858:11;38892:12;38927:13;38807:28;:152::i;:::-;38792:167;;37938:1472;;;;38990:18;39010;39058:6;-1:-1:-1;;;;;39049:15:0;:5;-1:-1:-1;;;;;39049:15:0;;:115;;39139:12;39161:1;39049:115;;;39097:1;39101:12;39049:115;38989:175;;;;39179:10;39227:1;39213:4;:11;:15;39209:1;:19;:123;;39329:3;39209:123;;;39252:53;39276:7;39285:6;39293:4;39298:1;39302;39298:5;39293:11;;;;;;;39252:53;39385:12;;;39395:1;39385:12;;;;;;;;;;-1:-1:-1;;;39347:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39347:51:0;;;;;;;;;;;;;;;;;;;;;;39179:153;;-1:-1:-1;39347:9:0;;;;;;39357:10;;39369;;39179:153;;39385:12;;39347:51;;;;;;;;39385:12;;39347:51;;;;39385:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39347:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39347:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37975:3:0;;;;;-1:-1:-1;37938:1472:0;;-1:-1:-1;;;;;;;;;;37938:1472:0;13108:136;13166:7;13193:43;13197:1;13200;13193:43;;;;;;;;;;;;;;;;;:3;:43::i;20591:470::-;20684:13;20730:1;20718:9;:13;20710:69;;;;-1:-1:-1;;;20710:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20810:1;20798:9;:13;:31;;;;;20828:1;20815:10;:14;20798:31;20790:83;;;;-1:-1:-1;;;20790:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20884:14;20901:34;20930:4;20901:24;:9;20915;20901:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;20884:51;-1:-1:-1;20946:16:0;20965:34;20995:3;20965:25;:10;20980:9;20965:25;:14;:25;:::i;:34::-;20946:53;;21021:32;21051:1;21034:11;21022:9;:23;;;;;;;21021:32;:29;:32;:::i;:::-;21010:43;20591:470;-1:-1:-1;;;;;;20591:470:0:o;19514:319::-;19596:12;19639:1;19629:7;:11;19621:60;;;;-1:-1:-1;;;19621:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19711:1;19700:8;:12;:28;;;;;19727:1;19716:8;:12;19700:28;19692:80;;;;-1:-1:-1;;;19692:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19817:8;19793:21;:7;19805:8;19793:21;:11;:21;:::i;:::-;:32;;;;;;;19514:319;-1:-1:-1;;;;19514:319:0:o;17993:347::-;18068:14;18084;18129:6;-1:-1:-1;;;;;18119:16:0;:6;-1:-1:-1;;;;;18119:16:0;;;18111:65;;;;-1:-1:-1;;;18111:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18215:6;-1:-1:-1;;;;;18206:15:0;:6;-1:-1:-1;;;;;18206:15:0;;:53;;18244:6;18252;18206:53;;;18225:6;18233;18206:53;18187:72;;-1:-1:-1;18187:72:0;-1:-1:-1;;;;;;18278:20:0;;18270:62;;;;;-1:-1:-1;;;18270:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17993:347;;;;;:::o;22960:1586::-;23291:49;;;-1:-1:-1;;;23291:49:0;;-1:-1:-1;;;;;23291:49:0;;;;;;;;;;;;;;;;23190:15;;;;;;23308:7;23291:33;;;;;;:49;;;;;;;;;;;;;;;:33;:49;;;2:2:-1;;;;27:1;24;17:12;2:2;23291:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23291:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23291:49:0;-1:-1:-1;;;;;23291:63:0;;23287:148;;;23371:52;;;-1:-1:-1;;;23371:52:0;;-1:-1:-1;;;;;23371:52:0;;;;;;;;;;;;;;;;23388:7;23371:36;;;;;;:52;;;;;;;;;;;;;;;-1:-1:-1;23371:36:0;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;23371:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23371:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;23287:148:0;23446:16;23464;23497:52;23525:7;23534:6;23542;23497:27;:52::i;:::-;23445:104;;;;23564:8;23576:1;23564:13;:30;;;;-1:-1:-1;23581:13:0;;23564:30;23560:979;;;23633:14;;-1:-1:-1;23649:14:0;;-1:-1:-1;23560:979:0;;;23697:22;23739:57;23761:14;23777:8;23787;23739:21;:57::i;:::-;23697:99;;23833:14;23815;:32;23811:717;;23916:10;23898:14;:28;;23868:139;;;;-1:-1:-1;;;23868:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24048:14;;-1:-1:-1;24064:14:0;-1:-1:-1;24064:14:0;23811:717;;;24120:22;24166:57;24188:14;24204:8;24214;24166:21;:57::i;:::-;24120:103;;24267:14;24249;:32;;24242:40;;;;24349:10;24331:14;:28;;24301:139;;;;-1:-1:-1;;;24301:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24481:14;-1:-1:-1;24497:14:0;;-1:-1:-1;23811:717:0;23560:979;;22960:1586;;;;;;;;;;;:::o;14032:471::-;14090:7;14335:6;14331:47;;-1:-1:-1;14365:1:0;14358:8;;14331:47;14402:5;;;14406:1;14402;:5;:1;14426:5;;;;;:10;14418:56;;;;-1:-1:-1;;;14418:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12644:181;12702:7;12734:5;;;12758:6;;;;12750:46;;;;;-1:-1:-1;;;12750:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18968:433;19061:13;19076;19103:14;19122:26;19133:6;19141;19122:10;:26::i;:::-;19102:46;;;19159:32;19167:7;19176:6;19184;19159:7;:32::i;:::-;;19203:13;19218;19250:32;19258:7;19267:6;19275;19250:7;:32::i;:::-;-1:-1:-1;;;;;19236:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19236:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19236:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19236:61:0;;;;;;;-1:-1:-1;;;;;19202:95:0;;;;-1:-1:-1;19202:95:0;;-1:-1:-1;;;;;;19331:16:0;;;;;;;:62;;19374:8;19384;19331:62;;;19351:8;19361;19331:62;19308:85;;;;-1:-1:-1;18968:433:0;-1:-1:-1;;;;;;;18968:433:0:o;13547:226::-;13667:7;13703:12;13695:6;;;;13687:29;;;;-1:-1:-1;;;13687:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13687:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13739:5:0;;;13547:226::o

Swarm Source

ipfs://c2ec86b51a8a1668f4332af7ff95a46dcf44ef72895d7a6f6f4487d79382ce5e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.