Contract 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xfbf497b249e37a4528009e6ec4371ecb52f07d4b0361200c211517befa029d13Swap Exact Token...451971972022-08-18 22:54:107 mins ago0x131fa908827d6a1b39dab478c612c45a0b776883 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000441981815
0x6f4549f1bd4446fd34c36975e9a1483a293ad4b658905f59a1b31bc8488e296bRemove Liquidity...451969122022-08-18 22:48:3512 mins ago0x131fa908827d6a1b39dab478c612c45a0b776883 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000534420753
0x0e4e4cd9bae8005eab5292d17af2ae4fc10f4dc455c23c02c10b35bdca4290baSwap Tokens For ...451940922022-08-18 21:50:331 hr 10 mins ago0x2a306cb85e9fe79f76430b5a5809bfdf63644824 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000505211472
0x1f0565f6ef20f091cb00182b68fd801ca95e58a808831280ce677b4bc009bfb3Remove Liquidity...451900232022-08-18 20:31:332 hrs 29 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000657358927
0x5fd58463d472a843d3b73137bd777c2f3c32802dc6bb6dacd17a1178ecf3d8efSwap Exact Token...451799542022-08-18 17:03:435 hrs 57 mins ago0x728b57b7e7afef7ab984f6ec04d995aafce55363 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000774302421
0xf56c0b9d000f35982ba23d121fd9393ee6f9a7788017dee17ddbc692d4608359Remove Liquidity...451798952022-08-18 17:02:395 hrs 58 mins ago0x728b57b7e7afef7ab984f6ec04d995aafce55363 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.001177637519
0x9085b4d41cd2e5ed510171e8e36f1546ce0051cb1a6893c66ce79d3510221f63Add Liquidity ET...451788582022-08-18 16:40:466 hrs 20 mins ago0xacd6b3d5da65092b9ed563f90655b997bd454366 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf10.435794113659874 FTM0.00119654239
0x6bfe3fdf98cc3fb4c39d8a0923e3b3a3e40de5394fa054f9ab2f6ed611e3f1f4Swap Exact ETH F...451787092022-08-18 16:36:466 hrs 24 mins ago0xe5c471abe9cb4a545a18a874e555c043e28796c4 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf5 FTM0.013766478782
0x7992f47219c5071d25059f724ffd24536d539260530cad0b6cc40a74bae08e38Swap Exact Token...451755852022-08-18 15:30:427 hrs 30 mins ago0x728b57b7e7afef7ab984f6ec04d995aafce55363 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000635665635
0x18d835182329ea8ac6f324495ce14fed1acede92ab2d5de3520b76107f0ccc2aSwap Exact Token...451737552022-08-18 14:51:238 hrs 10 mins ago0xfd1ab0f336224104e9a66b2e07866241a87c96fc IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.006531271
0x3c0f4891eeecf903ee735a191fb708e5d9adf6d7654eef5a0e25e163679d1565Add Liquidity451727722022-08-18 14:31:468 hrs 29 mins ago0xa8fff77c2667c5c2d7e9cf7ea7c9791f2f244c54 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000870495361
0x3813dfb29a413e0c2b7593c928fc35383a69ce4b907696c655125df457d4f2ccSwap Exact ETH F...451727002022-08-18 14:30:308 hrs 30 mins ago0xa8fff77c2667c5c2d7e9cf7ea7c9791f2f244c54 IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf98 FTM0.000706750358
0xabc91fc3b62de7a8009614237257375ff057cd623dc4ae401c07a6394b867adaSwap Exact Token...451695202022-08-18 13:25:399 hrs 35 mins ago0xd288a1843f231137ef4eb6d096915d688866fe7b IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.00065938879
0xe6273939c2a70da9a406bbd5c353b2fdf78f7dec288a7f5ff879e76fcba05e1eSwap Exact Token...451693982022-08-18 13:23:219 hrs 38 mins ago0xd288a1843f231137ef4eb6d096915d688866fe7b IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000576493409
0x9622d67daab1397586925b630a56c84c761478eb1eb81c245ab996357bc9e254Swap Exact Token...451524362022-08-18 7:25:2615 hrs 35 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000338465269
0xb54e85f95a5564b3db1991b0037029d655d586d31a857460d8312c359bb8dc82Swap Exact Token...451524252022-08-18 7:25:1215 hrs 36 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000306834266
0x93334398130bcbd89d27903ac6c4ce673b609fd5446a301584682aa015e91f3aSwap Exact Token...451523902022-08-18 7:24:3315 hrs 36 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000291955779
0xc0bdf90609e40e1607b451d08c75dc308e02b1821c1de1261d4147a1689ac5dcRemove Liquidity451523702022-08-18 7:24:1315 hrs 37 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000398463973
0xfdef203769db3d2d2c61eb3f252996d7948d414f7d8fba0c5f8f7fbbcd6d3118Add Liquidity451522882022-08-18 7:22:2815 hrs 38 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000506880051
0x4fee58c9dbca6336fcc9f9eafb19e248fccc530f7490bb984f97dfad703ea7a5Swap Exact Token...451522792022-08-18 7:22:1815 hrs 39 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000356289935
0x08ef3e7552c5d082a73b6e8dc8927205f6ae7765ae6b86a754896f66178641e3Swap Exact Token...451518212022-08-18 7:13:5615 hrs 47 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000294683903
0xce29cf833f9f7a7b74fa142cc08024d1aa8d19047c57cd69c8979235f2bcb358Swap Exact Token...451517132022-08-18 7:12:0215 hrs 49 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000282101106
0xcff9c98ca64c11ab314e09eb3951edc5b2a93596fb858cb1f80774ffe08223f5Swap Exact Token...451516692022-08-18 7:11:1315 hrs 50 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000308515396
0x4030fc5438ed60cebf1e5cd486b164331036d40e690d8fa82c8089f0cfb93bd3Swap Exact Token...451516392022-08-18 7:10:4215 hrs 50 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000355678293
0x6914aacb8e043e6c9de3f99a12c3eab4eba0065fb8a78149d31baed819fdf077Swap Exact Token...451515882022-08-18 7:09:3515 hrs 51 mins agoSoul: Deployer IN  0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0 FTM0.000334417881
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x6f4549f1bd4446fd34c36975e9a1483a293ad4b658905f59a1b31bc8488e296b451969122022-08-18 22:48:3512 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x131fa908827d6a1b39dab478c612c45a0b776883869.825456874474752777 FTM
0x6f4549f1bd4446fd34c36975e9a1483a293ad4b658905f59a1b31bc8488e296b451969122022-08-18 22:48:3512 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf869.825456874474752777 FTM
0x1f0565f6ef20f091cb00182b68fd801ca95e58a808831280ce677b4bc009bfb3451900232022-08-18 20:31:332 hrs 29 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbfSoul: Deployer1,056.523798123818786945 FTM
0x1f0565f6ef20f091cb00182b68fd801ca95e58a808831280ce677b4bc009bfb3451900232022-08-18 20:31:332 hrs 29 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf1,056.523798123818786945 FTM
0x5fd58463d472a843d3b73137bd777c2f3c32802dc6bb6dacd17a1178ecf3d8ef451799542022-08-18 17:03:435 hrs 57 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x728b57b7e7afef7ab984f6ec04d995aafce55363356.794294835493785612 FTM
0x5fd58463d472a843d3b73137bd777c2f3c32802dc6bb6dacd17a1178ecf3d8ef451799542022-08-18 17:03:435 hrs 57 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf356.794294835493785612 FTM
0xf56c0b9d000f35982ba23d121fd9393ee6f9a7788017dee17ddbc692d4608359451798952022-08-18 17:02:395 hrs 58 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x728b57b7e7afef7ab984f6ec04d995aafce55363357.913980001119881269 FTM
0xf56c0b9d000f35982ba23d121fd9393ee6f9a7788017dee17ddbc692d4608359451798952022-08-18 17:02:395 hrs 58 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf357.913980001119881269 FTM
0x9085b4d41cd2e5ed510171e8e36f1546ce0051cb1a6893c66ce79d3510221f63451788582022-08-18 16:40:466 hrs 20 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token10.435794113659874282 FTM
0x6bfe3fdf98cc3fb4c39d8a0923e3b3a3e40de5394fa054f9ab2f6ed611e3f1f4451787092022-08-18 16:36:466 hrs 24 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token5 FTM
0x7992f47219c5071d25059f724ffd24536d539260530cad0b6cc40a74bae08e38451755852022-08-18 15:30:427 hrs 30 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0x728b57b7e7afef7ab984f6ec04d995aafce5536323.078285248867613411 FTM
0x7992f47219c5071d25059f724ffd24536d539260530cad0b6cc40a74bae08e38451755852022-08-18 15:30:427 hrs 30 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf23.078285248867613411 FTM
0x18d835182329ea8ac6f324495ce14fed1acede92ab2d5de3520b76107f0ccc2a451737552022-08-18 14:51:238 hrs 10 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xfd1ab0f336224104e9a66b2e07866241a87c96fc2.836955433921351285 FTM
0x18d835182329ea8ac6f324495ce14fed1acede92ab2d5de3520b76107f0ccc2a451737552022-08-18 14:51:238 hrs 10 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf2.836955433921351285 FTM
0x3813dfb29a413e0c2b7593c928fc35383a69ce4b907696c655125df457d4f2cc451727002022-08-18 14:30:308 hrs 30 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token98 FTM
0xabc91fc3b62de7a8009614237257375ff057cd623dc4ae401c07a6394b867ada451695202022-08-18 13:25:399 hrs 35 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xd288a1843f231137ef4eb6d096915d688866fe7b131.721325855338998838 FTM
0xabc91fc3b62de7a8009614237257375ff057cd623dc4ae401c07a6394b867ada451695202022-08-18 13:25:399 hrs 35 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf131.721325855338998838 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token253.140636390345414275 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago 0x936bdb9218d7f6d7ef95fafe3f0ded0220229d74 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf253.140636390345414275 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf Fantom Finance: Wrapped Fantom Token253.140636390345414275 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago 0x936bdb9218d7f6d7ef95fafe3f0ded0220229d74 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf253.140636390345414275 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf 0x936bdb9218d7f6d7ef95fafe3f0ded0220229d74506.28127278069082855 FTM
0x893302a789b1d62ab2e89d81411534ece2dcf1492d8f9e730df9820ecff240b0451520532022-08-18 7:18:1415 hrs 43 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf506.28127278069082855 FTM
0xcb9da92913c518acf3864e9bae075de959ff52ee0b099bad7a99f10b4a457819451504472022-08-18 6:41:5416 hrs 19 mins ago 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf0xb8d86d6db117e21c27636034d3dd8859018daf9c187.220073948988570415 FTM
0xcb9da92913c518acf3864e9bae075de959ff52ee0b099bad7a99f10b4a457819451504472022-08-18 6:41:5416 hrs 19 mins ago Fantom Finance: Wrapped Fantom Token 0x6b3d631b87fe27af29efec61d2ab8ce4d621ccbf187.220073948988570415 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.