Contract 0x0fEAdcC3824E7F3c12f40E324a60c23cA51627fc 9

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd073596Trade With Learn...3190532021-09-08 10:33:27298 days 16 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.001135692785 ETH
0x420e67d9571e9330a88829b16c5473f0afe96a31d7d73b28ae1c717a60b2740eTrade With Learn...3190502021-09-08 10:33:27298 days 16 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.03 ETH0.001369395408 ETH
0x000986a032b53a684265a737b826389b29752a646b374c5c74a8b4ec6632e9deTrade With Learn...3190412021-09-08 10:31:30298 days 16 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.001073211268 ETH
0x5e1a7f2aa7a217daea6d137c148db0c2246a827ec03a48e2216f641701b888efTrade With Learn...3190052021-09-08 10:23:27298 days 16 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.001135692785 ETH
0x679d3f3260eba7527d354d4b43625a0adda275f6d94d1724a9af9d0d49f04a66Trade With Learn...3190012021-09-08 10:23:27298 days 16 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.03 ETH0.001365913278 ETH
0x8f1b17f61e6e2736bf6ee5d283964391697115d848bee8df05588d2f166072f4Trade Strategies3188852021-09-08 9:58:03298 days 17 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.004823239015 ETH
0x5cd1bcf9727e15eae0d0a686c6eba715da71a9f567b9bf936c10e31992036479Trade With Learn...3188642021-09-08 9:55:17298 days 17 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.06 ETH0.001348853367 ETH
0x298404cc46630f31f5f6f80574de2812e70a46f9c12f765f6b5b3677270a541cTrade With Learn...3188332021-09-08 9:49:23298 days 17 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.0021231175 ETH
0xbfebfba99b05e35c283205107037fef2f3fe7c49b7933f552f569a87ee8f5aaaTrade With Learn...3188282021-09-08 9:48:19298 days 17 hrs ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.06 ETH0.002613624658 ETH
0x2c575826e1c7636db69a9201307d827d4fb522016f14d92157adac8169bc4c97Trade Strategies3177672021-09-08 8:07:03298 days 19 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.01 ETH0.005448663971 ETH
0x8b5506a6ba2cf390277c17f2941799c2ad99aaab5e9fa47f8c434bf69b65b7dcTrade With Learn...3150592021-09-08 2:48:43299 days 32 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.002642050024 ETH
0x88322e0f64f48cfb99b09092b34935e1b0a9a66f7b86977977d5ab61d00144fcTrade With Learn...3150552021-09-08 2:48:43299 days 32 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.029 ETH0.001388898191 ETH
0xc90239df5d05eca40e179571853676ff07ef412fe7c44115bcefa5c1b61c02feTrade Weth To Et...3150482021-09-08 2:47:15299 days 34 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.000921680695 ETH
0xd5ce3231474c78a5b006b03e3aad7e1e8771d7f34e49c30743c99808a91f6679Trade With Learn...3150352021-09-08 2:46:24299 days 35 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.003158266767 ETH
0xd4f25d97a697524078ce54c0ccab3a31d98c3e4565f8ef86f421d68f95f86ec9Trade Strategies3150212021-09-08 2:44:06299 days 37 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.005399905995 ETH
0x8ec48fde9b2a3a813a36df5fca89e3f10bea7024f8ca818404f26dc83b2514f6Trade With Learn...3149982021-09-08 2:41:34299 days 40 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.002928545013 ETH
0xc378e44f88e971bafef64278bcf023ae798eaf535211a521907a96fa2320d70cTrade With Learn...3149452021-09-08 2:35:47299 days 45 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.0028995718 ETH
0x3eac771740d6cb9e13a17b37e7e74e1d94c8a40296aaa3ddfe392f85c126fe93Trade With Learn...3149282021-09-08 2:33:28299 days 48 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.002921045793 ETH
0x2d0aced32fca7f353e4985ba517384bc7064a85bf7af6397627fde828e6b1c4fTrade With Learn...3148762021-09-08 2:27:10299 days 54 mins ago0x6ef7aa629329a280c32aaa01c701828d8ec562e5 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.058 ETH0.001322505106 ETH
0xeb37d9c577620ec5d2d7c09d7a5afd1557585c6f49ab1d0d5ca9c1ff874de603Trade Eth To Wet...2932892021-09-06 7:23:45300 days 19 hrs ago0x3c4cb0ea1a2f0b3946517f79af84bfc8bd1b2ad1 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.01 ETH0.000996429913 ETH
0x153e26559eea4d0e5837cf5cc816e470756f881d5fb294fd1e659298d38b967aTrade Strategies2932272021-09-06 7:07:42300 days 20 hrs ago0x3c4cb0ea1a2f0b3946517f79af84bfc8bd1b2ad1 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.005661649122 ETH
0xfeb1e31c2e39c23f0bd21d40dddc52ff6cf63456d27931335b8484d45a243f2aTrade Strategies2660092021-09-03 14:17:36303 days 13 hrs ago0x3c4cb0ea1a2f0b3946517f79af84bfc8bd1b2ad1 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.01 ETH0.004897012281 ETH
0x8aa7c364e2a07b94da88804042b6ec92444e5ba9f4eb5454f35451e8254a3361Trade Strategies2659192021-09-03 13:55:17303 days 13 hrs ago0x3c4cb0ea1a2f0b3946517f79af84bfc8bd1b2ad1 IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.005 ETH0.006216393217 ETH
0xc30d7cb87fa3f5b376bc9a956b1f4f88e4c919b8635f77497b5890e79f36c62dTrade Strategies2625942021-09-03 5:19:52303 days 22 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.001172912321 ETH
0x3eceee133f2ca14052a4a4aeca3e3363ca024e3d50f5745585f60a74c75b9497Trade Strategies2625892021-09-03 5:19:52303 days 22 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0 ETH0.005152377775 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x82af49447d8a07e3bd95bd0d56f35241523fbab1 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0.02985869628161917 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x8b194beae1d3e0788a1a35173978001acdfba6680 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x8b194beae1d3e0788a1a35173978001acdfba6680 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1efb3f88bc88f03fd1804a5c53b7141bbef5ded80 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1efb3f88bc88f03fd1804a5c53b7141bbef5ded80 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x8b194beae1d3e0788a1a35173978001acdfba6680 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1efb3f88bc88f03fd1804a5c53b7141bbef5ded80 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x3657952d7ba5a0a4799809b5b6fdff9ec5b462930 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0x6ef7aa629329a280c32aaa01c701828d8ec562e50.029828837585337551 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc0xc146a672c85b408a9a7bc00f74ad567b7684134c0.000029858696281619 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x71ac17934b60a4610dc58b715b61e45dcbde40540 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x29790cfc03790dfdbf28b745cf8bf9c15ca1085e0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x29790cfc03790dfdbf28b745cf8bf9c15ca1085e0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x59d2e773950ae71bf1b18998456973abd46b82290 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x59d2e773950ae71bf1b18998456973abd46b82290 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x29790cfc03790dfdbf28b745cf8bf9c15ca1085e0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x1a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f0 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x995fc41ee6a65e5531ebdab23cf5efafdb50f0ec1d9bde7f63b3da37bd0735963190532021-09-08 10:33:27298 days 16 hrs ago 0x0feadcc3824e7f3c12f40e324a60c23ca51627fc 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WardenSwap1_5_Aegis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2021-09-02
*/

// SPDX-License-Identifier: MIT

// ((/*,                                                                    ,*((/,.
// &&@@&&%#/*.                                                        .*(#&&@@@@%. 
// &&@@@@@@@&%(.                                                    ,#%&@@@@@@@@%. 
// &&@@@@@@@@@&&(,                                                ,#&@@@@@@@@@@@%. 
// &&@@@@@@@@@@@&&/.                                            .(&&@@@@@@@@@@@@%. 
// %&@@@@@@@@@@@@@&(,                                          *#&@@@@@@@@@@@@@@%. 
// #&@@@@@@@@@@@@@@&#*                                       .*#@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@#.                                      ,%&@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@%(,                                    ,(&@@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@&&/                                   .(%&@@@@@@@@@@@@@@@@&#. 
// #%@@@@@@@@@@@@@@@@@@(.               ,(/,.              .#&@@@@@@@@@@@@@@@@@&#. 
// (%@@@@@@@@@@@@@@@@@@#*.            ./%&&&/.            .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#*.           *#&@@@@&%*.          .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.         ./#@@@@@@@@%(.         ./%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.        ./&@@@@@@@@@@&(*        ,/%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@%/.       ,#&@@@@@@@@@@@@&#,.      ,/%@@@@@@@@@@@@@@@@@@%(. 
// /%@@@@@@@@@@@@@@@@@@#/.      *(&@@@@@@@@@@@@@@&&*      ./%@@@@@@@@@@@@@@@@@&%(. 
// /%@@@@@@@@@@@@@@@@@@#/.     .(&@@@@@@@@@@@@@@@@@#*.    ,/%@@@@@@@@@@@@@@@@@&#/. 
// ,#@@@@@@@@@@@@@@@@@@#/.    ./%@@@@@@@@@@@@@@@@@@&#,    ,/%@@@@@@@@@@@@@@@@@&(,  
//  /%&@@@@@@@@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@&*    ,/%@@@@@@@@@@@@@@@@&%*   
//  .*#&@@@@@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/.   ,/%@@@@@@@@@@@@@@@@#*.   
//    ,(&@@@@@@@@@@@@@@#/.    /@@@@@@@@@@@@@@@@@@@@@&(,   ,/%@@@@@@@@@@@@@@%(,     
//     .*(&&@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/,   ,/%@@@@@@@@@@@&%/,       
//        ./%&@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@%*    ,/%@@@@@@@@@&%*          
//           ,/#%&&@@@@#/.     ,#&@@@@@@@@@@@@@@@@@#/.    ,/%@@@@&&%(/,            
//               ./#&@@%/.      ,/&@@@@@@@@@@@@@@%(,      ,/%@@%#*.                
//                   .,,,         ,/%&@@@@@@@@&%(*        .,,,.                    
//                                   ,/%&@@@%(*.                                   
//  .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**((/*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
//                                                                                                                                                                                                                                                                                                            
//                                                                                             

pragma solidity ^0.8.0;

// File: wx/interface/IWardenPostTrade.sol


interface IWardenPostTrade {
    function postTradeAndFee(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        address     _trader,
        address     _receiver,
        bool        _isSplit
    )
        external
        returns (
            uint256 _fee,
            address _collector
        );
}

// File: wx/libraries/IWETH.sol



pragma solidity ^0.8.0;


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

// File: wx/interface/IWardenCosmicBrain0_8.sol

pragma solidity ^0.8.0;


interface IWardenCosmicBrain {
    function train(
        uint256[]   calldata _subRoutes,
        IERC20[]    calldata _correspondentTokens
    )
        external
        returns (uint256 _learnedId);
    
    function trainTradingPair(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        uint256     _learnedId
    )
        external
        returns (bool _isAlreadyLearned);
    
    function learnedHashes(
        uint256 _index
    )
        external
        returns (bytes32);
    
    function learnedFetchAllRoutes(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256[] memory);
    
    function learnedFetchAllTokens(
        bytes32 _learnedHash
    )
        external
        view
        returns (IERC20[] memory);
    
    function hasLearned(
        bytes32 _learnedHash
    )
        external
        view
        returns (bool);

    function learnedIds(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256);

    function learnedRoutesLength(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256);
    
    function learnedRoutes(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256[] memory);
}

// File: wx/libraries/IWardenTradingRoute0_8.sol

pragma solidity ^0.8.0;


/**
 * @title Warden Trading Route
 * @dev The Warden trading route interface has an standard functions and event
 * for other smart contract to implement to join Warden Swap as Market Maker.
 */
interface IWardenTradingRoute {
    /**
    * @dev when new trade occure (and success), this event will be boardcast.
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest   Destination token
    * @param _destAmount: amount of actual destination tokens
    */
    event Trade(
        IERC20 indexed _src,
        uint256 _srcAmount,
        IERC20 indexed _dest,
        uint256 _destAmount
    );

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token
    * @param _src Source token
    * @param _dest   Destination token
    * @param _srcAmount amount of source tokens
    ** @return _destAmount: amount of actual destination tokens
    */
    function trade(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount,
        address receiver
    )
        external
        payable
        returns(uint256 _destAmount);

    /**
    * @dev provide destinationm token amount for given source amount
    * @param _src Source token
    * @param _dest Destination token
    * @param _srcAmount Amount of source tokens
    ** @return _destAmount: amount of expected destination tokens
    */
    function getDestinationReturnAmount(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount
    )
        external
        returns(uint256 _destAmount);

    function getDepositAddress(
        IERC20 _src,
        IERC20 _dest
    )
        external
        view
        returns(address _target);
}

// File: wx/interface/IWardenCosmoCore0_8.sol

pragma solidity ^0.8.0;


interface IWardenCosmoCore {
    /**
    * @dev Struct of trading route
    * @param name Name of trading route.
    * @param enable The flag of trading route to check is trading route enable.
    * @param route The address of trading route.
    */
    struct Route {
      string name;
      bool enable;
      IWardenTradingRoute route;
    }

    event AddedTradingRoute(
        address indexed addedBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );
    
    event UpdatedTradingRoute(
        address indexed updatedBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event EnabledTradingRoute(
        address indexed enabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event DisabledTradingRoute(
        address indexed disabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );
    
    function tradingRoutes(uint256 _index) external view returns (Route memory);
    function allRoutesLength() external view returns (uint256);
    function isTradingRouteEnabled(uint256 _index) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/utils/SafeERC20.sol



pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: wx/WardenSwap1_5.sol

pragma solidity ^0.8.0;








contract WardenSwap1_5_Aegis is Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;
    
    IWETH private immutable weth;
    IERC20 private constant ETHER_ERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    
    IWardenCosmoCore public routingManagement;
    IWardenCosmicBrain public learner;
    IWardenPostTrade public postTrade;
    
    event UpdatedRoutingManagement(
        IWardenCosmoCore indexed routingManagement
    );
    
    event UpdatedWardenLearner(
        IWardenCosmicBrain indexed learner
    );
    
    event UpdatedWardenPostTrade(
        IWardenPostTrade indexed postTrade
    );
    
    /**
    * @dev when new trade occur (and success), this event will be boardcast.
    * @param srcAsset Source token
    * @param srcAmount amount of source token
    * @param destAsset Destination token
    * @param destAmount amount of destination token
    * @param trader user address
    */
    event Trade(
        address indexed srcAsset, // Source
        uint256         srcAmount,
        address indexed destAsset, // Destination
        uint256         destAmount,
        address indexed trader, // User
        address         receiver, // User / Merchant
        bool            cacheHit,
        bool            hasSplitted
    );
    
    event CollectFee(
      IERC20  indexed   token,
      address indexed   wallet,
      uint256           amount
    );
    
    constructor(
        IWardenCosmoCore _routingManagement,
        IWardenCosmicBrain _learner,
        IWardenPostTrade _postTrade,
        IWETH _weth
    ) {
        routingManagement = _routingManagement;
        learner = _learner;
        postTrade = _postTrade;
        weth = _weth;
        
        emit UpdatedRoutingManagement(_routingManagement);
        emit UpdatedWardenLearner(_learner);
        emit UpdatedWardenPostTrade(_postTrade);
    }
    
    function updateRoutingManagement(
        IWardenCosmoCore _routingManagement
    )
        external
        onlyOwner
    {
        routingManagement = _routingManagement;
        emit UpdatedRoutingManagement(_routingManagement);
    }
    
    function updateWardenLearner(
        IWardenCosmicBrain _learner
    )
        external
        onlyOwner
    {
        learner = _learner;
        emit UpdatedWardenLearner(_learner);
    }
    
    function updateWardenPostTrade(
        IWardenPostTrade _postTrade
    )
        external
        onlyOwner
    {
        postTrade = _postTrade;
        emit UpdatedWardenPostTrade(_postTrade);
    }

    /**
    * @dev makes a trade between token to token by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @param fromAddress address of trader
    * @param toAddress destination address
    * @return amount of actual destination tokens
    */
    function _tradeTokenToToken(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest,
        address fromAddress,
        address toAddress
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = routingManagement.tradingRoutes(tradingRouteIndex).route;
        
        // Deposit to target
        address depositAddress = tradingRoute.getDepositAddress(src, dest);
        if (fromAddress == address(this)) {
            src.safeTransfer(depositAddress, srcAmount);
        } else if (fromAddress != 0x0000000000000000000000000000000000000000) {
            src.safeTransferFrom(fromAddress, depositAddress, srcAmount);
        }

        // Trade to route
        uint256 destAmount = tradingRoute.trade(
            src,
            dest,
            srcAmount,
            toAddress
        );
        return destAmount;
    }
    
    function _tradeStrategies(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256[]   memory _subRoutes,
        IERC20[]    memory _correspondentTokens,
        address     _fromAddress
    )
        private
        returns(uint256 _destAmount)
    {
        IERC20 src;
        IERC20 dest;
        _destAmount = _srcAmount;
        uint256 routersLen = _subRoutes.length;
        for (uint i = 0; i < routersLen; i++) {
            src = i == 0 ? _src : _correspondentTokens[i - 1];
            dest = i == routersLen - 1 ? _dest : _correspondentTokens[i];
            
            uint256 routeIndex = _subRoutes[i];
            address fromAddress = i == 0 ? _fromAddress : 0x0000000000000000000000000000000000000000;
            address toAddress;
            
            // Advanced fetching next market address
            if (i == routersLen - 1) {
                toAddress = address(this);
            } else {
                IWardenTradingRoute tradingRoute = routingManagement.tradingRoutes(_subRoutes[i + 1]).route;
                IERC20 nextDest = i + 1 == routersLen - 1 ? _dest : _correspondentTokens[i + 1];
                toAddress = tradingRoute.getDepositAddress(dest, nextDest);
            }

            _destAmount = _tradeTokenToToken(routeIndex, src, _destAmount, dest, fromAddress, toAddress);
        }
    }
    
    /**
    * @dev makes a trade by providing trading strategy
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _subRoutes trading routers
    * @param _correspondentTokens intermediate tokens
    * @param _receiver receiver address
    * @param _learnedId previous learning id
    * @return _destAmount amount of actual destination tokens
    */
    function _tradeStrategiesWithSafeGuard(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256     _minDestAmount,
        uint256[]   memory _subRoutes,
        IERC20[]    memory _correspondentTokens,
        address     _receiver,
        uint256     _learnedId
    )
        private
        returns(uint256 _destAmount)
    {
        {
            IERC20 adjustedSrc;
            IERC20 adjustedDest = ETHER_ERC20 == _dest ? IERC20(address(weth)) : _dest;
            address fromAddress;
            
            // Wrap ETH
            if (ETHER_ERC20 == _src) {
                require(msg.value == _srcAmount, "WardenSwap: Ether source amount mismatched");
                weth.deposit{value: _srcAmount}();
                
                adjustedSrc = IERC20(address(weth));
                fromAddress = address(this);
            } else {
                adjustedSrc = _src;
                fromAddress = msg.sender;
            }
        
            // Record src/dest asset for later consistency check.
            uint256 srcAmountBefore = adjustedSrc.balanceOf(fromAddress);
            uint256 destAmountBefore = adjustedDest.balanceOf(address(this));
            
            _destAmount = _tradeStrategies(
                adjustedSrc,
                _srcAmount,
                adjustedDest,
                _subRoutes,
                _correspondentTokens,
                fromAddress
            );
            
            // Sanity check
            // Recheck if src/dest amount correct
            require(adjustedSrc.balanceOf(fromAddress) == srcAmountBefore - _srcAmount, "WardenSwap: source amount mismatched after trade");
            require(adjustedDest.balanceOf(address(this)) == destAmountBefore + _destAmount, "WardenSwap: destination amount mismatched after trade");
        }

        
        // Unwrap ETH
        if (ETHER_ERC20 == _dest) {
            weth.withdraw(_destAmount);
        }
        
        // Collect fee
        _destAmount = _postTradeAndCollectFee(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            msg.sender,
            _receiver,
            false
        );

        // Throw exception if destination amount doesn't meet user requirement.
        require(_destAmount >= _minDestAmount, "WardenSwap: destination amount is too low.");
        if (ETHER_ERC20 == _dest) {
            (bool success, ) = _receiver.call{value: _destAmount}(""); // Send back ether to sender
            require(success, "WardenSwap: Transfer ether back to caller failed.");
        } else { // Send back token to sender
            _dest.safeTransfer(_receiver, _destAmount);
        }
        
        uint256 learnedId = _learnedId;
        if (0 == _learnedId) {
            learnedId = learner.train(_subRoutes, _correspondentTokens);
        }
        learner.trainTradingPair(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            learnedId
        );

        emit Trade(address(_src), _srcAmount, address(_dest), _destAmount, msg.sender, _receiver, 0 != _learnedId, false);
    }
    
    /**
    * @dev makes a trade by providing trading strategy
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _subRoutes trading routers
    * @param _correspondentTokens intermediate tokens
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeStrategies(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256     _minDestAmount,
        uint256[]   calldata _subRoutes,
        IERC20[]    calldata _correspondentTokens,
        address     _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        _destAmount = _tradeStrategiesWithSafeGuard(
            _src,
            _srcAmount,
            _dest,
            _minDestAmount,
            _subRoutes,
            _correspondentTokens,
            _receiver,
            0
        );
    }
    
    /**
    * @dev makes a trade by providing learned id
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _learnedId unique id
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeWithLearned(
        IERC20    _src,
        uint256   _srcAmount,
        IERC20    _dest,
        uint256   _minDestAmount,
        uint256   _learnedId,
        address   _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        bytes32 learnedHash = learner.learnedHashes(_learnedId);
        
        _destAmount = _tradeStrategiesWithSafeGuard(
            _src,
            _srcAmount,
            _dest,
            _minDestAmount,
            learner.learnedFetchAllRoutes(learnedHash),
            learner.learnedFetchAllTokens(learnedHash),
            _receiver,
            _learnedId
        );
    }
    
    function _split2(
        uint256[]   calldata _learnedIds,
        uint256[]   calldata _volumns,
        IERC20      _src,
        uint256     _totalSrcAmount,
        IERC20      _dest,
        address     _fromAddress
    )
        private
        returns (
            uint256 _destAmount
        )
    {
        // Trade with routes
        uint256 amountRemain = _totalSrcAmount;
        for (uint i = 0; i < _learnedIds.length; i++) {
            uint256 amountForThisRound;
            if (i == _learnedIds.length - 1) {
                amountForThisRound = amountRemain;
            } else {
                amountForThisRound = _totalSrcAmount * _volumns[i] / 100;
                amountRemain = amountRemain - amountForThisRound;
            }
            
            bytes32 learnedHash = learner.learnedHashes(_learnedIds[i]);
            _destAmount = _destAmount +
                _tradeStrategies(
                    _src,
                    amountForThisRound,
                    _dest,
                    learner.learnedFetchAllRoutes(learnedHash),
                    learner.learnedFetchAllTokens(learnedHash),
                    _fromAddress
                )
            ;
        }
    }
    
    function _splitTradesWithSafeGuard(
        uint256[] calldata  _learnedIds,
        uint256[] calldata  _volumns,
        IERC20              _src,
        uint256             _totalSrcAmount,
        IERC20              _dest
    )
        private
        returns(uint256 _destAmount)
    {
        IERC20 adjustedSrc;
        IERC20 adjustedDest = ETHER_ERC20 == _dest ? IERC20(address(weth)) : _dest;
        address fromAddress;
        
        // Wrap ETH
        if (ETHER_ERC20 == _src) {
            require(msg.value == _totalSrcAmount, "WardenSwap: Ether source amount mismatched");
            weth.deposit{value: _totalSrcAmount}();
            
            adjustedSrc = IERC20(address(weth));
            fromAddress = address(this);
        } else {
            adjustedSrc = _src;
            fromAddress = msg.sender;
        }
        
        // Record src/dest asset for later consistency check.
        uint256 srcAmountBefore = adjustedSrc.balanceOf(fromAddress);
        uint256 destAmountBefore = adjustedDest.balanceOf(address(this));
        
        _destAmount = _split2(
            _learnedIds,
            _volumns,
            adjustedSrc,
            _totalSrcAmount,
            adjustedDest,
            fromAddress
        );
        
        // Sanity check
        // Recheck if src/dest amount correct
        require(adjustedSrc.balanceOf(fromAddress) == srcAmountBefore - _totalSrcAmount, "WardenSwap: source amount mismatched after trade");
        require(adjustedDest.balanceOf(address(this)) == destAmountBefore + _destAmount, "WardenSwap: destination amount mismatched after trade");

        
        // Unwrap ETH
        if (ETHER_ERC20 == _dest) {
            weth.withdraw(_destAmount);
        }
    }

    /**
    * @dev makes a trade by splitting volumes
    * @param _learnedIds unique ids
    * @param _volumns volume percentages
    * @param _src Source token
    * @param _totalSrcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function splitTrades(
        uint256[] calldata  _learnedIds,
        uint256[] calldata  _volumns,
        IERC20              _src,
        uint256             _totalSrcAmount,
        IERC20              _dest,
        uint256             _minDestAmount,
        address             _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        require(_learnedIds.length > 0, "WardenSwap: learnedIds can not be empty");
        require(_learnedIds.length == _volumns.length, "WardenSwap: learnedIds and volumns lengths mismatched");
        
        _destAmount = _splitTradesWithSafeGuard(
            _learnedIds,
            _volumns,
            _src,
            _totalSrcAmount,
            _dest
        );
        
        // Collect fee
        _destAmount = _postTradeAndCollectFee(
            _src,
            _dest,
            _totalSrcAmount,
            _destAmount,
            msg.sender,
            _receiver,
            true
        );

        // Throw exception if destination amount doesn't meet user requirement.
        require(_destAmount >= _minDestAmount, "WardenSwap: destination amount is too low.");
        if (ETHER_ERC20 == _dest) {
            (bool success, ) = _receiver.call{value: _destAmount}(""); // Send back ether to sender
            require(success, "WardenSwap: Transfer ether back to caller failed.");
        } else { // Send back token to sender
            _dest.safeTransfer(_receiver, _destAmount);
        }

        emit Trade(address(_src), _totalSrcAmount, address(_dest), _destAmount, msg.sender, _receiver, true, true);
    }
    
    /**
    * @dev makes a trade ETH -> WETH
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeEthToWeth(
        address     _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        weth.deposit{value: msg.value}();
        IERC20(address(weth)).safeTransfer(_receiver, msg.value);
        _destAmount = msg.value;
        emit Trade(address(ETHER_ERC20), msg.value, address(weth), _destAmount, msg.sender, _receiver, false, false);
    }
    
    /**
    * @dev makes a trade WETH -> ETH
    * @param _srcAmount amount of source tokens
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeWethToEth(
        uint256     _srcAmount,
        address     _receiver
    )
        external
        nonReentrant
        returns(uint256 _destAmount)
    {
        IERC20(address(weth)).safeTransferFrom(msg.sender, address(this), _srcAmount);
        weth.withdraw(_srcAmount);
        (bool success, ) = _receiver.call{value: _srcAmount}(""); // Send back ether to sender
        require(success, "WardenSwap: Transfer ether back to caller failed.");
        _destAmount = _srcAmount;
        emit Trade(address(weth), _srcAmount, address(ETHER_ERC20), _destAmount, msg.sender, _receiver, false, false);
    }

    // In case of an expected and unexpected event that has some token amounts remain in this contract, owner can call to collect them.
    function collectRemainingToken(
        IERC20  _token,
        uint256 _amount
    )
      external
      onlyOwner
    {
        _token.safeTransfer(msg.sender, _amount);
    }

    // In case of an expected and unexpected event that has some ether amounts remain in this contract, owner can call to collect them.
    function collectRemainingEther(
        uint256 _amount
    )
      external
      onlyOwner
    {
        (bool success, ) = msg.sender.call{value: _amount}(""); // Send back ether to sender
        require(success, "WardenSwap: Transfer ether back to caller failed.");
    }
    
    // Receive ETH in case of trade Token -> ETH
    receive() external payable {}
    
    function _postTradeAndCollectFee(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        address     _trader,
        address     _receiver,
        bool        _isSplit
    )
        private
        returns (uint256 _newDestAmount)
    {
        // Collect fee
        (uint256 fee, address feeWallet) = postTrade.postTradeAndFee(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            _trader,
            _receiver,
            _isSplit
        );
        if (fee > 0) {
            _collectFee(
                _dest,
                fee,
                feeWallet
            );
        }
        return _destAmount - fee;
    }
    
    function _collectFee(
        IERC20  _token,
        uint256 _fee,
        address _feeWallet
    )
        private
    {
        if (ETHER_ERC20 == _token) {
            (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send back ether to sender
            require(success, "Transfer fee of ether failed.");
        } else {
            _token.safeTransfer(_feeWallet, _fee);
        }
        emit CollectFee(_token, _feeWallet, _fee);
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IWardenCosmoCore","name":"_routingManagement","type":"address"},{"internalType":"contract IWardenCosmicBrain","name":"_learner","type":"address"},{"internalType":"contract IWardenPostTrade","name":"_postTrade","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollectFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"cacheHit","type":"bool"},{"indexed":false,"internalType":"bool","name":"hasSplitted","type":"bool"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenCosmoCore","name":"routingManagement","type":"address"}],"name":"UpdatedRoutingManagement","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenCosmicBrain","name":"learner","type":"address"}],"name":"UpdatedWardenLearner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenPostTrade","name":"postTrade","type":"address"}],"name":"UpdatedWardenPostTrade","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"learner","outputs":[{"internalType":"contract IWardenCosmicBrain","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postTrade","outputs":[{"internalType":"contract IWardenPostTrade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routingManagement","outputs":[{"internalType":"contract IWardenCosmoCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_learnedIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_volumns","type":"uint256[]"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_totalSrcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"splitTrades","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeEthToWeth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"uint256[]","name":"_subRoutes","type":"uint256[]"},{"internalType":"contract IERC20[]","name":"_correspondentTokens","type":"address[]"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeStrategies","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWethToEth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"uint256","name":"_learnedId","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWithLearned","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenCosmoCore","name":"_routingManagement","type":"address"}],"name":"updateRoutingManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenCosmicBrain","name":"_learner","type":"address"}],"name":"updateWardenLearner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenPostTrade","name":"_postTrade","type":"address"}],"name":"updateWardenPostTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604051620031903803806200319083398101604081905262000034916200017b565b6200003f336200012b565b60018055600280546001600160a01b038087166001600160a01b031992831681179093556003805487831690841617905560048054918616919092161790556001600160601b0319606083901b166080526040517f4158d6fb30ce3bc59f79f1e62ec86e3141b1db83ff2adbd93404b9d017615aee90600090a26040516001600160a01b038416907f28ad9ca1082b4a5d88ea02df921da4ca5c95e220ef1e855c1fb06fbd5e67d15990600090a26040516001600160a01b038316907ff3809f73f1bea6bcad288beb0538a25e1b98b4388cc422d087050ff52f7cbf8790600090a250505050620001fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080608085870312156200019257600080fd5b84516200019f81620001e3565b6020860151909450620001b281620001e3565b6040860151909350620001c581620001e3565b6060860151909250620001d881620001e3565b939692955090935050565b6001600160a01b0381168114620001f957600080fd5b50565b60805160601c612f1a62000276600039600081816105ef0152818161062d0152818161072b01528181610c0f01528181610c8d01528181610cc701528181610e0801528181610e6c01528181610ee00152818161119d0152818161141501528181611479015281816114ed01526117b60152612f1a6000f3fe6080604052600436106100c75760003560e01c806310b8e70f146100d357806327d2f16c146100f5578063356890111461012b5780633d0652ac1461014c5780634912dd141461016c578063629e14251461018c57806366f7c956146101ac5780636d16ecee146101cc578063715018a6146101ec57806378fc6db0146102015780638da5cb5b146102145780638f64d73a1461022957806397ad9f8614610249578063c8a7c7e514610269578063dca489e01461027c578063f2fde38b1461028f57600080fd5b366100ce57005b600080fd5b3480156100df57600080fd5b506100f36100ee366004612514565b6102af565b005b34801561010157600080fd5b50600454610115906001600160a01b031681565b6040516101229190612a10565b60405180910390f35b61013e6101393660046125f3565b610331565b604051908152602001610122565b34801561015857600080fd5b50600254610115906001600160a01b031681565b34801561017857600080fd5b506100f361018736600461276c565b610571565b34801561019857600080fd5b5061013e6101a736600461299f565b6105b8565b3480156101b857600080fd5b506100f36101c7366004612514565b61078c565b3480156101d857600080fd5b506100f36101e7366004612514565b610805565b3480156101f857600080fd5b506100f361087e565b61013e61020f366004612798565b6108b9565b34801561022057600080fd5b5061011561096b565b34801561023557600080fd5b506100f3610244366004612986565b61097a565b34801561025557600080fd5b50600354610115906001600160a01b031681565b61013e610277366004612841565b610a11565b61013e61028a366004612514565b610be0565b34801561029b57600080fd5b506100f36102aa366004612514565b610d3e565b336102b861096b565b6001600160a01b0316146102e75760405162461bcd60e51b81526004016102de90612c2a565b60405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517ff3809f73f1bea6bcad288beb0538a25e1b98b4388cc422d087050ff52f7cbf8790600090a250565b6000600260015414156103565760405162461bcd60e51b81526004016102de90612cb4565b6002600155886103b85760405162461bcd60e51b815260206004820152602760248201527f57617264656e537761703a206c6561726e65644964732063616e206e6f7420626044820152666520656d70747960c81b60648201526084016102de565b8887146104255760405162461bcd60e51b815260206004820152603560248201527f57617264656e537761703a206c6561726e656449647320616e6420766f6c756d6044820152741b9cc81b195b99dd1a1cc81b5a5cdb585d18da1959605a1b60648201526084016102de565b6104348a8a8a8a8a8a8a610dde565b90506104468685878433876001611212565b9050828110156104685760405162461bcd60e51b81526004016102de90612be0565b600080516020612ec58339815191526001600160a01b0385161415610500576000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146104d4576040519150601f19603f3d011682016040523d82523d6000602084013e6104d9565b606091505b50509050806104fa5760405162461bcd60e51b81526004016102de90612b8f565b50610514565b6105146001600160a01b03851683836112f5565b336001600160a01b0316846001600160a01b0316876001600160a01b0316600080516020612ea5833981519152888587600180604051610558959493929190612ceb565b60405180910390a4600180559998505050505050505050565b3361057a61096b565b6001600160a01b0316146105a05760405162461bcd60e51b81526004016102de90612c2a565b6105b46001600160a01b03831633836112f5565b5050565b6000600260015414156105dd5760405162461bcd60e51b81526004016102de90612cb4565b60026001556106176001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308661135d565b604051632e1a7d4d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561067957600080fd5b505af115801561068d573d6000803e3d6000fd5b505050506000826001600160a01b03168460405160006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50509050806107045760405162461bcd60e51b81526004016102de90612b8f565b839150336001600160a01b0316600080516020612ec58339815191526001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020612ea5833981519152878688600080604051610779959493929190612ceb565b60405180910390a4506001805592915050565b3361079561096b565b6001600160a01b0316146107bb5760405162461bcd60e51b81526004016102de90612c2a565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f28ad9ca1082b4a5d88ea02df921da4ca5c95e220ef1e855c1fb06fbd5e67d15990600090a250565b3361080e61096b565b6001600160a01b0316146108345760405162461bcd60e51b81526004016102de90612c2a565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f4158d6fb30ce3bc59f79f1e62ec86e3141b1db83ff2adbd93404b9d017615aee90600090a250565b3361088761096b565b6001600160a01b0316146108ad5760405162461bcd60e51b81526004016102de90612c2a565b6108b7600061139b565b565b6000600260015414156108de5760405162461bcd60e51b81526004016102de90612cb4565b60026001819055506109598a8a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201829052508c935091506113eb9050565b600180559a9950505050505050505050565b6000546001600160a01b031690565b3361098361096b565b6001600160a01b0316146109a95760405162461bcd60e51b81526004016102de90612c2a565b604051600090339083908381818185875af1925050503d80600081146109eb576040519150601f19603f3d011682016040523d82523d6000602084013e6109f0565b606091505b50509050806105b45760405162461bcd60e51b81526004016102de90612b8f565b600060026001541415610a365760405162461bcd60e51b81526004016102de90612cb4565b600260015560035460405163972f414360e01b8152600481018590526000916001600160a01b03169063972f414390602401602060405180830381600087803b158015610a8257600080fd5b505af1158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190612753565b600354604051633126c55d60e11b815260048101839052919250610bd0918a918a918a918a916001600160a01b039091169063624d8aba9060240160006040518083038186803b158015610b0d57600080fd5b505afa158015610b21573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b4991908101906126ad565b600354604051631286d50360e31b8152600481018990526001600160a01b0390911690639436a8189060240160006040518083038186803b158015610b8d57600080fd5b505afa158015610ba1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bc9919081019061254e565b898b6113eb565b6001805598975050505050505050565b600060026001541415610c055760405162461bcd60e51b81526004016102de90612cb4565b60026001819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c6857600080fd5b505af1158015610c7c573d6000803e3d6000fd5b50610cb89350506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150849050346112f5565b349050336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020612ec58339815191526001600160a01b0316600080516020612ea5833981519152348587600080604051610d2d959493929190612ceb565b60405180910390a460018055919050565b33610d4761096b565b6001600160a01b031614610d6d5760405162461bcd60e51b81526004016102de90612c2a565b6001600160a01b038116610dd25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102de565b610ddb8161139b565b50565b60008080600080516020612ec58339815191526001600160a01b03851614610e065783610e28565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000600080516020612ec58339815191526001600160a01b0388161415610f0957853414610e6a5760405162461bcd60e51b81526004016102de90612af5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009250309050610f0f565b50859150335b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190610f3e908590600401612a10565b60206040518083038186803b158015610f5657600080fd5b505afa158015610f6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8e9190612753565b90506000836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610fbe9190612a10565b60206040518083038186803b158015610fd657600080fd5b505afa158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190612753565b90506110208d8d8d8d898d8a8a611a80565b955061102c8883612def565b6040516370a0823160e01b81526001600160a01b038716906370a0823190611058908790600401612a10565b60206040518083038186803b15801561107057600080fd5b505afa158015611084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a89190612753565b146110c55760405162461bcd60e51b81526004016102de90612b3f565b6110cf8682612d96565b6040516370a0823160e01b81526001600160a01b038616906370a08231906110fb903090600401612a10565b60206040518083038186803b15801561111357600080fd5b505afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612753565b146111685760405162461bcd60e51b81526004016102de90612c5f565b600080516020612ec58339815191526001600160a01b038816141561120257604051632e1a7d4d60e01b8152600481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111e957600080fd5b505af11580156111fd573d6000803e3d6000fd5b505050505b5050505050979650505050505050565b6004805460405163c62dc9ef60e01b81526001600160a01b038a81169382019390935288831660248201526044810188905260648101879052858316608482015284831660a482015283151560c48201526000928392839291169063c62dc9ef9060e4016040805180830381600087803b15801561128f57600080fd5b505af11580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c791906129cf565b909250905081156112dd576112dd898383611cc4565b6112e78288612def565b9a9950505050505050505050565b6040516001600160a01b03831660248201526044810182905261135890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611df2565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526113959085906323b872dd60e01b90608401611321565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008080600080516020612ec58339815191526001600160a01b038a16146114135788611435565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000600080516020612ec58339815191526001600160a01b038d161415611516578a34146114775760405162461bcd60e51b81526004016102de90612af5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08c6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156114d257600080fd5b505af11580156114e6573d6000803e3d6000fd5b50505050507f0000000000000000000000000000000000000000000000000000000000000000925030905061151c565b508a9150335b6040516370a0823160e01b81526000906001600160a01b038516906370a082319061154b908590600401612a10565b60206040518083038186803b15801561156357600080fd5b505afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190612753565b90506000836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016115cb9190612a10565b60206040518083038186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190612753565b905061162b858e868d8d88611ec4565b95506116378d83612def565b6040516370a0823160e01b81526001600160a01b038716906370a0823190611663908790600401612a10565b60206040518083038186803b15801561167b57600080fd5b505afa15801561168f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b39190612753565b146116d05760405162461bcd60e51b81526004016102de90612b3f565b6116da8682612d96565b6040516370a0823160e01b81526001600160a01b038616906370a0823190611706903090600401612a10565b60206040518083038186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117569190612753565b146117735760405162461bcd60e51b81526004016102de90612c5f565b5050505050866001600160a01b0316600080516020612ec58339815191526001600160a01b0316141561181b57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561180257600080fd5b505af1158015611816573d6000803e3d6000fd5b505050505b61182b89888a8433886000611212565b90508581101561184d5760405162461bcd60e51b81526004016102de90612be0565b600080516020612ec58339815191526001600160a01b03881614156118e5576000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b50509050806118df5760405162461bcd60e51b81526004016102de90612b8f565b506118f9565b6118f96001600160a01b03881684836112f5565b818061198657600354604051634b54ddad60e11b81526001600160a01b03909116906396a9bb5a906119319089908990600401612a24565b602060405180830381600087803b15801561194b57600080fd5b505af115801561195f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119839190612753565b90505b6003546040516329c2393b60e01b81526001600160a01b038c811660048301528a81166024830152604482018c90526064820185905260848201849052909116906329c2393b9060a401602060405180830381600087803b1580156119ea57600080fd5b505af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190612738565b50336001600160a01b0316886001600160a01b03168b6001600160a01b0316600080516020612ea58339815191528c868989600014156000604051611a6b959493929190612ceb565b60405180910390a45098975050505050505050565b600083815b89811015611cb6576000611a9a60018c612def565b821415611aa8575081611ae7565b60648a8a84818110611abc57611abc612e63565b9050602002013588611ace9190612dd0565b611ad89190612dae565b9050611ae48184612def565b92505b6003546000906001600160a01b031663972f41438e8e86818110611b0d57611b0d612e63565b905060200201356040518263ffffffff1660e01b8152600401611b3291815260200190565b602060405180830381600087803b158015611b4c57600080fd5b505af1158015611b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b849190612753565b600354604051633126c55d60e11b815260048101839052919250611c95918b9185918b916001600160a01b03169063624d8aba9060240160006040518083038186803b158015611bd357600080fd5b505afa158015611be7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c0f91908101906126ad565b600354604051631286d50360e31b8152600481018890526001600160a01b0390911690639436a8189060240160006040518083038186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c8f919081019061254e565b8b611ec4565b611c9f9086612d96565b945050508080611cae90612e32565b915050611a85565b505098975050505050505050565b600080516020612ec58339815191526001600160a01b0384161415611d8c576000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611d30576040519150601f19603f3d011682016040523d82523d6000602084013e611d35565b606091505b5050905080611d865760405162461bcd60e51b815260206004820152601d60248201527f5472616e7366657220666565206f66206574686572206661696c65642e00000060448201526064016102de565b50611da0565b611da06001600160a01b03841682846112f5565b806001600160a01b0316836001600160a01b03167f63641fd2aeafea4143cc44c28ca8af48dde6326ee1be502b0222b4f92dfae28384604051611de591815260200190565b60405180910390a3505050565b6000611e47826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661213e9092919063ffffffff16565b8051909150156113585780806020019051810190611e659190612738565b6113585760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102de565b825185906000908190815b81811015612130578015611f065786611ee9600183612def565b81518110611ef957611ef9612e63565b6020026020010151611f08565b8a5b9350611f15600183612def565b8114611f3a57868181518110611f2d57611f2d612e63565b6020026020010151611f3c565b885b92506000888281518110611f5257611f52612e63565b60200260200101519050600082600014611f6d576000611f6f565b875b90506000611f7e600186612def565b841415611f8c57503061210a565b6002546000906001600160a01b031663e254a4f38d611fac886001612d96565b81518110611fbc57611fbc612e63565b60200260200101516040518263ffffffff1660e01b8152600401611fe291815260200190565b60006040518083038186803b158015611ffa57600080fd5b505afa15801561200e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261203691908101906128a8565b6040015190506000612049600188612def565b612054876001612d96565b14612082578b612065876001612d96565b8151811061207557612075612e63565b6020026020010151612084565b8d5b604051632717650960e01b81529091506001600160a01b038316906327176509906120b5908b908590600401612aa8565b60206040518083038186803b1580156120cd57600080fd5b505afa1580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121059190612531565b925050505b61211883888a898686612157565b9750505050808061212890612e32565b915050611ecf565b505050509695505050505050565b606061214d8484600085612348565b90505b9392505050565b60025460405163e254a4f360e01b81526004810188905260009182916001600160a01b039091169063e254a4f39060240160006040518083038186803b1580156121a057600080fd5b505afa1580156121b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121dc91908101906128a8565b6040015190506000816001600160a01b0316632717650989886040518363ffffffff1660e01b8152600401612212929190612aa8565b60206040518083038186803b15801561222a57600080fd5b505afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190612531565b90506001600160a01b03851630141561228e576122896001600160a01b03891682896112f5565b6122b2565b6001600160a01b038516156122b2576122b26001600160a01b03891686838a61135d565b60405163d76d0c5b60e01b81526001600160a01b03898116600483015287811660248301526044820189905285811660648301526000919084169063d76d0c5b90608401602060405180830381600087803b15801561231057600080fd5b505af1158015612324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e79190612753565b6060824710156123a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102de565b843b6123f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102de565b600080866001600160a01b0316858760405161241391906129f4565b60006040518083038185875af1925050503d8060008114612450576040519150601f19603f3d011682016040523d82523d6000602084013e612455565b606091505b5091509150612465828286612470565b979650505050505050565b6060831561247f575081612150565b82511561248f5782518084602001fd5b8160405162461bcd60e51b81526004016102de9190612ac2565b60008083601f8401126124bb57600080fd5b5081356001600160401b038111156124d257600080fd5b6020830191508360208260051b85010111156124ed57600080fd5b9250929050565b8051801515811461250457600080fd5b919050565b805161250481612e8f565b60006020828403121561252657600080fd5b813561215081612e8f565b60006020828403121561254357600080fd5b815161215081612e8f565b6000602080838503121561256157600080fd5b82516001600160401b0381111561257757600080fd5b8301601f8101851361258857600080fd5b805161259b61259682612d73565b612d43565b80828252848201915084840188868560051b87010111156125bb57600080fd5b600094505b838510156125e75780516125d381612e8f565b8352600194909401939185019185016125c0565b50979650505050505050565b600080600080600080600080600060e08a8c03121561261157600080fd5b89356001600160401b038082111561262857600080fd5b6126348d838e016124a9565b909b50995060208c013591508082111561264d57600080fd5b5061265a8c828d016124a9565b90985096505060408a013561266e81612e8f565b945060608a0135935060808a013561268581612e8f565b925060a08a0135915060c08a013561269c81612e8f565b809150509295985092959850929598565b600060208083850312156126c057600080fd5b82516001600160401b038111156126d657600080fd5b8301601f810185136126e757600080fd5b80516126f561259682612d73565b80828252848201915084840188868560051b870101111561271557600080fd5b600094505b838510156125e757805183526001949094019391850191850161271a565b60006020828403121561274a57600080fd5b612150826124f4565b60006020828403121561276557600080fd5b5051919050565b6000806040838503121561277f57600080fd5b823561278a81612e8f565b946020939093013593505050565b600080600080600080600080600060e08a8c0312156127b657600080fd5b89356127c181612e8f565b985060208a0135975060408a01356127d881612e8f565b965060608a0135955060808a01356001600160401b03808211156127fb57600080fd5b6128078d838e016124a9565b909750955060a08c013591508082111561282057600080fd5b5061282d8c828d016124a9565b90945092505060c08a013561269c81612e8f565b60008060008060008060c0878903121561285a57600080fd5b863561286581612e8f565b955060208701359450604087013561287c81612e8f565b9350606087013592506080870135915060a087013561289a81612e8f565b809150509295509295509295565b600060208083850312156128bb57600080fd5b82516001600160401b03808211156128d257600080fd5b90840190606082870312156128e657600080fd5b6128ee612d1b565b8251828111156128fd57600080fd5b8301601f8101881361290e57600080fd5b80518381111561292057612920612e79565b612932601f8201601f19168701612d43565b9350808452888682840101111561294857600080fd5b61295781878601888501612e06565b50508181526129678484016124f4565b8482015261297760408401612509565b60408201529695505050505050565b60006020828403121561299857600080fd5b5035919050565b600080604083850312156129b257600080fd5b8235915060208301356129c481612e8f565b809150509250929050565b600080604083850312156129e257600080fd5b8251915060208301516129c481612e8f565b60008251612a06818460208701612e06565b9190910192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015612a5d57815184529284019290840190600101612a41565b5050508381038285015284518082528583019183019060005b81811015612a9b5783516001600160a01b031683529284019291840191600101612a76565b5090979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6020815260008251806020840152612ae1816040850160208701612e06565b601f01601f19169190910160400192915050565b6020808252602a908201527f57617264656e537761703a20457468657220736f7572636520616d6f756e74206040820152691b5a5cdb585d18da195960b21b606082015260800190565b60208082526030908201527f57617264656e537761703a20736f7572636520616d6f756e74206d69736d617460408201526f6368656420616674657220747261646560801b606082015260800190565b60208082526031908201527f57617264656e537761703a205472616e73666572206574686572206261636b206040820152703a379031b0b63632b9103330b4b632b21760791b606082015260800190565b6020808252602a908201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206960408201526939903a37b7903637bb9760b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526035908201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206d60408201527469736d61746368656420616674657220747261646560581b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b94855260208501939093526001600160a01b03919091166040840152151560608301521515608082015260a00190565b604051606081016001600160401b0381118282101715612d3d57612d3d612e79565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d6b57612d6b612e79565b604052919050565b60006001600160401b03821115612d8c57612d8c612e79565b5060051b60200190565b60008219821115612da957612da9612e4d565b500190565b600082612dcb57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612dea57612dea612e4d565b500290565b600082821015612e0157612e01612e4d565b500390565b60005b83811015612e21578181015183820152602001612e09565b838111156113955750506000910152565b6000600019821415612e4657612e46612e4d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ddb57600080fdfe7acb84937815db1a71622c24a8f03661982c6ac39f087563b5033ab1c9d2cbbd000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea264697066735822122038119c11526ddf9575adbee9b9160a608de887f548544d29d431d2a1b7c7a46664736f6c634300080700330000000000000000000000001a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f0000000000000000000000003657952d7ba5a0a4799809b5b6fdff9ec5b4629300000000000000000000000071ac17934b60a4610dc58b715b61e45dcbde405400000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

0000000000000000000000001a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f0000000000000000000000003657952d7ba5a0a4799809b5b6fdff9ec5b4629300000000000000000000000071ac17934b60a4610dc58b715b61e45dcbde405400000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _routingManagement (address): 0x1a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f
Arg [1] : _learner (address): 0x3657952d7ba5a0a4799809b5b6fdff9ec5b46293
Arg [2] : _postTrade (address): 0x71ac17934b60a4610dc58b715b61e45dcbde4054
Arg [3] : _weth (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a5f88fb85bd2b5eb1b5dc738ae02a5f0a69729f
Arg [1] : 0000000000000000000000003657952d7ba5a0a4799809b5b6fdff9ec5b46293
Arg [2] : 00000000000000000000000071ac17934b60a4610dc58b715b61e45dcbde4054
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

29230:20276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31650:209;;;;;;;;;;-1:-1:-1;31650:209:0;;;;;:::i;:::-;;:::i;:::-;;29557:33;;;;;;;;;;-1:-1:-1;29557:33:0;;;;-1:-1:-1;;;;;29557:33:0;;;;;;;;;;:::i;:::-;;;;;;;;44213:1697;;;;;;:::i;:::-;;:::i;:::-;;;13100:25:1;;;13088:2;13073:18;44213:1697:0;12954:177:1;29469:41:0;;;;;;;;;;-1:-1:-1;29469:41:0;;;;-1:-1:-1;;;;;29469:41:0;;;47522:186;;;;;;;;;;-1:-1:-1;47522:186:0;;;;;:::i;:::-;;:::i;46735:642::-;;;;;;;;;;-1:-1:-1;46735:642:0;;;;;:::i;:::-;;:::i;31439:199::-;;;;;;;;;;-1:-1:-1;31439:199:0;;;;;:::i;:::-;;:::i;31182:245::-;;;;;;;;;;-1:-1:-1;31182:245:0;;;;;:::i;:::-;;:::i;25782:94::-;;;;;;;;;;;;;:::i;38921:649::-;;;;;;:::i;:::-;;:::i;25131:87::-;;;;;;;;;;;;;:::i;47853:284::-;;;;;;;;;;-1:-1:-1;47853:284:0;;;;;:::i;:::-;;:::i;29517:33::-;;;;;;;;;;-1:-1:-1;29517:33:0;;;;-1:-1:-1;;;;;29517:33:0;;;39972:716;;;;;;:::i;:::-;;:::i;46081:434::-;;;;;;:::i;:::-;;:::i;26031:192::-;;;;;;;;;;-1:-1:-1;26031:192:0;;;;;:::i;:::-;;:::i;31650:209::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;;;;;;;;;31779:9:::1;:22:::0;;-1:-1:-1;;;;;;31779:22:0::1;-1:-1:-1::0;;;;;31779:22:0;::::1;::::0;;::::1;::::0;;;31817:34:::1;::::0;::::1;::::0;-1:-1:-1;;31817:34:0::1;31650:209:::0;:::o;44213:1697::-;44598:19;28211:1;28807:7;;:19;;28799:63;;;;-1:-1:-1;;;28799:63:0;;;;;;;:::i;:::-;28211:1;28940:7;:18;44643:22;44635:74:::1;;;::::0;-1:-1:-1;;;44635:74:0;;16936:2:1;44635:74:0::1;::::0;::::1;16918:21:1::0;16975:2;16955:18;;;16948:30;17014:34;16994:18;;;16987:62;-1:-1:-1;;;17065:18:1;;;17058:37;17112:19;;44635:74:0::1;16734:403:1::0;44635:74:0::1;44728:37:::0;;::::1;44720:103;;;::::0;-1:-1:-1;;;44720:103:0;;18575:2:1;44720:103:0::1;::::0;::::1;18557:21:1::0;18614:2;18594:18;;;18587:30;18653:34;18633:18;;;18626:62;-1:-1:-1;;;18704:18:1;;;18697:51;18765:19;;44720:103:0::1;18373:417:1::0;44720:103:0::1;44858:154;44898:11;;44924:8;;44947:4;44966:15;44996:5;44858:25;:154::i;:::-;44844:168;;45071:197;45109:4;45128:5;45148:15;45178:11;45204:10;45229:9;45253:4;45071:23;:197::i;:::-;45057:211;;45385:14;45370:11;:29;;45362:84;;;;-1:-1:-1::0;;;45362:84:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;;;;;;;;;;45461:20:0;::::1;;45457:327;;;45499:12;45517:9;-1:-1:-1::0;;;;;45517:14:0::1;45539:11;45517:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45498:57;;;45607:7;45599:69;;;;-1:-1:-1::0;;;45599:69:0::1;;;;;;;:::i;:::-;45483:197;45457:327;;;45730:42;-1:-1:-1::0;;;;;45730:18:0;::::1;45749:9:::0;45760:11;45730:18:::1;:42::i;:::-;45868:10;-1:-1:-1::0;;;;;45801:101:0::1;45847:5;-1:-1:-1::0;;;;;45801:101:0::1;45815:4;-1:-1:-1::0;;;;;45801:101:0::1;-1:-1:-1::0;;;;;;;;;;;45822:15:0::1;45855:11;45880:9;45891:4;45897::::0;45801:101:::1;;;;;;;;;;:::i;:::-;;;;;;;;28167:1:::0;29119:22;;44213:1697;;-1:-1:-1;;;;;;;;;44213:1697:0:o;47522:186::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;47660:40:::1;-1:-1:-1::0;;;;;47660:19:0;::::1;47680:10;47692:7:::0;47660:19:::1;:40::i;:::-;47522:186:::0;;:::o;46735:642::-;46888:19;28211:1;28807:7;;:19;;28799:63;;;;-1:-1:-1;;;28799:63:0;;;;;;;:::i;:::-;28211:1;28940:7;:18;46925:77:::1;-1:-1:-1::0;;;;;46940:4:0::1;46925:38;46964:10;46984:4;46991:10:::0;46925:38:::1;:77::i;:::-;47013:25;::::0;-1:-1:-1;;;47013:25:0;;::::1;::::0;::::1;13100::1::0;;;47013:4:0::1;-1:-1:-1::0;;;;;47013:13:0::1;::::0;::::1;::::0;13073:18:1;;47013:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47050:12;47068:9;-1:-1:-1::0;;;;;47068:14:0::1;47090:10;47068:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47049:56;;;47153:7;47145:69;;;;-1:-1:-1::0;;;47145:69:0::1;;;;;;;:::i;:::-;47239:10;47225:24;;47333:10;-1:-1:-1::0;;;;;47265:104:0::1;-1:-1:-1::0;;;;;;;;;;;;;;;;47265:104:0::1;47279:4;-1:-1:-1::0;;;;;47265:104:0::1;-1:-1:-1::0;;;;;;;;;;;47286:10:0::1;47320:11;47345:9;47356:5;47363::::0;47265:104:::1;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;28167:1:0;29119:22;;46735:642;;-1:-1:-1;;46735:642:0:o;31439:199::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;31566:7:::1;:18:::0;;-1:-1:-1;;;;;;31566:18:0::1;-1:-1:-1::0;;;;;31566:18:0;::::1;::::0;;::::1;::::0;;;31600:30:::1;::::0;::::1;::::0;-1:-1:-1;;31600:30:0::1;31439:199:::0;:::o;31182:245::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;31321:17:::1;:38:::0;;-1:-1:-1;;;;;;31321:38:0::1;-1:-1:-1::0;;;;;31321:38:0;::::1;::::0;;::::1;::::0;;;31375:44:::1;::::0;::::1;::::0;-1:-1:-1;;31375:44:0::1;31182:245:::0;:::o;25782:94::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;25847:21:::1;25865:1;25847:9;:21::i;:::-;25782:94::o:0;38921:649::-;39278:19;28211:1;28807:7;;:19;;28799:63;;;;-1:-1:-1;;;28799:63:0;;;;;;;:::i;:::-;28211:1;28940:7;:18;;;;39329:233:::1;39373:4;39392:10;39417:5;39437:14;39466:10;;39329:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39329:233:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;39491:20:0;;-1:-1:-1;39491:20:0;;;;39329:233;::::1;::::0;39491:20;;39329:233;39491:20;39329:233;::::1;;::::0;::::1;::::0;;;-1:-1:-1;39526:9:0;;-1:-1:-1;39329:233:0;-1:-1:-1;39329:29:0::1;::::0;-1:-1:-1;39329:233:0:i:1;:::-;28167:1:::0;29119:22;;39315:247;38921:649;-1:-1:-1;;;;;;;;;;38921:649:0:o;25131:87::-;25177:7;25204:6;-1:-1:-1;;;;;25204:6:0;;25131:87::o;47853:284::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;47985:35:::1;::::0;47967:12:::1;::::0;47985:10:::1;::::0;48008:7;;47967:12;47985:35;47967:12;47985:35;48008:7;47985:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47966:54;;;48068:7;48060:69;;;;-1:-1:-1::0;;;48060:69:0::1;;;;;;;:::i;39972:716::-:0;40257:19;28211:1;28807:7;;:19;;28799:63;;;;-1:-1:-1;;;28799:63:0;;;;;;;:::i;:::-;28211:1;28940:7;:18;40316:7:::1;::::0;:33:::1;::::0;-1:-1:-1;;;40316:33:0;;::::1;::::0;::::1;13100:25:1::0;;;40294:19:0::1;::::0;-1:-1:-1;;;;;40316:7:0::1;::::0;:21:::1;::::0;13073:18:1;;40316:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40521:7;::::0;:42:::1;::::0;-1:-1:-1;;;40521:42:0;;::::1;::::0;::::1;13100:25:1::0;;;40294:55:0;;-1:-1:-1;40384:296:0::1;::::0;40428:4;;40447:10;;40472:5;;40492:14;;-1:-1:-1;;;;;40521:7:0;;::::1;::::0;:29:::1;::::0;13073:18:1;;40521:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40521:42:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40578:7;::::0;:42:::1;::::0;-1:-1:-1;;;40578:42:0;;::::1;::::0;::::1;13100:25:1::0;;;-1:-1:-1;;;;;40578:7:0;;::::1;::::0;:29:::1;::::0;13073:18:1;;40578:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40578:42:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40635:9;40659:10;40384:29;:296::i;:::-;28167:1:::0;29119:22;;40370:310;39972:716;-1:-1:-1;;;;;;;;39972:716:0:o;46081:434::-;46218:19;28211:1;28807:7;;:19;;28799:63;;;;-1:-1:-1;;;28799:63:0;;;;;;;:::i;:::-;28211:1;28940:7;:18;;;;46255:4:::1;-1:-1:-1::0;;;;;46255:12:0::1;;46275:9;46255:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;46298:56:0::1;::::0;-1:-1:-1;;;;;;;46313:4:0::1;46298:34;::::0;-1:-1:-1;46333:9:0;;-1:-1:-1;46344:9:0::1;46298:34;:56::i;:::-;46379:9;46365:23;;46471:10;-1:-1:-1::0;;;;;46404:103:0::1;46451:4;-1:-1:-1::0;;;;;46404:103:0::1;-1:-1:-1::0;;;;;;;;;;;;;;;;46404:103:0::1;-1:-1:-1::0;;;;;;;;;;;46432:9:0::1;46458:11;46483:9;46494:5;46501::::0;46404:103:::1;;;;;;;;;;:::i;:::-;;;;;;;;28167:1:::0;29119:22;;46081:434;;-1:-1:-1;46081:434:0:o;26031:192::-;23946:10;25351:7;:5;:7::i;:::-;-1:-1:-1;;;;;25351:23:0;;25343:68;;;;-1:-1:-1;;;25343:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26120:22:0;::::1;26112:73;;;::::0;-1:-1:-1;;;26112:73:0;;17761:2:1;26112:73:0::1;::::0;::::1;17743:21:1::0;17800:2;17780:18;;;17773:30;17839:34;17819:18;;;17812:62;-1:-1:-1;;;17890:18:1;;;17883:36;17936:19;;26112:73:0::1;17559:402:1::0;26112:73:0::1;26196:19;26206:8;26196:9;:19::i;:::-;26031:192:::0;:::o;41965:1804::-;42239:19;;;-1:-1:-1;;;;;;;;;;;;;;;;42327:20:0;;;:52;;42374:5;42327:52;;;42365:4;42327:52;42305:74;-1:-1:-1;42390:19:0;-1:-1:-1;;;;;;;;;;;;;;;;42455:19:0;;;42451:384;;;42512:15;42499:9;:28;42491:83;;;;-1:-1:-1;;;42491:83:0;;;;;;;:::i;:::-;42589:4;-1:-1:-1;;;;;42589:12:0;;42609:15;42589:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42685:4;42656:35;;42728:4;42706:27;;42451:384;;;-1:-1:-1;42780:4:0;;-1:-1:-1;42813:10:0;42451:384;42944:34;;-1:-1:-1;;;42944:34:0;;42918:23;;-1:-1:-1;;;;;42944:21:0;;;;;:34;;42966:11;;42944:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42918:60;;42989:24;43016:12;-1:-1:-1;;;;;43016:22:0;;43047:4;43016:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42989:64;;43088:176;43110:11;;43136:8;;43159:11;43185:15;43215:12;43242:11;43088:7;:176::i;:::-;43074:190;-1:-1:-1;43403:33:0;43421:15;43403;:33;:::i;:::-;43365:34;;-1:-1:-1;;;43365:34:0;;-1:-1:-1;;;;;43365:21:0;;;;;:34;;43387:11;;43365:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;43357:132;;;;-1:-1:-1;;;43357:132:0;;;;;;;:::i;:::-;43549:30;43568:11;43549:16;:30;:::i;:::-;43508:37;;-1:-1:-1;;;43508:37:0;;-1:-1:-1;;;;;43508:22:0;;;;;:37;;43539:4;;43508:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;43500:137;;;;-1:-1:-1;;;43500:137:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;43687:20:0;;;43683:79;;;43724:26;;-1:-1:-1;;;43724:26:0;;;;;13100:25:1;;;43724:4:0;-1:-1:-1;;;;;43724:13:0;;;;13073:18:1;;43724:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43683:79;42265:1504;;;;;41965:1804;;;;;;;;;:::o;48240:777::-;48629:9;;;:195;;-1:-1:-1;;;48629:195:0;;-1:-1:-1;;;;;14355:15:1;;;48629:195:0;;;14337:34:1;;;;14407:15;;;14387:18;;;14380:43;14439:18;;;14432:34;;;14482:18;;;14475:34;;;14546:15;;;14525:19;;;14518:44;14599:15;;;14578:19;;;14571:44;14659:14;;14652:22;14631:19;;;14624:51;48530:22:0;;;;;;48629:9;;;:25;;14271:19:1;;48629:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48594:230;;-1:-1:-1;48594:230:0;-1:-1:-1;48839:7:0;;48835:140;;48863:100;48893:5;48917:3;48939:9;48863:11;:100::i;:::-;48992:17;49006:3;48992:11;:17;:::i;:::-;48985:24;48240:777;-1:-1:-1;;;;;;;;;;48240:777:0:o;19893:211::-;20037:58;;-1:-1:-1;;;;;11670:32:1;;20037:58:0;;;11652:51:1;11719:18;;;11712:34;;;20010:86:0;;20030:5;;-1:-1:-1;;;20060:23:0;11625:18:1;;20037:58:0;;;;-1:-1:-1;;20037:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20037:58:0;-1:-1:-1;;;;;;20037:58:0;;;;;;;;;;20010:19;:86::i;:::-;19893:211;;;:::o;20112:248::-;20283:68;;-1:-1:-1;;;;;11356:15:1;;;20283:68:0;;;11338:34:1;11408:15;;11388:18;;;11381:43;11440:18;;;11433:34;;;20256:96:0;;20276:5;;-1:-1:-1;;;20306:27:0;11273:18:1;;20283:68:0;11098:375:1;20256:96:0;20112:248;;;;:::o;26231:173::-;26287:16;26306:6;;-1:-1:-1;;;;;26323:17:0;;;-1:-1:-1;;;;;;26323:17:0;;;;;;26356:40;;26306:6;;;;;;;26356:40;;26287:16;26356:40;26276:128;26231:173;:::o;35191:3261::-;35551:19;;;-1:-1:-1;;;;;;;;;;;;;;;;35658:20:0;;;:52;;35705:5;35658:52;;;35696:4;35658:52;35636:74;-1:-1:-1;35725:19:0;-1:-1:-1;;;;;;;;;;;;;;;;35802:19:0;;;35798:410;;;35863:10;35850:9;:23;35842:78;;;;-1:-1:-1;;;35842:78:0;;;;;;;:::i;:::-;35939:4;-1:-1:-1;;;;;35939:12:0;;35959:10;35939:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36038:4;36009:35;;36085:4;36063:27;;35798:410;;;-1:-1:-1;36145:4:0;;-1:-1:-1;36182:10:0;35798:410;36325:34;;-1:-1:-1;;;36325:34:0;;36299:23;;-1:-1:-1;;;;;36325:21:0;;;;;:34;;36347:11;;36325:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36299:60;;36374:24;36401:12;-1:-1:-1;;;;;36401:22:0;;36432:4;36401:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36374:64;;36481:219;36516:11;36546:10;36575:12;36606:10;36635:20;36674:11;36481:16;:219::i;:::-;36467:233;-1:-1:-1;36855:28:0;36873:10;36855:15;:28;:::i;:::-;36817:34;;-1:-1:-1;;;36817:34:0;;-1:-1:-1;;;;;36817:21:0;;;;;:34;;36839:11;;36817:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;36809:127;;;;-1:-1:-1;;;36809:127:0;;;;;;;:::i;:::-;37000:30;37019:11;37000:16;:30;:::i;:::-;36959:37;;-1:-1:-1;;;36959:37:0;;-1:-1:-1;;;;;36959:22:0;;;;;:37;;36990:4;;36959:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;36951:137;;;;-1:-1:-1;;;36951:137:0;;;;;;;:::i;:::-;35588:1512;;;;;37164:5;-1:-1:-1;;;;;37149:20:0;-1:-1:-1;;;;;;;;;;;;;;;;37149:20:0;;37145:79;;;37186:26;;-1:-1:-1;;;37186:26:0;;;;;13100:25:1;;;37186:4:0;-1:-1:-1;;;;;37186:13:0;;;;13073:18:1;;37186:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:79;37282:193;37320:4;37339:5;37359:10;37384:11;37410:10;37435:9;37459:5;37282:23;:193::i;:::-;37268:207;;37592:14;37577:11;:29;;37569:84;;;;-1:-1:-1;;;37569:84:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;37668:20:0;;;37664:327;;;37706:12;37724:9;-1:-1:-1;;;;;37724:14:0;37746:11;37724:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37705:57;;;37814:7;37806:69;;;;-1:-1:-1;;;37806:69:0;;;;;;;:::i;:::-;37690:197;37664:327;;;37937:42;-1:-1:-1;;;;;37937:18:0;;37956:9;37967:11;37937:18;:42::i;:::-;38031:10;38056:15;38052:107;;38100:7;;:47;;-1:-1:-1;;;38100:47:0;;-1:-1:-1;;;;;38100:7:0;;;;:13;;:47;;38114:10;;38126:20;;38100:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38088:59;;38052:107;38169:7;;:149;;-1:-1:-1;;;38169:149:0;;-1:-1:-1;;;;;15029:15:1;;;38169:149:0;;;15011:34:1;15081:15;;;15061:18;;;15054:43;15113:18;;;15106:34;;;15156:18;;;15149:34;;;15199:19;;;15192:35;;;38169:7:0;;;;:24;;14945:19:1;;38169:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38398:10;-1:-1:-1;;;;;38336:108:0;38377:5;-1:-1:-1;;;;;38336:108:0;38350:4;-1:-1:-1;;;;;38336:108:0;-1:-1:-1;;;;;;;;;;;38357:10:0;38385:11;38410:9;38426:10;38421:1;:15;;38438:5;38336:108;;;;;;;;;;:::i;:::-;;;;;;;;35577:2875;35191:3261;;;;;;;;;;:::o;40700:1253::-;40984:19;41084:15;40984:19;41110:836;41127:22;;;41110:836;;;41171:26;41221:22;41242:1;41221:11;:22;:::i;:::-;41216:1;:27;41212:265;;;-1:-1:-1;41285:12:0;41212:265;;;41391:3;41377:8;;41386:1;41377:11;;;;;;;:::i;:::-;;;;;;;41359:15;:29;;;;:::i;:::-;:35;;;;:::i;:::-;41338:56;-1:-1:-1;41428:33:0;41338:56;41428:12;:33;:::i;:::-;41413:48;;41212:265;41527:7;;41505:19;;-1:-1:-1;;;;;41527:7:0;:21;41549:11;;41561:1;41549:14;;;;;;;:::i;:::-;;;;;;;41527:37;;;;;;;;;;;;;13100:25:1;;13088:2;13073:18;;12954:177;41527:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41759:7;;:42;;-1:-1:-1;;;41759:42:0;;;;;13100:25:1;;;41505:59:0;;-1:-1:-1;41624:296:0;;41663:4;;41690:18;;41731:5;;-1:-1:-1;;;;;41759:7:0;;:29;;13073:18:1;;41759:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41759:42:0;;;;;;;;;;;;:::i;:::-;41824:7;;:42;;-1:-1:-1;;;41824:42:0;;;;;13100:25:1;;;-1:-1:-1;;;;;41824:7:0;;;;:29;;13073:18:1;;41824:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41824:42:0;;;;;;;;;;;;:::i;:::-;41889:12;41624:16;:296::i;:::-;41593:327;;:11;:327;:::i;:::-;41579:341;;41156:790;;41151:3;;;;;:::i;:::-;;;;41110:836;;;;41020:933;40700:1253;;;;;;;;;;:::o;49029:474::-;-1:-1:-1;;;;;;;;;;;;;;;;49171:21:0;;;49167:277;;;49210:12;49236:10;-1:-1:-1;;;;;49228:24:0;49260:4;49228:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49209:60;;;49321:7;49313:49;;;;-1:-1:-1;;;49313:49:0;;20187:2:1;49313:49:0;;;20169:21:1;20226:2;20206:18;;;20199:30;20265:31;20245:18;;;20238:59;20314:18;;49313:49:0;19985:353:1;49313:49:0;49194:180;49167:277;;;49395:37;-1:-1:-1;;;;;49395:19:0;;49415:10;49427:4;49395:19;:37::i;:::-;49478:10;-1:-1:-1;;;;;49459:36:0;49470:6;-1:-1:-1;;;;;49459:36:0;;49490:4;49459:36;;;;13100:25:1;;13088:2;13073:18;;12954:177;49459:36:0;;;;;;;;49029:474;;;:::o;22466:716::-;22890:23;22916:69;22944:4;22916:69;;;;;;;;;;;;;;;;;22924:5;-1:-1:-1;;;;;22916:27:0;;;:69;;;;;:::i;:::-;23000:17;;22890:95;;-1:-1:-1;23000:21:0;22996:179;;23097:10;23086:30;;;;;;;;;;;;:::i;:::-;23078:85;;;;-1:-1:-1;;;23078:85:0;;20903:2:1;23078:85:0;;;20885:21:1;20942:2;20922:18;;;20915:30;20981:34;20961:18;;;20954:62;-1:-1:-1;;;21032:18:1;;;21025:40;21082:19;;23078:85:0;20701:406:1;33255:1421:0;33671:17;;33629:10;;33535:19;;;;;33699:970;33720:10;33716:1;:14;33699:970;;;33758:6;;:43;;33774:20;33795:5;33799:1;33795;:5;:::i;:::-;33774:27;;;;;;;;:::i;:::-;;;;;;;33758:43;;;33767:4;33758:43;33752:49;-1:-1:-1;33828:14:0;33841:1;33828:10;:14;:::i;:::-;33823:1;:19;:53;;33853:20;33874:1;33853:23;;;;;;;;:::i;:::-;;;;;;;33823:53;;;33845:5;33823:53;33816:60;;33905:18;33926:10;33937:1;33926:13;;;;;;;;:::i;:::-;;;;;;;33905:34;;33954:19;33976:1;33981;33976:6;:66;;34000:42;33976:66;;;33985:12;33976:66;33954:88;-1:-1:-1;34057:17:0;34166:14;34179:1;34166:10;:14;:::i;:::-;34161:1;:19;34157:392;;;-1:-1:-1;34221:4:0;34157:392;;;34302:17;;34267:32;;-1:-1:-1;;;;;34302:17:0;:31;34334:10;34345:5;:1;34302:17;34345:5;:::i;:::-;34334:17;;;;;;;;:::i;:::-;;;;;;;34302:50;;;;;;;;;;;;;13100:25:1;;13088:2;13073:18;;12954:177;34302:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34302:50:0;;;;;;;;;;;;:::i;:::-;:56;;;;-1:-1:-1;34377:15:0;34404:14;34417:1;34404:10;:14;:::i;:::-;34395:5;:1;34399;34395:5;:::i;:::-;:23;:61;;34429:20;34450:5;:1;34454;34450:5;:::i;:::-;34429:27;;;;;;;;:::i;:::-;;;;;;;34395:61;;;34421:5;34395:61;34487:46;;-1:-1:-1;;;34487:46:0;;34377:79;;-1:-1:-1;;;;;;34487:30:0;;;;;:46;;34518:4;;34377:79;;34487:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:58;;34248:301;;34157:392;34579:78;34598:10;34610:3;34615:11;34628:4;34634:11;34647:9;34579:18;:78::i;:::-;34565:92;;33737:932;;;33732:3;;;;;:::i;:::-;;;;33699:970;;;;33561:1115;;;33255:1421;;;;;;;;:::o;12013:229::-;12150:12;12182:52;12204:6;12212:4;12218:1;12221:12;12182:21;:52::i;:::-;12175:59;;12013:229;;;;;;:::o;32264:979::-;32589:17;;:50;;-1:-1:-1;;;32589:50:0;;;;;13100:25:1;;;32498:7:0;;;;-1:-1:-1;;;;;32589:17:0;;;;:31;;13073:18:1;;32589:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32589:50:0;;;;;;;;;;;;:::i;:::-;:56;;;32554:91;;32696:22;32721:12;-1:-1:-1;;;;;32721:30:0;;32752:3;32757:4;32721:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32696:66;-1:-1:-1;;;;;;32777:28:0;;32800:4;32777:28;32773:260;;;32822:43;-1:-1:-1;;;;;32822:16:0;;32839:14;32855:9;32822:16;:43::i;:::-;32773:260;;;-1:-1:-1;;;;;32887:57:0;;;32883:150;;32961:60;-1:-1:-1;;;;;32961:20:0;;32982:11;32995:14;33011:9;32961:20;:60::i;:::-;33093:114;;-1:-1:-1;;;33093:114:0;;-1:-1:-1;;;;;13788:15:1;;;33093:114:0;;;13770:34:1;13840:15;;;13820:18;;;13813:43;13872:18;;;13865:34;;;13935:15;;;13915:18;;;13908:43;33072:18:0;;33093;;;;;;13704:19:1;;33093:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13133:511::-;13303:12;13361:5;13336:21;:30;;13328:81;;;;-1:-1:-1;;;13328:81:0;;18168:2:1;13328:81:0;;;18150:21:1;18207:2;18187:18;;;18180:30;18246:34;18226:18;;;18219:62;-1:-1:-1;;;18297:18:1;;;18290:36;18343:19;;13328:81:0;17966:402:1;13328:81:0;9530:20;;13420:60;;;;-1:-1:-1;;;13420:60:0;;20545:2:1;13420:60:0;;;20527:21:1;20584:2;20564:18;;;20557:30;20623:31;20603:18;;;20596:59;20672:18;;13420:60:0;20343:353:1;13420:60:0;13494:12;13508:23;13535:6;-1:-1:-1;;;;;13535:11:0;13554:5;13561:4;13535:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13493:73;;;;13584:52;13602:7;13611:10;13623:12;13584:17;:52::i;:::-;13577:59;13133:511;-1:-1:-1;;;;;;;13133:511:0:o;15602:712::-;15752:12;15781:7;15777:530;;;-1:-1:-1;15812:10:0;15805:17;;15777:530;15926:17;;:21;15922:374;;16124:10;16118:17;16185:15;16172:10;16168:2;16164:19;16157:44;15922:374;16267:12;16260:20;;-1:-1:-1;;;16260:20:0;;;;;;;;:::i;14:375:1:-;85:8;95:6;149:3;142:4;134:6;130:17;126:27;116:55;;167:1;164;157:12;116:55;-1:-1:-1;190:20:1;;-1:-1:-1;;;;;222:30:1;;219:50;;;265:1;262;255:12;219:50;302:4;294:6;290:17;278:29;;362:3;355:4;345:6;342:1;338:14;330:6;326:27;322:38;319:47;316:67;;;379:1;376;369:12;316:67;14:375;;;;;:::o;394:164::-;470:13;;519;;512:21;502:32;;492:60;;548:1;545;538:12;492:60;394:164;;;:::o;563:159::-;663:13;;685:31;663:13;685:31;:::i;727:247::-;786:6;839:2;827:9;818:7;814:23;810:32;807:52;;;855:1;852;845:12;807:52;894:9;881:23;913:31;938:5;913:31;:::i;979:251::-;1049:6;1102:2;1090:9;1081:7;1077:23;1073:32;1070:52;;;1118:1;1115;1108:12;1070:52;1150:9;1144:16;1169:31;1194:5;1169:31;:::i;1235:989::-;1344:6;1375:2;1418;1406:9;1397:7;1393:23;1389:32;1386:52;;;1434:1;1431;1424:12;1386:52;1461:16;;-1:-1:-1;;;;;1489:30:1;;1486:50;;;1532:1;1529;1522:12;1486:50;1555:22;;1608:4;1600:13;;1596:27;-1:-1:-1;1586:55:1;;1637:1;1634;1627:12;1586:55;1666:2;1660:9;1689:68;1705:51;1753:2;1705:51;:::i;:::-;1689:68;:::i;:::-;1779:3;1803:2;1798:3;1791:15;1831:2;1826:3;1822:12;1815:19;;1862:2;1858;1854:11;1910:7;1905:2;1899;1896:1;1892:10;1888:2;1884:19;1880:28;1877:41;1874:61;;;1931:1;1928;1921:12;1874:61;1953:1;1944:10;;1963:231;1977:2;1974:1;1971:9;1963:231;;;2041:3;2035:10;2058:31;2083:5;2058:31;:::i;:::-;2102:18;;1995:1;1988:9;;;;;2140:12;;;;2172;;1963:231;;;-1:-1:-1;2213:5:1;1235:989;-1:-1:-1;;;;;;;1235:989:1:o;2229:1374::-;2424:6;2432;2440;2448;2456;2464;2472;2480;2488;2541:3;2529:9;2520:7;2516:23;2512:33;2509:53;;;2558:1;2555;2548:12;2509:53;2585:23;;-1:-1:-1;;;;;2657:14:1;;;2654:34;;;2684:1;2681;2674:12;2654:34;2723:78;2793:7;2784:6;2773:9;2769:22;2723:78;:::i;:::-;2820:8;;-1:-1:-1;2697:104:1;-1:-1:-1;2908:2:1;2893:18;;2880:32;;-1:-1:-1;2924:16:1;;;2921:36;;;2953:1;2950;2943:12;2921:36;;2992:80;3064:7;3053:8;3042:9;3038:24;2992:80;:::i;:::-;3091:8;;-1:-1:-1;2966:106:1;-1:-1:-1;;3176:2:1;3161:18;;3148:32;3189:31;3148:32;3189:31;:::i;:::-;3239:5;-1:-1:-1;3291:2:1;3276:18;;3263:32;;-1:-1:-1;3347:3:1;3332:19;;3319:33;3361;3319;3361;:::i;:::-;3413:7;-1:-1:-1;3467:3:1;3452:19;;3439:33;;-1:-1:-1;3524:3:1;3509:19;;3496:33;3538;3496;3538;:::i;:::-;3590:7;3580:17;;;2229:1374;;;;;;;;;;;:::o;3608:900::-;3703:6;3734:2;3777;3765:9;3756:7;3752:23;3748:32;3745:52;;;3793:1;3790;3783:12;3745:52;3820:16;;-1:-1:-1;;;;;3848:30:1;;3845:50;;;3891:1;3888;3881:12;3845:50;3914:22;;3967:4;3959:13;;3955:27;-1:-1:-1;3945:55:1;;3996:1;3993;3986:12;3945:55;4025:2;4019:9;4048:68;4064:51;4112:2;4064:51;:::i;4048:68::-;4138:3;4162:2;4157:3;4150:15;4190:2;4185:3;4181:12;4174:19;;4221:2;4217;4213:11;4269:7;4264:2;4258;4255:1;4251:10;4247:2;4243:19;4239:28;4236:41;4233:61;;;4290:1;4287;4280:12;4233:61;4312:1;4303:10;;4322:156;4336:2;4333:1;4330:9;4322:156;;;4393:10;;4381:23;;4354:1;4347:9;;;;;4424:12;;;;4456;;4322:156;;4513:202;4580:6;4633:2;4621:9;4612:7;4608:23;4604:32;4601:52;;;4649:1;4646;4639:12;4601:52;4672:37;4699:9;4672:37;:::i;4720:184::-;4790:6;4843:2;4831:9;4822:7;4818:23;4814:32;4811:52;;;4859:1;4856;4849:12;4811:52;-1:-1:-1;4882:16:1;;4720:184;-1:-1:-1;4720:184:1:o;4909:329::-;4991:6;4999;5052:2;5040:9;5031:7;5027:23;5023:32;5020:52;;;5068:1;5065;5058:12;5020:52;5107:9;5094:23;5126:31;5151:5;5126:31;:::i;:::-;5176:5;5228:2;5213:18;;;;5200:32;;-1:-1:-1;;;4909:329:1:o;5243:1388::-;5452:6;5460;5468;5476;5484;5492;5500;5508;5516;5569:3;5557:9;5548:7;5544:23;5540:33;5537:53;;;5586:1;5583;5576:12;5537:53;5625:9;5612:23;5644:31;5669:5;5644:31;:::i;:::-;5694:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;;-1:-1:-1;5802:2:1;5787:18;;5774:32;5815:33;5774:32;5815:33;:::i;:::-;5867:7;-1:-1:-1;5921:2:1;5906:18;;5893:32;;-1:-1:-1;5976:3:1;5961:19;;5948:33;-1:-1:-1;;;;;6030:14:1;;;6027:34;;;6057:1;6054;6047:12;6027:34;6096:78;6166:7;6157:6;6146:9;6142:22;6096:78;:::i;:::-;6193:8;;-1:-1:-1;6070:104:1;-1:-1:-1;6281:3:1;6266:19;;6253:33;;-1:-1:-1;6298:16:1;;;6295:36;;;6327:1;6324;6317:12;6295:36;;6366:80;6438:7;6427:8;6416:9;6412:24;6366:80;:::i;:::-;6465:8;;-1:-1:-1;6340:106:1;-1:-1:-1;;6552:3:1;6537:19;;6524:33;6566;6524;6566;:::i;6636:764::-;6768:6;6776;6784;6792;6800;6808;6861:3;6849:9;6840:7;6836:23;6832:33;6829:53;;;6878:1;6875;6868:12;6829:53;6917:9;6904:23;6936:31;6961:5;6936:31;:::i;:::-;6986:5;-1:-1:-1;7038:2:1;7023:18;;7010:32;;-1:-1:-1;7094:2:1;7079:18;;7066:32;7107:33;7066:32;7107:33;:::i;:::-;7159:7;-1:-1:-1;7213:2:1;7198:18;;7185:32;;-1:-1:-1;7264:3:1;7249:19;;7236:33;;-1:-1:-1;7321:3:1;7306:19;;7293:33;7335;7293;7335;:::i;:::-;7387:7;7377:17;;;6636:764;;;;;;;;:::o;8234:1151::-;8326:6;8357:2;8400;8388:9;8379:7;8375:23;8371:32;8368:52;;;8416:1;8413;8406:12;8368:52;8443:16;;-1:-1:-1;;;;;8508:14:1;;;8505:34;;;8535:1;8532;8525:12;8505:34;8558:22;;;;8614:4;8596:16;;;8592:27;8589:47;;;8632:1;8629;8622:12;8589:47;8658:22;;:::i;:::-;8711:2;8705:9;8739:2;8729:8;8726:16;8723:36;;;8755:1;8752;8745:12;8723:36;8778:17;;8826:4;8818:13;;8814:27;-1:-1:-1;8804:55:1;;8855:1;8852;8845:12;8804:55;8884:2;8878:9;8906:2;8902;8899:10;8896:36;;;8912:18;;:::i;:::-;8954:53;8997:2;8978:13;;-1:-1:-1;;8974:27:1;8970:36;;8954:53;:::i;:::-;8941:66;;9030:2;9023:5;9016:17;9070:7;9065:2;9060;9056;9052:11;9048:20;9045:33;9042:53;;;9091:1;9088;9081:12;9042:53;9104:54;9155:2;9150;9143:5;9139:14;9134:2;9130;9126:11;9104:54;:::i;:::-;;;9181:5;9174;9167:20;9219:39;9254:2;9250;9246:11;9219:39;:::i;:::-;9214:2;9207:5;9203:14;9196:63;9291;9350:2;9346;9342:11;9291:63;:::i;:::-;9286:2;9275:14;;9268:87;9279:5;8234:1151;-1:-1:-1;;;;;;8234:1151:1:o;9390:180::-;9449:6;9502:2;9490:9;9481:7;9477:23;9473:32;9470:52;;;9518:1;9515;9508:12;9470:52;-1:-1:-1;9541:23:1;;9390:180;-1:-1:-1;9390:180:1:o;9764:315::-;9832:6;9840;9893:2;9881:9;9872:7;9868:23;9864:32;9861:52;;;9909:1;9906;9899:12;9861:52;9945:9;9932:23;9922:33;;10005:2;9994:9;9990:18;9977:32;10018:31;10043:5;10018:31;:::i;:::-;10068:5;10058:15;;;9764:315;;;;;:::o;10084:312::-;10163:6;10171;10224:2;10212:9;10203:7;10199:23;10195:32;10192:52;;;10240:1;10237;10230:12;10192:52;10269:9;10263:16;10253:26;;10322:2;10311:9;10307:18;10301:25;10335:31;10360:5;10335:31;:::i;10401:274::-;10530:3;10568:6;10562:13;10584:53;10630:6;10625:3;10618:4;10610:6;10606:17;10584:53;:::i;:::-;10653:16;;;;;10401:274;-1:-1:-1;;10401:274:1:o;10890:203::-;-1:-1:-1;;;;;11054:32:1;;;;11036:51;;11024:2;11009:18;;10890:203::o;11757:1192::-;12039:2;12051:21;;;12121:13;;12024:18;;;12143:22;;;11991:4;;12218;;12196:2;12181:18;;;12245:15;;;11991:4;12288:169;12302:6;12299:1;12296:13;12288:169;;;12363:13;;12351:26;;12397:12;;;;12432:15;;;;12324:1;12317:9;12288:169;;;-1:-1:-1;;;12493:19:1;;;12473:18;;;12466:47;12563:13;;12585:21;;;12661:15;;;;12624:12;;;12696:1;12706:215;12722:8;12717:3;12714:17;12706:215;;;12795:15;;-1:-1:-1;;;;;12791:41:1;12777:56;;12894:17;;;;12855:14;;;;12829:1;12741:11;12706:215;;;-1:-1:-1;12938:5:1;;11757:1192;-1:-1:-1;;;;;;;11757:1192:1:o;13136:332::-;-1:-1:-1;;;;;13394:15:1;;;13376:34;;13446:15;;13441:2;13426:18;;13419:43;13326:2;13311:18;;13136:332::o;15935:383::-;16084:2;16073:9;16066:21;16047:4;16116:6;16110:13;16159:6;16154:2;16143:9;16139:18;16132:34;16175:66;16234:6;16229:2;16218:9;16214:18;16209:2;16201:6;16197:15;16175:66;:::i;:::-;16302:2;16281:15;-1:-1:-1;;16277:29:1;16262:45;;;;16309:2;16258:54;;15935:383;-1:-1:-1;;15935:383:1:o;16323:406::-;16525:2;16507:21;;;16564:2;16544:18;;;16537:30;16603:34;16598:2;16583:18;;16576:62;-1:-1:-1;;;16669:2:1;16654:18;;16647:40;16719:3;16704:19;;16323:406::o;17142:412::-;17344:2;17326:21;;;17383:2;17363:18;;;17356:30;17422:34;17417:2;17402:18;;17395:62;-1:-1:-1;;;17488:2:1;17473:18;;17466:46;17544:3;17529:19;;17142:412::o;18795:413::-;18997:2;18979:21;;;19036:2;19016:18;;;19009:30;19075:34;19070:2;19055:18;;19048:62;-1:-1:-1;;;19141:2:1;19126:18;;19119:47;19198:3;19183:19;;18795:413::o;19213:406::-;19415:2;19397:21;;;19454:2;19434:18;;;19427:30;19493:34;19488:2;19473:18;;19466:62;-1:-1:-1;;;19559:2:1;19544:18;;19537:40;19609:3;19594:19;;19213:406::o;19624:356::-;19826:2;19808:21;;;19845:18;;;19838:30;19904:34;19899:2;19884:18;;19877:62;19971:2;19956:18;;19624:356::o;21112:417::-;21314:2;21296:21;;;21353:2;21333:18;;;21326:30;21392:34;21387:2;21372:18;;21365:62;-1:-1:-1;;;21458:2:1;21443:18;;21436:51;21519:3;21504:19;;21112:417::o;21534:355::-;21736:2;21718:21;;;21775:2;21755:18;;;21748:30;21814:33;21809:2;21794:18;;21787:61;21880:2;21865:18;;21534:355::o;22076:509::-;22323:25;;;22379:2;22364:18;;22357:34;;;;-1:-1:-1;;;;;22427:32:1;;;;22422:2;22407:18;;22400:60;22503:14;22496:22;22491:2;22476:18;;22469:50;22563:14;22556:22;22550:3;22535:19;;22528:51;22310:3;22295:19;;22076:509::o;22590:253::-;22662:2;22656:9;22704:4;22692:17;;-1:-1:-1;;;;;22724:34:1;;22760:22;;;22721:62;22718:88;;;22786:18;;:::i;:::-;22822:2;22815:22;22590:253;:::o;22848:275::-;22919:2;22913:9;22984:2;22965:13;;-1:-1:-1;;22961:27:1;22949:40;;-1:-1:-1;;;;;23004:34:1;;23040:22;;;23001:62;22998:88;;;23066:18;;:::i;:::-;23102:2;23095:22;22848:275;;-1:-1:-1;22848:275:1:o;23128:191::-;23196:4;-1:-1:-1;;;;;23218:30:1;;23215:56;;;23251:18;;:::i;:::-;-1:-1:-1;23296:1:1;23292:14;23308:4;23288:25;;23128:191::o;23324:128::-;23364:3;23395:1;23391:6;23388:1;23385:13;23382:39;;;23401:18;;:::i;:::-;-1:-1:-1;23437:9:1;;23324:128::o;23457:217::-;23497:1;23523;23513:132;;23567:10;23562:3;23558:20;23555:1;23548:31;23602:4;23599:1;23592:15;23630:4;23627:1;23620:15;23513:132;-1:-1:-1;23659:9:1;;23457:217::o;23679:168::-;23719:7;23785:1;23781;23777:6;23773:14;23770:1;23767:21;23762:1;23755:9;23748:17;23744:45;23741:71;;;23792:18;;:::i;:::-;-1:-1:-1;23832:9:1;;23679:168::o;23852:125::-;23892:4;23920:1;23917;23914:8;23911:34;;;23925:18;;:::i;:::-;-1:-1:-1;23962:9:1;;23852:125::o;23982:258::-;24054:1;24064:113;24078:6;24075:1;24072:13;24064:113;;;24154:11;;;24148:18;24135:11;;;24128:39;24100:2;24093:10;24064:113;;;24195:6;24192:1;24189:13;24186:48;;;-1:-1:-1;;24230:1:1;24212:16;;24205:27;23982:258::o;24245:135::-;24284:3;-1:-1:-1;;24305:17:1;;24302:43;;;24325:18;;:::i;:::-;-1:-1:-1;24372:1:1;24361:13;;24245:135::o;24385:127::-;24446:10;24441:3;24437:20;24434:1;24427:31;24477:4;24474:1;24467:15;24501:4;24498:1;24491:15;24517:127;24578:10;24573:3;24569:20;24566:1;24559:31;24609:4;24606:1;24599:15;24633:4;24630:1;24623:15;24649:127;24710:10;24705:3;24701:20;24698:1;24691:31;24741:4;24738:1;24731:15;24765:4;24762:1;24755:15;24781:131;-1:-1:-1;;;;;24856:31:1;;24846:42;;24836:70;;24902:1;24899;24892:12

Metadata Hash

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