Contract 0xa222e6a71D1A1Dd5F279805fbe38d5329C1d0e70 3

 

Contract Overview

DODO: Proxy 02 V2
Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x81f55e0e21c7d87b97012aad4c34a7adfa278ab0da3cfc56f73bf43f0fa1397cDodo Swap V2Toke...361066812022-11-26 21:53:551 min ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.005311230174 33.465000152
0xc2bd3e76adcb8590c0841a3a007427790e48631636e489d1b6126d9a57a449f5Dodo Swap V2Toke...361065342022-11-26 21:47:217 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004876950002 30.000000015
0x0235a89ecbbbd19e21d378416ff32afc7544c094ab23cee72c09689c853a3077External Swap361064122022-11-26 21:43:0911 mins ago0xa15c6d9f9cbeff94e9c8e7bcc9204b4a228d17ac IN  DODO: Proxy 02 V20 MATIC0.005519508874 31.976576662
0x4e9d71a4ec54da436f73bbf12887e402be8529b167351c144b3d5a333a932040External Swap361063862022-11-26 21:42:1712 mins ago0x92fa38a6c2a1acfe489233d39e99ee1f8ab931c0 IN  DODO: Proxy 02 V20 MATIC0.005712309825 33.175228099
0xfe6c8904c55e238e2efe42aaba2356a6805a4f6edb248e0c18b56488d27b9b57External Swap361063652022-11-26 21:41:3113 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  DODO: Proxy 02 V20 MATIC0.00800873458 34.618593167
0x8c60991800dde1b1a6c9833eff4c141aefb793b938cd91b6aa661867d5947973Dodo Swap V2Toke...361063412022-11-26 21:40:4314 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.005769032783 36.349522926
0x1aa705c7dc85fc93b012d0b71c89cee8d59b2c40f7d9b4e62a2ce908a808f686External Swap361063012022-11-26 21:39:1915 mins ago0xa15c6d9f9cbeff94e9c8e7bcc9204b4a228d17ac IN  DODO: Proxy 02 V20 MATIC0.010740657105 41.644173877
0x80b5890f226559755ae289bac9124b532d6d166cf5736d8254d282a0f94949d4External Swap361060622022-11-26 21:31:0923 mins ago0xfbacb875b5e1d22f8afd366815c647070bbc6f5c IN  DODO: Proxy 02 V20 MATIC0.006022230902 30.985248371
0xf34e22b8a484b4ed5518ec7249ac548ffed18ce2051530bdf1b5f0f226e72097Dodo Swap V2Toke...361059712022-11-26 21:27:3527 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.005085481562 31.282758049
0x017eee3a45cbcdc34b5f9d5cf782806fe48885d078b156319932ced61921ff63External Swap361059272022-11-26 21:24:3930 mins ago0xbd9dff9a86fda1230d1c44fff811791bad16b48a IN  DODO: Proxy 02 V20 MATIC0.01738796400933.000000018
0xa6f8a47933ef200187ec49f9ae7c60978d8a4fcc4a340e7af540a74ddb7b7ee4External Swap361058472022-11-26 21:21:3533 mins ago0x55c9404a661cd315be80ec2b58de24c2bc54d0cd IN  DODO: Proxy 02 V20 MATIC0.013352610007 30.000000016
0xef9a99d75d6853d9a9f40d7c00dc16aa931aecce126b3cf17c78a31d67d3de5dExternal Swap361058412022-11-26 21:21:2333 mins ago0x6fb3af602bbdc75c03d1c5a442e2637615cc9b4f IN  DODO: Proxy 02 V254.186460190823629 MATIC0.004616040002 30.000000016
0xb0e914f9db70ef790f498f69b7ed52f783c9f46d14ec4bd79885482834cbc627Dodo Swap V2Toke...361058282022-11-26 21:20:5734 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004761300002 30.000000014
0xd6c0346a927c250e3bca2a38edff0c91097a853b04f88741492443c8ece96033External Swap361057762022-11-26 21:19:0935 mins ago0x6fb3af602bbdc75c03d1c5a442e2637615cc9b4f IN  DODO: Proxy 02 V20 MATIC0.022987530012 30.000000016
0x2b72eda5d7029db02d1369ba926b51d268787a48c68b1e1c9b69af737076fec9Dodo Swap V2Toke...361056372022-11-26 21:14:2340 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004955820038 30.485160016
0xc4484c0151b7e4ea803c98b319eb4947fec2b263f3a217e7f0763cf39b0c2f59Dodo Swap V2Toke...361054432022-11-26 21:07:4347 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004761300002 30.000000016
0x288448897e07547cb60a3b13ec679bd02629d13c3a80f136e4cfce7909d5180aExternal Swap361052942022-11-26 21:02:3752 mins ago0x92fa38a6c2a1acfe489233d39e99ee1f8ab931c0 IN  DODO: Proxy 02 V250 MATIC0.0324426 200
0xf5652713db46a98ea49574a3a24ffa0fd2a85fd8041a8b1dbe62e714d64b19f7Dodo Swap V2Toke...361052532022-11-26 21:01:1153 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004876950002 30.000000016
0xbb5b7f76426a0da183e7fa46a1b618674e91c85486fd4973d161b907a065b745External Swap361051912022-11-26 20:59:0356 mins ago0xdbda8be6760a81cd87fa3a9ded5585641b7cb77c IN  DODO: Proxy 02 V20 MATIC0.009227880007 30.000000023
0xca837f51cf5fbb3f7dc67dfa4952ccbe9ce249cc8ec12807d536a6c818afe993External Swap361051692022-11-26 20:58:1956 mins ago0xdbda8be6760a81cd87fa3a9ded5585641b7cb77c IN  DODO: Proxy 02 V20 MATIC0.011527980008 30.000000023
0x9f2627560579326990131b8d393eb52b9ab01abb3866982b62d77db8b42326e8Dodo Swap V2Toke...361050592022-11-26 20:54:311 hr ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004761300003 30.000000021
0x324e7cc98e6e303e338187c2ab318d077216ff1df141b054196beb12e328765bDodo Swap V2Toke...361046742022-11-26 20:41:171 hr 13 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004876950003 30.000000021
0x5c7a2091439f0c825756a05e2e3663dbc76c0b836ba8f9ae46b0a5a14b7fc8c4Dodo Swap V2Toke...361044802022-11-26 20:34:371 hr 20 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004761300004 30.00000003
0xd3ccb7fb242fb3c39574be187f65fd12d3c521162fdf33eb1bfa455ec8b1a999Dodo Swap V2Toke...361042902022-11-26 20:28:051 hr 26 mins ago0xa5f008eccc16d5e1337edfaa0a32f9786b6e6040 IN  DODO: Proxy 02 V20 MATIC0.004876950002 30.000000016
0x943458c361af6637ad0c1d37bb734fb8b0d21e36dd09287cd2ac087406591200Dodo Swap V2Toke...361042692022-11-26 20:27:231 hr 27 mins ago0x351564f30d7ae78c5a0aaa5c64c6aa9a6b83fb2a IN  DODO: Proxy 02 V20 MATIC0.005692710002 30.000000015
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0235a89ecbbbd19e21d378416ff32afc7544c094ab23cee72c09689c853a3077361064122022-11-26 21:43:0911 mins ago DODO: Proxy 02 V20xa15c6d9f9cbeff94e9c8e7bcc9204b4a228d17ac14.047444057577524598 MATIC
0x0235a89ecbbbd19e21d378416ff32afc7544c094ab23cee72c09689c853a3077361064122022-11-26 21:43:0911 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V214.047444057577524598 MATIC
0x4e9d71a4ec54da436f73bbf12887e402be8529b167351c144b3d5a333a932040361063862022-11-26 21:42:1712 mins ago DODO: Proxy 02 V20x92fa38a6c2a1acfe489233d39e99ee1f8ab931c050.675588045117864959 MATIC
0x4e9d71a4ec54da436f73bbf12887e402be8529b167351c144b3d5a333a932040361063862022-11-26 21:42:1712 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V250.675588045117864959 MATIC
0xf6c13e93fcde5af6e382b83ba30e12bef4d17f43758fff0f76c3e706a7c156a3361059412022-11-26 21:25:3529 mins ago DODO: Proxy 02 V2 Paraswap v5: Augustus Swapper4.673913624870167182 MATIC
0xf6c13e93fcde5af6e382b83ba30e12bef4d17f43758fff0f76c3e706a7c156a3361059412022-11-26 21:25:3529 mins ago Polygon: WMATIC Token DODO: Proxy 02 V24.673913624870167182 MATIC
0xef9a99d75d6853d9a9f40d7c00dc16aa931aecce126b3cf17c78a31d67d3de5d361058412022-11-26 21:21:2333 mins ago DODO: Proxy 02 V2 0x1111111254eeb25477b68fb85ed929f73a96058254.186460190823629518 MATIC
0xd6c0346a927c250e3bca2a38edff0c91097a853b04f88741492443c8ece96033361057762022-11-26 21:19:0935 mins ago DODO: Proxy 02 V20x6fb3af602bbdc75c03d1c5a442e2637615cc9b4f38.51338472989764227 MATIC
0xd6c0346a927c250e3bca2a38edff0c91097a853b04f88741492443c8ece96033361057762022-11-26 21:19:0935 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V238.51338472989764227 MATIC
0xfb4ccb372835cae711cc415d103d96fcddbde8098aba38fc6620ca3eb3ada7ed361053192022-11-26 21:03:2751 mins ago DODO: Proxy 02 V2 Polygon: WMATIC Token930.711672 MATIC
0xfb4ccb372835cae711cc415d103d96fcddbde8098aba38fc6620ca3eb3ada7ed361053192022-11-26 21:03:2751 mins ago Paraswap v5: Augustus Swapper DODO: Proxy 02 V2930.711672 MATIC
0x288448897e07547cb60a3b13ec679bd02629d13c3a80f136e4cfce7909d5180a361052942022-11-26 21:02:3752 mins ago DODO: Proxy 02 V2 0x1111111254eeb25477b68fb85ed929f73a96058250 MATIC
0x3e6d17d3f31923ad3064ab5c4caefd4d29635d94cdafaf518beebd6ed2449dd3361039622022-11-26 20:16:491 hr 38 mins ago DODO: Proxy 02 V20x8ffaaccacafaf283fa2958f8826088e3b4f544041.812295495430800586 MATIC
0x3e6d17d3f31923ad3064ab5c4caefd4d29635d94cdafaf518beebd6ed2449dd3361039622022-11-26 20:16:491 hr 38 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V21.812295495430800586 MATIC
0x87e84e599eda945fb67fa43c17de16039aae5341d7e623ace7fe1365213b54c0361037252022-11-26 20:08:391 hr 46 mins ago DODO: Proxy 02 V20xf7a3dde6483861503b98c501057318ef8a0f66ee10.691941224107030448 MATIC
0x87e84e599eda945fb67fa43c17de16039aae5341d7e623ace7fe1365213b54c0361037252022-11-26 20:08:391 hr 46 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V210.691941224107030448 MATIC
0xd33be090981c6e995598d544e67aaf8286b5ba667511d95bc2c28c4ecdb65307361037022022-11-26 20:07:531 hr 47 mins ago DODO: Proxy 02 V2 Polygon: WMATIC Token332.06875 MATIC
0xd33be090981c6e995598d544e67aaf8286b5ba667511d95bc2c28c4ecdb65307361037022022-11-26 20:07:531 hr 47 mins ago Paraswap v5: Augustus Swapper DODO: Proxy 02 V2332.06875 MATIC
0x1f7787c0e153c6233c571206173c6c6f18fc4d46cccd1e97467c1ea200911f4b361034682022-11-26 19:59:491 hr 55 mins ago DODO: Proxy 02 V20x92fa38a6c2a1acfe489233d39e99ee1f8ab931c020.053427466534722253 MATIC
0x1f7787c0e153c6233c571206173c6c6f18fc4d46cccd1e97467c1ea200911f4b361034682022-11-26 19:59:491 hr 55 mins ago 0x1111111254eeb25477b68fb85ed929f73a960582 DODO: Proxy 02 V220.053427466534722253 MATIC
0x3630f10cdcf2a55f56f4081c98eb35624ab05b53bda02b13135de35f61507598361033472022-11-26 19:55:391 hr 59 mins ago DODO: Proxy 02 V2 Polygon: WMATIC Token590.369686056350770993 MATIC
0x3630f10cdcf2a55f56f4081c98eb35624ab05b53bda02b13135de35f61507598361033472022-11-26 19:55:391 hr 59 mins ago Paraswap v5: Augustus Swapper DODO: Proxy 02 V2590.369686056350770993 MATIC
0x58927224feee1a4fa6c78f3513325d818f087ff78f02768a845394cf469b0b63361032442022-11-26 19:52:092 hrs 2 mins ago DODO: Proxy 02 V2 0x1111111254eeb25477b68fb85ed929f73a96058220 MATIC
0x3af7a801e457ac57d3a52d9a4e943d010cbe0cc3ef3b44bdff471e3ea866fd39361030302022-11-26 19:44:452 hrs 10 mins ago DODO: Proxy 02 V2 Polygon: WMATIC Token730.36 MATIC
0x3af7a801e457ac57d3a52d9a4e943d010cbe0cc3ef3b44bdff471e3ea866fd39361030302022-11-26 19:44:452 hrs 10 mins ago Paraswap v5: Augustus Swapper DODO: Proxy 02 V2730.36 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DODOV2Proxy02

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-11
*/

// File: contracts/SmartRoute/intf/IDODOV2Proxy01.sol

/*

    Copyright 2020 DODO ZOO.
    SPDX-License-Identifier: Apache-2.0

*/

pragma solidity 0.6.9;


interface IDODOV2Proxy01 {
    function dodoSwapV2ETHToToken(
        address toToken,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

    function dodoSwapV2TokenToETH(
        address fromToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 returnAmount);

    function dodoSwapV2TokenToToken(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 returnAmount);

    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP,
        uint256 deadLine
    ) external payable returns (address newVendingMachine, uint256 shares);

    function addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 baseMinAmount,
        uint256 quoteMinAmount,
        uint8 flag, //  0 - ERC20, 1 - baseInETH, 2 - quoteInETH
        uint256 deadLine
    )
        external
        payable
        returns (
            uint256 shares,
            uint256 baseAdjustedInAmount,
            uint256 quoteAdjustedInAmount
        );

    function createDODOPrivatePool(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTwap,
        uint256 deadLine
    ) external payable returns (address newPrivatePool);

    function resetDODOPrivatePool(
        address dppAddress,
        uint256[] memory paramList,  //0 - newLpFeeRate, 1 - newI, 2 - newK
        uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3 - quoteOutAmount
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
        uint256 minBaseReserve,
        uint256 minQuoteReserve,
        uint256 deadLine
    ) external payable;


    function bid(
        address cpAddress,
        uint256 quoteAmount,
        uint8 flag, // 0 - ERC20, 1 - quoteInETH
        uint256 deadLine
    ) external payable;

    function addLiquidityToV1(
        address pair,
        uint256 baseAmount,
        uint256 quoteAmount,
        uint256 baseMinShares,
        uint256 quoteMinShares,
        uint8 flag, // 0 erc20 Out  1 baseInETH  2 quoteInETH 
        uint256 deadLine
    ) external payable returns(uint256, uint256);

    function dodoSwapV1(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

    function externalSwap(
        address fromToken,
        address toToken,
        address approveTarget,
        address to,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        bytes memory callDataConcat,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

    function mixSwap(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory mixAdapters,
        address[] memory mixPairs,
        address[] memory assetTo,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

}

// File: contracts/SmartRoute/intf/IDODOV2.sol


interface IDODOV2 {

    //========== Common ==================

    function sellBase(address to) external returns (uint256 receiveQuoteAmount);

    function sellQuote(address to) external returns (uint256 receiveBaseAmount);

    function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve);

    function _BASE_TOKEN_() external view returns (address);

    function _QUOTE_TOKEN_() external view returns (address);

    function getPMMStateForCall() external view returns (
            uint256 i,
            uint256 K,
            uint256 B,
            uint256 Q,
            uint256 B0,
            uint256 Q0,
            uint256 R
    );

    function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate);

    
    function getDODOPoolBidirection(address token0, address token1) external view returns (address[] memory, address[] memory);

    //========== DODOVendingMachine ========
    
    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP
    ) external returns (address newVendingMachine);
    
    function buyShares(address to) external returns (uint256,uint256,uint256);


    //========== DODOPrivatePool ===========

    function createDODOPrivatePool() external returns (address newPrivatePool);

    function initDODOPrivatePool(
        address dppAddress,
        address creator,
        address baseToken,
        address quoteToken,
        uint256 lpFeeRate,
        uint256 k,
        uint256 i,
        bool isOpenTwap
    ) external;

    function reset(
        address operator,
        uint256 newLpFeeRate,
        uint256 newI,
        uint256 newK,
        uint256 baseOutAmount,
        uint256 quoteOutAmount,
        uint256 minBaseReserve,
        uint256 minQuoteReserve
    ) external returns (bool); 


    function _OWNER_() external returns (address);
    
    //========== CrowdPooling ===========

    function createCrowdPooling() external returns (address payable newCrowdPooling);

    function initCrowdPooling(
        address cpAddress,
        address creator,
        address baseToken,
        address quoteToken,
        uint256[] memory timeLine,
        uint256[] memory valueList,
        bool isOpenTWAP
    ) external;

    function bid(address to) external;
}

// File: contracts/SmartRoute/intf/IDODOV1.sol

interface IDODOV1 {
    function init(
        address owner,
        address supervisor,
        address maintainer,
        address baseToken,
        address quoteToken,
        address oracle,
        uint256 lpFeeRate,
        uint256 mtFeeRate,
        uint256 k,
        uint256 gasPriceLimit
    ) external;

    function transferOwnership(address newOwner) external;

    function claimOwnership() external;

    function sellBaseToken(
        uint256 amount,
        uint256 minReceiveQuote,
        bytes calldata data
    ) external returns (uint256);

    function buyBaseToken(
        uint256 amount,
        uint256 maxPayQuote,
        bytes calldata data
    ) external returns (uint256);

    function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote);

    function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote);

    function depositBaseTo(address to, uint256 amount) external returns (uint256);

    function withdrawBase(uint256 amount) external returns (uint256);

    function withdrawAllBase() external returns (uint256);

    function depositQuoteTo(address to, uint256 amount) external returns (uint256);

    function withdrawQuote(uint256 amount) external returns (uint256);

    function withdrawAllQuote() external returns (uint256);

    function _BASE_CAPITAL_TOKEN_() external returns (address);

    function _QUOTE_CAPITAL_TOKEN_() external returns (address);

    function _BASE_TOKEN_() external view returns (address);

    function _QUOTE_TOKEN_() external view returns (address);

    function _R_STATUS_() external view returns (uint8);

    function _QUOTE_BALANCE_() external view returns (uint256);

    function _BASE_BALANCE_() external view returns (uint256);

    function _K_() external view returns (uint256);

    function _MT_FEE_RATE_() external view returns (uint256);

    function _LP_FEE_RATE_() external view returns (uint256);

    function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget);

    function getOraclePrice() external view returns (uint256);

    function getMidPrice() external view returns (uint256 midPrice); 
}

// File: contracts/intf/IDODOApprove.sol


interface IDODOApprove {
    function claimTokens(address token,address who,address dest,uint256 amount) external;
    function getDODOProxy() external view returns (address);
}

// File: contracts/lib/InitializableOwnable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;
    bool internal _INITIALIZED_;

    // ============ Events ============

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

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

    // ============ Modifiers ============

    modifier notInitialized() {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function initOwner(address newOwner) public notInitialized {
        _INITIALIZED_ = true;
        _OWNER_ = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() public {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/SmartRoute/DODOApproveProxy.sol



interface IDODOApproveProxy {
    function isAllowedProxy(address _proxy) external view returns (bool);
    function claimTokens(address token,address who,address dest,uint256 amount) external;
}

/**
 * @title DODOApproveProxy
 * @author DODO Breeder
 *
 * @notice Allow different version dodoproxy to claim from DODOApprove
 */
contract DODOApproveProxy is InitializableOwnable {
    
    // ============ Storage ============
    uint256 private constant _TIMELOCK_DURATION_ = 3 days;
    mapping (address => bool) public _IS_ALLOWED_PROXY_;
    uint256 public _TIMELOCK_;
    address public _PENDING_ADD_DODO_PROXY_;
    address public immutable _DODO_APPROVE_;

    // ============ Modifiers ============
    modifier notLocked() {
        require(
            _TIMELOCK_ <= block.timestamp,
            "SetProxy is timelocked"
        );
        _;
    }

    constructor(address dodoApporve) public {
        _DODO_APPROVE_ = dodoApporve;
    }

    function init(address owner, address[] memory proxies) external {
        initOwner(owner);
        for(uint i = 0; i < proxies.length; i++) 
            _IS_ALLOWED_PROXY_[proxies[i]] = true;
    }

    function unlockAddProxy(address newDodoProxy) public onlyOwner {
        _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_;
        _PENDING_ADD_DODO_PROXY_ = newDodoProxy;
    }

    function lockAddProxy() public onlyOwner {
       _PENDING_ADD_DODO_PROXY_ = address(0);
       _TIMELOCK_ = 0;
    }


    function addDODOProxy() external onlyOwner notLocked() {
        _IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true;
        lockAddProxy();
    }

    function removeDODOProxy (address oldDodoProxy) public onlyOwner {
        _IS_ALLOWED_PROXY_[oldDodoProxy] = false;
    }
    
    function claimTokens(
        address token,
        address who,
        address dest,
        uint256 amount
    ) external {
        require(_IS_ALLOWED_PROXY_[msg.sender], "DODOApproveProxy:Access restricted");
        IDODOApprove(_DODO_APPROVE_).claimTokens(
            token,
            who,
            dest,
            amount
        );
    }

    function isAllowedProxy(address _proxy) external view returns (bool) {
        return _IS_ALLOWED_PROXY_[_proxy];
    }
}

// File: contracts/lib/SafeMath.sol



/**
 * @title SafeMath
 * @author DODO Breeder
 *
 * @notice Math operations with safety checks that revert on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MUL_ERROR");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "DIVIDING_ERROR");
        return a / b;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SUB_ERROR");
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "ADD_ERROR");
        return c;
    }

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = x / 2 + 1;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

// File: contracts/lib/DecimalMath.sol

/**
 * @title DecimalMath
 * @author DODO Breeder
 *
 * @notice Functions for fixed point number with 18 decimals
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 internal constant ONE = 10**18;
    uint256 internal constant ONE2 = 10**36;

    function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d) / (10**18);
    }

    function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d).divCeil(10**18);
    }

    function divFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).div(d);
    }

    function divCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).divCeil(d);
    }

    function reciprocalFloor(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).div(target);
    }

    function reciprocalCeil(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).divCeil(target);
    }
}

// File: contracts/SmartRoute/helper/DODOSellHelper.sol

// import {DODOMath} from "../lib/DODOMath.sol";

interface IDODOSellHelper {
    function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256);
    
    function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256);
}

library DODOMath {
    using SafeMath for uint256;

    /*
        Integrate dodo curve fron V1 to V2
        require V0>=V1>=V2>0
        res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1)
        let V1-V2=delta
        res = i*delta*(1-k+k(V0^2/V1/V2))
    */
    function _GeneralIntegrate(
        uint256 V0,
        uint256 V1,
        uint256 V2,
        uint256 i,
        uint256 k
    ) internal pure returns (uint256) {
        uint256 fairAmount = DecimalMath.mulFloor(i, V1.sub(V2)); // i*delta
        uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2);
        uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2)
        return DecimalMath.mulFloor(fairAmount, DecimalMath.ONE.sub(k).add(penalty));
    }

    /*
        The same with integration expression above, we have:
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Given Q1 and deltaB, solve Q2
        This is a quadratic function and the standard version is
        aQ2^2 + bQ2 + c = 0, where
        a=1-k
        -b=(1-k)Q1-kQ0^2/Q1+i*deltaB
        c=-kQ0^2
        and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k)
        note: another root is negative, abondan
        if deltaBSig=true, then Q2>Q1
        if deltaBSig=false, then Q2<Q1
    */
    function _SolveQuadraticFunctionForTrade(
        uint256 Q0,
        uint256 Q1,
        uint256 ideltaB,
        bool deltaBSig,
        uint256 k
    ) internal pure returns (uint256) {
        // calculate -b value and sig
        // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB
        uint256 kQ02Q1 = DecimalMath.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1
        uint256 b = DecimalMath.mulFloor(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1
        bool minusbSig = true;
        if (deltaBSig) {
            b = b.add(ideltaB); // (1-k)Q1+i*deltaB
        } else {
            kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1
        }
        if (b >= kQ02Q1) {
            b = b.sub(kQ02Q1);
            minusbSig = true;
        } else {
            b = kQ02Q1.sub(b);
            minusbSig = false;
        }

        // calculate sqrt
        uint256 squareRoot = DecimalMath.mulFloor(
            DecimalMath.ONE.sub(k).mul(4),
            DecimalMath.mulFloor(k, Q0).mul(Q0)
        ); // 4(1-k)kQ0^2
        squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0)

        // final res
        uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k)
        uint256 numerator;
        if (minusbSig) {
            numerator = b.add(squareRoot);
        } else {
            numerator = squareRoot.sub(b);
        }

        if (deltaBSig) {
            return DecimalMath.divFloor(numerator, denominator);
        } else {
            return DecimalMath.divCeil(numerator, denominator);
        }
    }

    /*
        Start from the integration function
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Assume Q2=Q0, Given Q1 and deltaB, solve Q0
        let fairAmount = i*deltaB
    */
    function _SolveQuadraticFunctionForTarget(
        uint256 V1,
        uint256 k,
        uint256 fairAmount
    ) internal pure returns (uint256 V0) {
        // V0 = V1+V1*(sqrt-1)/2k
        uint256 sqrt = DecimalMath.divCeil(DecimalMath.mulFloor(k, fairAmount).mul(4), V1);
        sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt();
        uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2));
        // V0 is greater than or equal to V1 according to the solution
        return DecimalMath.mulFloor(V1, DecimalMath.ONE.add(premium));
    }
}

contract DODOSellHelper {
    using SafeMath for uint256;

    enum RStatus {ONE, ABOVE_ONE, BELOW_ONE}

    uint256 constant ONE = 10**18;

    struct DODOState {
        uint256 oraclePrice;
        uint256 K;
        uint256 B;
        uint256 Q;
        uint256 baseTarget;
        uint256 quoteTarget;
        RStatus rStatus;
    }

    function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) {
        return IDODOV1(dodo).querySellBaseToken(amount);
    }

    function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) {
        DODOState memory state;
        (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget();
        state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_());
        state.oraclePrice = IDODOV1(dodo).getOraclePrice();
        state.Q = IDODOV1(dodo)._QUOTE_BALANCE_();
        state.B = IDODOV1(dodo)._BASE_BALANCE_();
        state.K = IDODOV1(dodo)._K_();

        uint256 boughtAmount;
        // Determine the status (RStatus) and calculate the amount
        // based on the state
        if (state.rStatus == RStatus.ONE) {
            boughtAmount = _ROneSellQuoteToken(amount, state);
        } else if (state.rStatus == RStatus.ABOVE_ONE) {
            boughtAmount = _RAboveSellQuoteToken(amount, state);
        } else {
            uint256 backOneBase = state.B.sub(state.baseTarget);
            uint256 backOneQuote = state.quoteTarget.sub(state.Q);
            if (amount <= backOneQuote) {
                boughtAmount = _RBelowSellQuoteToken(amount, state);
            } else {
                boughtAmount = backOneBase.add(
                    _ROneSellQuoteToken(amount.sub(backOneQuote), state)
                );
            }
        }
        // Calculate fees
        return
            DecimalMath.divFloor(
                boughtAmount,
                DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add(
                    IDODOV1(dodo)._LP_FEE_RATE_()
                )
            );
    }

    function _ROneSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receiveBaseToken)
    {
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade(
            state.baseTarget,
            state.baseTarget,
            DecimalMath.mulFloor(i, amount),
            false,
            state.K
        );
        return state.baseTarget.sub(B2);
    }

    function _RAboveSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receieBaseToken)
    {
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade(
            state.baseTarget,
            state.B,
            DecimalMath.mulFloor(i, amount),
            false,
            state.K
        );
        return state.B.sub(B2);
    }

    function _RBelowSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receiveBaseToken)
    {
        uint256 Q1 = state.Q.add(amount);
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K);
    }
}

// File: contracts/intf/IERC20.sol

/**
 * @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);

    function decimals() external view returns (uint8);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    /**
     * @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);
}

// File: contracts/intf/IWETH.sol



interface IWETH {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

// File: contracts/SmartRoute/intf/IUni.sol


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

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function token0() external view returns (address);
    
    function token1() external view returns (address);
}

// File: contracts/lib/SafeERC20.sol



/**
 * @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 ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

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

    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'
        // solhint-disable-next-line max-line-length
        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));
    }

    /**
     * @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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/SmartRoute/lib/UniversalERC20.sol


library UniversalERC20 {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    function universalTransfer(
        IERC20 token,
        address payable to,
        uint256 amount
    ) internal {
        if (amount > 0) {
            if (isETH(token)) {
                to.transfer(amount);
            } else {
                token.safeTransfer(to, amount);
            }
        }
    }

    function universalApproveMax(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        uint256 allowance = token.allowance(address(this), to);
        if (allowance < amount) {
            if (allowance > 0) {
                token.safeApprove(to, 0);
            }
            token.safeApprove(to, uint256(-1));
        }
    }

    function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) {
        if (isETH(token)) {
            return who.balance;
        } else {
            return token.balanceOf(who);
        }
    }

    function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) {
        return token.balanceOf(who);
    }

    function isETH(IERC20 token) internal pure returns (bool) {
        return token == ETH_ADDRESS;
    }
}

// File: contracts/lib/ReentrancyGuard.sol


/**
 * @title ReentrancyGuard
 * @author DODO Breeder
 *
 * @notice Protect functions from Reentrancy Attack
 */
contract ReentrancyGuard {
    // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations
    // zero-state of _ENTERED_ is false
    bool private _ENTERED_;

    modifier preventReentrant() {
        require(!_ENTERED_, "REENTRANT");
        _ENTERED_ = true;
        _;
        _ENTERED_ = false;
    }
}

// File: contracts/SmartRoute/intf/IDODOAdapter.sol


interface IDODOAdapter {
    
    function sellBase(address to, address pool, bytes memory data) external;

    function sellQuote(address to, address pool, bytes memory data) external;
}

// File: contracts/SmartRoute/DODOV2Proxy02.sol











/**
 * @title DODOV2Proxy02
 * @author DODO Breeder
 *
 * @notice Entrance of trading in DODO platform
 */
contract DODOV2Proxy02 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable {
    using SafeMath for uint256;
    using UniversalERC20 for IERC20;

    // ============ Storage ============

    address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public immutable _WETH_;
    address public immutable _DODO_APPROVE_PROXY_;
    address public immutable _DODO_SELL_HELPER_;
    address public immutable _DVM_FACTORY_;
    address public immutable _DPP_FACTORY_;
    mapping (address => bool) public isWhiteListed;

    // ============ Events ============

    event OrderHistory(
        address fromToken,
        address toToken,
        address sender,
        uint256 fromAmount,
        uint256 returnAmount
    );

    // ============ Modifiers ============

    modifier judgeExpired(uint256 deadLine) {
        require(deadLine >= block.timestamp, "DODOV2Proxy02: EXPIRED");
        _;
    }

    fallback() external payable {}

    receive() external payable {}

    constructor(
        address dvmFactory,
        address dppFactory,
        address payable weth,
        address dodoApproveProxy,
        address dodoSellHelper
    ) public {
        _DVM_FACTORY_ = dvmFactory;
        _DPP_FACTORY_ = dppFactory;
        _WETH_ = weth;
        _DODO_APPROVE_PROXY_ = dodoApproveProxy;
        _DODO_SELL_HELPER_ = dodoSellHelper;
    }

    function addWhiteList (address contractAddr) public onlyOwner {
        isWhiteListed[contractAddr] = true;
    }

    function removeWhiteList (address contractAddr) public onlyOwner {
        isWhiteListed[contractAddr] = false;
    }

    // ============ DVM Functions (create & add liquidity) ============

    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP,
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (address newVendingMachine, uint256 shares)
    {
        {
            address _baseToken = baseToken == _ETH_ADDRESS_ ? _WETH_ : baseToken;
            address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken;
            newVendingMachine = IDODOV2(_DVM_FACTORY_).createDODOVendingMachine(
                _baseToken,
                _quoteToken,
                lpFeeRate,
                i,
                k,
                isOpenTWAP
            );
        }

        {
            address _baseToken = baseToken;
            address _quoteToken = quoteToken;
            _deposit(
                msg.sender,
                newVendingMachine,
                _baseToken,
                baseInAmount,
                _baseToken == _ETH_ADDRESS_
            );
            _deposit(
                msg.sender,
                newVendingMachine,
                _quoteToken,
                quoteInAmount,
                _quoteToken == _ETH_ADDRESS_
            );
        }

        (shares, , ) = IDODOV2(newVendingMachine).buyShares(msg.sender);
    }

    function addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 baseMinAmount,
        uint256 quoteMinAmount,
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (
            uint256 shares,
            uint256 baseAdjustedInAmount,
            uint256 quoteAdjustedInAmount
        )
    {
        address _dvm = dvmAddress;
        (baseAdjustedInAmount, quoteAdjustedInAmount) = _addDVMLiquidity(
            _dvm,
            baseInAmount,
            quoteInAmount
        );
        require(
            baseAdjustedInAmount >= baseMinAmount && quoteAdjustedInAmount >= quoteMinAmount,
            "DODOV2Proxy02: deposit amount is not enough"
        );

        _deposit(msg.sender, _dvm, IDODOV2(_dvm)._BASE_TOKEN_(), baseAdjustedInAmount, flag == 1);
        _deposit(msg.sender, _dvm, IDODOV2(_dvm)._QUOTE_TOKEN_(), quoteAdjustedInAmount, flag == 2);
        
        (shares, , ) = IDODOV2(_dvm).buyShares(msg.sender);
        // refund dust eth
        if (flag == 1 && msg.value > baseAdjustedInAmount) msg.sender.transfer(msg.value - baseAdjustedInAmount);
        if (flag == 2 && msg.value > quoteAdjustedInAmount) msg.sender.transfer(msg.value - quoteAdjustedInAmount);
    }

    function _addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount
    ) internal view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) {
        (uint256 baseReserve, uint256 quoteReserve) = IDODOV2(dvmAddress).getVaultReserve();
        if (quoteReserve == 0 && baseReserve == 0) {
            baseAdjustedInAmount = baseInAmount;
            quoteAdjustedInAmount = quoteInAmount;
        }
        if (quoteReserve == 0 && baseReserve > 0) {
            baseAdjustedInAmount = baseInAmount;
            quoteAdjustedInAmount = 0;
        }
        if (quoteReserve > 0 && baseReserve > 0) {
            uint256 baseIncreaseRatio = DecimalMath.divFloor(baseInAmount, baseReserve);
            uint256 quoteIncreaseRatio = DecimalMath.divFloor(quoteInAmount, quoteReserve);
            if (baseIncreaseRatio <= quoteIncreaseRatio) {
                baseAdjustedInAmount = baseInAmount;
                quoteAdjustedInAmount = DecimalMath.mulFloor(quoteReserve, baseIncreaseRatio);
            } else {
                quoteAdjustedInAmount = quoteInAmount;
                baseAdjustedInAmount = DecimalMath.mulFloor(baseReserve, quoteIncreaseRatio);
            }
        }
    }

    // ============ DPP Functions (create & reset) ============

    function createDODOPrivatePool(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTwap,
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (address newPrivatePool)
    {
        newPrivatePool = IDODOV2(_DPP_FACTORY_).createDODOPrivatePool();

        address _baseToken = baseToken;
        address _quoteToken = quoteToken;
        _deposit(msg.sender, newPrivatePool, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_);
        _deposit(
            msg.sender,
            newPrivatePool,
            _quoteToken,
            quoteInAmount,
            _quoteToken == _ETH_ADDRESS_
        );

        if (_baseToken == _ETH_ADDRESS_) _baseToken = _WETH_;
        if (_quoteToken == _ETH_ADDRESS_) _quoteToken = _WETH_;

        IDODOV2(_DPP_FACTORY_).initDODOPrivatePool(
            newPrivatePool,
            msg.sender,
            _baseToken,
            _quoteToken,
            lpFeeRate,
            k,
            i,
            isOpenTwap
        );
    }

    function resetDODOPrivatePool(
        address dppAddress,
        uint256[] memory paramList,  //0 - newLpFeeRate, 1 - newI, 2 - newK
        uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3- quoteOutAmount
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
        uint256 minBaseReserve,
        uint256 minQuoteReserve,
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) {
        _deposit(
            msg.sender,
            dppAddress,
            IDODOV2(dppAddress)._BASE_TOKEN_(),
            amountList[0],
            flag == 1
        );
        _deposit(
            msg.sender,
            dppAddress,
            IDODOV2(dppAddress)._QUOTE_TOKEN_(),
            amountList[1],
            flag == 2
        );

        require(IDODOV2(IDODOV2(dppAddress)._OWNER_()).reset(
            msg.sender,
            paramList[0],
            paramList[1],
            paramList[2],
            amountList[2],
            amountList[3],
            minBaseReserve,
            minQuoteReserve
        ), "Reset Failed");

        _withdraw(msg.sender, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[2], flag == 3);
        _withdraw(msg.sender, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[3], flag == 4);
    }

    // ============ Swap ============

    function dodoSwapV2ETHToToken(
        address toToken,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender);
        IWETH(_WETH_).deposit{value: msg.value}();
        IWETH(_WETH_).transfer(dodoPairs[0], msg.value);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(msg.sender);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(msg.sender);
                }
            } else {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }

        returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            _ETH_ADDRESS_,
            toToken,
            msg.sender,
            msg.value,
            returnAmount
        );
    }

    function dodoSwapV2TokenToETH(
        address fromToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(address(this));
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(address(this));
                }
            } else {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }
        returnAmount = IWETH(_WETH_).balanceOf(address(this));
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");
        IWETH(_WETH_).withdraw(returnAmount);
        msg.sender.transfer(returnAmount);

        emit OrderHistory(
            fromToken,
            _ETH_ADDRESS_,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function dodoSwapV2TokenToToken(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");

        uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender);
        IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(msg.sender);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(msg.sender);
                }
            } else {
                if (directions& 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }
        returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            fromToken,
            toToken,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function externalSwap(
        address fromToken,
        address toToken,
        address approveTarget,
        address swapTarget,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        bytes memory callDataConcat,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender);
        if (fromToken != _ETH_ADDRESS_) {
            IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(
                fromToken,
                msg.sender,
                address(this),
                fromTokenAmount
            );
            IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount);
        }

        require(isWhiteListed[swapTarget], "DODOV2Proxy02: Not Whitelist Contract");
        (bool success, ) = swapTarget.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat);

        require(success, "DODOV2Proxy02: External Swap execution Failed");

        IERC20(toToken).universalTransfer(
            msg.sender,
            IERC20(toToken).universalBalanceOf(address(this))
        );

        returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            fromToken,
            toToken,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function dodoSwapV1(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        

        address _fromToken = fromToken;
        address _toToken = toToken;
        
        _deposit(msg.sender, address(this), _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            address curDodoPair = dodoPairs[i];
            if (directions & 1 == 0) {
                address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_();
                uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this));
                IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn);
                IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, "");
            } else {
                address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_();
                uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this));
                IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn);
                uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken(
                    curDodoPair,
                    curAmountIn
                );
                IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, "");
            }
            directions = directions >> 1;
        }

        
        if (_toToken == _ETH_ADDRESS_) {
            returnAmount = IWETH(_WETH_).balanceOf(address(this));
            IWETH(_WETH_).withdraw(returnAmount);
        } else {
            returnAmount = IERC20(_toToken).tokenBalanceOf(address(this));
        }
        
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");
        IERC20(_toToken).universalTransfer(msg.sender, returnAmount);

        emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount);
    }


    function mixSwap(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory mixAdapters,
        address[] memory mixPairs,
        address[] memory assetTo,
        uint256 directions,
        bool,
        uint256 deadLine
    ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
        require(mixPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(mixPairs.length == mixAdapters.length, "DODOV2Proxy02: PAIR_ADAPTER_NOT_MATCH");
        require(mixPairs.length == assetTo.length - 1, "DODOV2Proxy02: PAIR_ASSETTO_NOT_MATCH");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");

        address _fromToken = fromToken;
        address _toToken = toToken;
        uint256 _fromTokenAmount = fromTokenAmount;
        
        uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender);
        
        _deposit(msg.sender, assetTo[0], _fromToken, _fromTokenAmount, _fromToken == _ETH_ADDRESS_);

        for (uint256 i = 0; i < mixPairs.length; i++) {
            if (directions & 1 == 0) {
                IDODOAdapter(mixAdapters[i]).sellBase(assetTo[i + 1],mixPairs[i], "");
            } else {
                IDODOAdapter(mixAdapters[i]).sellQuote(assetTo[i + 1],mixPairs[i], "");
            }
            directions = directions >> 1;
        }

        if(_toToken == _ETH_ADDRESS_) {
            returnAmount = IWETH(_WETH_).balanceOf(address(this));
            IWETH(_WETH_).withdraw(returnAmount);
            msg.sender.transfer(returnAmount);
        }else {
            returnAmount = IERC20(_toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance);
        }

        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            _fromToken,
            _toToken,
            msg.sender,
            _fromTokenAmount,
            returnAmount
        );
    }

    //============ CrowdPooling Functions (bid) ============
    function bid(
        address cpAddress,
        uint256 quoteAmount,
        uint8 flag, // 0 - ERC20, 1 - quoteInETH
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) {
        _deposit(msg.sender, cpAddress, IDODOV2(cpAddress)._QUOTE_TOKEN_(), quoteAmount, flag == 1);
        IDODOV2(cpAddress).bid(msg.sender);
    }


    function addLiquidityToV1(
        address pair,
        uint256 baseAmount,
        uint256 quoteAmount,
        uint256 baseMinShares,
        uint256 quoteMinShares,
        uint8 flag, // 0 erc20 In  1 baseInETH  2 quoteIn ETH 
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) {
        address _baseToken = IDODOV1(pair)._BASE_TOKEN_();
        address _quoteToken = IDODOV1(pair)._QUOTE_TOKEN_();
        
        _deposit(msg.sender, address(this), _baseToken, baseAmount, flag == 1);
        _deposit(msg.sender, address(this), _quoteToken, quoteAmount, flag == 2);

        
        if(baseAmount > 0) {
            IERC20(_baseToken).universalApproveMax(pair, baseAmount);
            baseShares = IDODOV1(pair).depositBaseTo(msg.sender, baseAmount);
        }
        if(quoteAmount > 0) {
            IERC20(_quoteToken).universalApproveMax(pair, quoteAmount);
            quoteShares = IDODOV1(pair).depositQuoteTo(msg.sender, quoteAmount);
        }

        require(baseShares >= baseMinShares && quoteShares >= quoteMinShares,"DODOV2Proxy02: Return DLP is not enough");
    }
    

    function _deposit(
        address from,
        address to,
        address token,
        uint256 amount,
        bool isETH
    ) internal {
        if (isETH) {
            if (amount > 0) {
                IWETH(_WETH_).deposit{value: amount}();
                if (to != address(this)) SafeERC20.safeTransfer(IERC20(_WETH_), to, amount);
            }
        } else {
            IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount);
        }
    }

    function _withdraw(
        address payable to,
        address token,
        uint256 amount,
        bool isETH
    ) internal {
        if (isETH) {
            if (amount > 0) {
                IWETH(_WETH_).withdraw(amount);
                to.transfer(amount);
            }
        } else {
            if (amount > 0) {
                SafeERC20.safeTransfer(IERC20(token), to, amount);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"dvmFactory","type":"address"},{"internalType":"address","name":"dppFactory","type":"address"},{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"dodoApproveProxy","type":"address"},{"internalType":"address","name":"dodoSellHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"OrderHistory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_DODO_APPROVE_PROXY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_SELL_HELPER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DPP_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DVM_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WETH_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dvmAddress","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addDVMLiquidity","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseAdjustedInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAdjustedInAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinShares","type":"uint256"},{"internalType":"uint256","name":"quoteMinShares","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addLiquidityToV1","outputs":[{"internalType":"uint256","name":"baseShares","type":"uint256"},{"internalType":"uint256","name":"quoteShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cpAddress","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTwap","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOPrivatePool","outputs":[{"internalType":"address","name":"newPrivatePool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOVendingMachine","outputs":[{"internalType":"address","name":"newVendingMachine","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2ETHToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToETH","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"mixAdapters","type":"address[]"},{"internalType":"address[]","name":"mixPairs","type":"address[]"},{"internalType":"address[]","name":"assetTo","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"mixSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dppAddress","type":"address"},{"internalType":"uint256[]","name":"paramList","type":"uint256[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"resetDODOPrivatePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61012060405234801561001157600080fd5b506040516200523838038062005238833981810160405260a081101561003657600080fd5b508051602082015160408301516060808501516080958601516001600160601b031995831b861660e05293821b85166101005291811b8416909452831b821660a05290911b1660c05260805160601c60a05160601c60c05160601c60e05160601c6101005160601c6150f76200014160003980610dde5280610f8c5280613c375250806135be52806137785250806113e45280613c13525080611c7f5280612fc75280613e4b528061406b52806145bc525080610d245280610ed45280610f18528061153852806115ce528061201c52806120d152806125e4528061267a52806129f05280612a5452806136c4528061370e52806144d0528061455852806147fa52506150f76000f3fe60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a0414610b39578063eb99be1214610b6c578063f2fde38b14610b81578063f87dc1b714610bb457610171565b8063af1280b014610ad4578063b730d15014610ae9578063db70b5c714610afe57610171565b8063674d94221461091157806369e4e4171461097c5780636f9170f6146109915780638456db15146109d85780638b3bb089146109ed57806399882c8f14610a6e57610171565b80631e6d24c2116101235780631e6d24c2146104775780632042e5c21461054e57806323c38fa3146105815780634e71e0c8146107595780635028bb951461076e57806354bacd131461083157610171565b80630d009297146101735780630d4eec8f146101a65780630d9be500146101d75780630dd4ebd91461023557806312ff148d1461031b57806316048bc41461046257610171565b3661017157005b005b34801561017f57600080fd5b506101716004803603602081101561019657600080fd5b50356001600160a01b0316610c95565b3480156101b257600080fd5b506101bb610d22565b604080516001600160a01b039092168252519081900360200190f35b6101bb60048036036101208110156101ee57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135610d46565b610309600480360361010081101561024c57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561028b57600080fd5b82018360208201111561029d57600080fd5b803590602001918460208302840111600160201b831117156102be57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561100a565b60408051918252519081900360200190f35b610171600480360360e081101561033157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035b57600080fd5b82018360208201111561036d57600080fd5b803590602001918460208302840111600160201b8311171561038e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dd57600080fd5b8201836020820111156103ef57600080fd5b803590602001918460208302840111600160201b8311171561041057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff83351693505050602081013590604081013590606001356116fc565b34801561046e57600080fd5b506101bb611ba0565b34801561048357600080fd5b50610309600480360360e081101561049a57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104d057600080fd5b8201836020820111156104e257600080fd5b803590602001918460208302840111600160201b8311171561050357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135611bb4565b34801561055a57600080fd5b506101716004803603602081101561057157600080fd5b50356001600160a01b03166121d8565b610309600480360361014081101561059857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156105d757600080fd5b8201836020820111156105e957600080fd5b803590602001918460208302840111600160201b8311171561060a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460208302840111600160201b8311171561068c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106db57600080fd5b8201836020820111156106ed57600080fd5b803590602001918460208302840111600160201b8311171561070e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612249565b34801561076557600080fd5b506101716127d0565b610309600480360360c081101561078457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612894565b610309600480360361012081101561084857600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135612ed2565b61095e600480360360e081101561092757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356132b6565b60408051938452602084019290925282820152519081900360600190f35b34801561098857600080fd5b506101bb6135bc565b34801561099d57600080fd5b506109c4600480360360208110156109b457600080fd5b50356001600160a01b03166135e0565b604080519115158252519081900360200190f35b3480156109e457600080fd5b506101bb6135f5565b610a4b6004803603610120811015610a0457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135613604565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610abb600480360360e0811015610a8457600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356138d6565b6040805192835260208301919091528051918290030190f35b348015610ae057600080fd5b506101bb613c11565b348015610af557600080fd5b506101bb613c35565b61017160048036036080811015610b1457600080fd5b506001600160a01b038135169060208101359060ff6040820135169060600135613c59565b348015610b4557600080fd5b5061017160048036036020811015610b5c57600080fd5b50356001600160a01b0316613dd5565b348015610b7857600080fd5b506101bb613e49565b348015610b8d57600080fd5b5061017160048036036020811015610ba457600080fd5b50356001600160a01b0316613e6d565b348015610bc057600080fd5b506103096004803603610100811015610bd857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610c1757600080fd5b820183602082011115610c2957600080fd5b803590602001918460208302840111600160201b83111715610c4a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135613f1d565b600154600160a01b900460ff1615610ce7576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805460ff1615610d8b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610ddc576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b505191508a8a610e8d3385848e6001600160a01b038216600080516020614fab833981519152146144c2565b610eb33385838d6001600160a01b038216600080516020614fab833981519152146144c2565b6001600160a01b038216600080516020614fab8339815191521415610ef6577f000000000000000000000000000000000000000000000000000000000000000091505b6001600160a01b038116600080516020614fab8339815191521415610f3857507f00000000000000000000000000000000000000000000000000000000000000005b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163195eefe0916101048082019260009290919082900301818387803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611050576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611094576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b600087116110d35760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b89896110fb3330848d6001600160a01b038216600080516020614fab833981519152146144c2565b60005b88518110156114f857600089828151811061111557fe5b6020026020010151905088600116600014156112bd576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d602081101561120857600080fd5b505190506112266001600160a01b038316848363ffffffff61462616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b506114eb92505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b505190506113b86001600160a01b038316848363ffffffff61462616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d60208110156114e557600080fd5b50505050505b50600197881c97016110fe565b506001600160a01b038116600080516020614fab833981519152141561163357604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d60208110156115a857600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519195506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561161657600080fd5b505af115801561162a573d6000803e3d6000fd5b5050505061164f565b61164c6001600160a01b0382163063ffffffff6146f016565b93505b8884101561168e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b6116a86001600160a01b038216338663ffffffff61477d16565b604080516001600160a01b038085168252831660208201523381830152606081018c9052608081018690529051600080516020614eea8339815191529181900360a00190a150505098975050505050505050565b60005460ff1615611740576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611791576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b61181c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d60208110156117f957600080fd5b505189518a9060009061180857fe5b60200260200101518960ff166001146144c2565b6118a933898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505189518a90600190811061189557fe5b60200260200101518960ff166002146144c2565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a9060009061193157fe5b60200260200101518a60018151811061194657fe5b60200260200101518b60028151811061195b57fe5b60200260200101518b60028151811061197057fe5b60200260200101518c60038151811061198557fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d6020811015611a3257600080fd5b5051611a74576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b611b0033896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d6020811015611adb57600080fd5b5051885189906002908110611aec57fe5b60200260200101518860ff166003146147ec565b611b8c33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d6020811015611b6757600080fd5b5051885189906003908110611b7857fe5b60200260200101518860ff166004146147ec565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b60008142811015611bfa576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611c3e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711611c7d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668a3389600081518110611cbb57fe5b60200260200101518c6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b506000925050505b8651811015611ffb576001875103811415611eb85760018616611e1b57868181518110611d8a57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d6020811015611e1357600080fd5b50611eb39050565b868181518110611e2757fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050506040513d6020811015611eb057600080fd5b50505b611fef565b60018616611f4157868181518110611ecc57fe5b60200260200101516001600160a01b031663bd6015b4888360010181518110611ef157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b868181518110611f4d57fe5b60200260200101516001600160a01b031663dd93f59a888360010181518110611f7257fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b50505b600195861c9501611d61565b50604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b50519150868210156120cf5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561213557600080fd5b505af1158015612149573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561217a573d6000803e3d6000fd5b50604080516001600160a01b038b168152600080516020614fab83398151915260208201523381830152606081018a9052608081018490529051600080516020614eea8339815191529181900360a00190a150979650505050505050565b60005461010090046001600160a01b03163314612228576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000814281101561228f576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008751116122d3576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b87518751146123135760405162461bcd60e51b8152600401808060200182810382526025815260200180614f0a6025913960400191505060405180910390fd5b60018651038751146123565760405162461bcd60e51b81526004018080602001828103825260258152602001806150676025913960400191505060405180910390fd5b600089116123955760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b8b8b8b60006123b36001600160a01b0384163363ffffffff6148c416565b90506123f8338b6000815181106123c657fe5b60200260200101518685600080516020614fab8339815191526001600160a01b0316896001600160a01b0316146144c2565b60005b8b518110156125a45760018a166124d4578c818151811061241857fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061243d57fe5b60200260200101518e848151811061245157fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b50505050612598565b8c81815181106124e057fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061250557fe5b60200260200101518e848151811061251957fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050505b6001998a1c99016123fb565b506001600160a01b038316600080516020614fab833981519152141561270d57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561262a57600080fd5b505afa15801561263e573d6000803e3d6000fd5b505050506040513d602081101561265457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519197506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b1580156126c257600080fd5b505af11580156126d6573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015612707573d6000803e3d6000fd5b50612739565b6127368161272a6001600160a01b0386163363ffffffff6146f016565b9063ffffffff61496e16565b95505b8c8610156127785760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808716825285166020820152338183015260608101849052608081018890529051600080516020614eea8339815191529181900360a00190a150505050509a9950505050505050505050565b6001546001600160a01b0316331461281f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156128da576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b600086511161291e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b6000871161295d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038b16916370a0823191602480820192602092909190829003018186803b1580156129a757600080fd5b505afa1580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d0e30db0913491600480830192600092919082900301818588803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb88600081518110612a8e57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d6020811015612b1057600080fd5b50600090505b8751811015612db0576001885103811415612c6d5760018716612bd057878181518110612b3f57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50612c689050565b878181518110612bdc57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b505af1158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50505b612da4565b60018716612cf657878181518110612c8157fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110612ca657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b878181518110612d0257fe5b60200260200101516001600160a01b031663dd93f59a898360010181518110612d2757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d7757600080fd5b505af1158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b50505b600196871c9601612b16565b50604080516370a0823160e01b81523360048201529051612e359183916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b50519063ffffffff61496e16565b925087831015612e765760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b60408051600080516020614fab83398151915281526001600160a01b038b1660208201523381830152346060820152608081018590529051600080516020614eea8339815191529181900360a00190a150509695505050505050565b60008142811015612f18576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008611612f575760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b6000612f726001600160a01b038c163363ffffffff6148c416565b90506001600160a01b038c16600080516020614fab8339815191521461303e576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b5061303e925050506001600160a01b038d168b8a614626565b6001600160a01b03891660009081526002602052604090205460ff166130955760405162461bcd60e51b8152600401808060200182810382526025815260200180614feb6025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020614fab833981519152146130c05760006130c2565b345b886040518082805190602001908083835b602083106130f25780518252601f1990920191602091820191016130d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613154576040519150601f19603f3d011682016040523d82523d6000602084013e613159565b606091505b50509050806131995760405162461bcd60e51b815260040180806020018281038252602d815260200180615010602d913960400191505060405180910390fd5b6131cd336131b66001600160a01b038f163063ffffffff6148c416565b6001600160a01b038f16919063ffffffff61477d16565b6131ea8261272a6001600160a01b038f163363ffffffff6148c416565b93508784101561322b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b600080516020614eea8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff16156132ff576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613350576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b8a61335c818c8c6149b7565b90945092508884108015906133715750878310155b6133ac5760405162461bcd60e51b815260040180806020018281038252602b815260200180614f80602b913960400191505060405180910390fd5b6134233382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d602081101561341457600080fd5b505187600160ff8d16146144c2565b61349a3382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561346157600080fd5b505afa158015613475573d6000803e3d6000fd5b505050506040513d602081101561348b57600080fd5b505186600260ff8d16146144c2565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b1580156134e257600080fd5b505af11580156134f6573d6000803e3d6000fd5b505050506040513d606081101561350c57600080fd5b50519450600160ff881614801561352257508334115b156135585760405133903486900380156108fc02916000818181858888f19350505050158015613556573d6000803e3d6000fd5b505b8660ff16600214801561356a57508234115b156135a05760405133903485900380156108fc02916000818181858888f1935050505015801561359e573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff161561364b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561369c576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020614fab833981519152146136c2578c6136e4565b7f00000000000000000000000000000000000000000000000000000000000000005b905060006001600160a01b038d16600080516020614fab8339815191521461370c578c61372e565b7f00000000000000000000000000000000000000000000000000000000000000005b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e18c40c79160c4808201926020929091908290030181600087803b1580156137c357600080fd5b505af11580156137d7573d6000803e3d6000fd5b505050506040513d60208110156137ed57600080fd5b505194508d91508c905061381d3386848f6001600160a01b038216600080516020614fab833981519152146144c2565b6138433386838e6001600160a01b038216600080516020614fab833981519152146144c2565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60608110156138b757600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561391d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561396e576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a957600080fd5b505afa1580156139bd573d6000803e3d6000fd5b505050506040513d60208110156139d357600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d6020811015613a4557600080fd5b50519050613a5c3330848e600160ff8d16146144c2565b613a6f3330838d8b60ff166002146144c2565b8a15613b0d57613a8f6001600160a01b0383168d8d63ffffffff61462616565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b158015613ade57600080fd5b505af1158015613af2573d6000803e3d6000fd5b505050506040513d6020811015613b0857600080fd5b505194505b8915613bab57613b2d6001600160a01b0382168d8c63ffffffff61462616565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b158015613b7c57600080fd5b505af1158015613b90573d6000803e3d6000fd5b505050506040513d6020811015613ba657600080fd5b505193505b888510158015613bbb5750878410155b613bf65760405162461bcd60e51b8152600401808060200182810382526027815260200180614f596027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1615613c9d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015613cee576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b613d653386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2c57600080fd5b505afa158015613d40573d6000803e3d6000fd5b505050506040513d6020811015613d5657600080fd5b505187600160ff8916146144c2565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b158015613dac57600080fd5b505af1158015613dc0573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314613e25576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b03163314613ebd576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015613f63576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111613fa7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711613fe65760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038c16916370a0823191602480820192602092909190829003018186803b15801561403057600080fd5b505afa158015614044573d6000803e3d6000fd5b505050506040513d602081101561405a57600080fd5b505187519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466908d9033908b906000906140a157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b506000925050505b87518110156143e157600188510381141561429e57600187166142015787818151811061417057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156141cf57600080fd5b505af11580156141e3573d6000803e3d6000fd5b505050506040513d60208110156141f957600080fd5b506142999050565b87818151811061420d57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b50505b6143d5565b60018716614327578781815181106142b257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106142d757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b87818151811061433357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061435857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156143a857600080fd5b505af11580156143bc573d6000803e3d6000fd5b505050506040513d60208110156143d257600080fd5b50505b600196871c9601614147565b50604080516370a0823160e01b8152336004820152905161442e9183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b92508783101561446f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808e1682528c1660208201523381830152606081018b9052608081018590529051600080516020614eea8339815191529181900360a00190a1505098975050505050505050565b801561458357811561457e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561452957600080fd5b505af115801561453d573d6000803e3d6000fd5b505050506001600160a01b0385163014905061457e5761457e7f00000000000000000000000000000000000000000000000000000000000000008584614ac9565b61461f565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561460657600080fd5b505af115801561461a573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561467757600080fd5b505afa15801561468b573d6000803e3d6000fd5b505050506040513d60208110156146a157600080fd5b50519050818110156146ea5780156146ce576146ce6001600160a01b03851684600063ffffffff614b1b16565b6146ea6001600160a01b0385168460001963ffffffff614b1b16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561474857600080fd5b505afa15801561475c573d6000803e3d6000fd5b505050506040513d602081101561477257600080fd5b505190505b92915050565b80156147e75761478c83614c2e565b156147cd576040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156147c7573d6000803e3d6000fd5b506147e7565b6147e76001600160a01b038416838363ffffffff614ac916565b505050565b80156148b35781156148ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561485e57600080fd5b505af1158015614872573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f193505050501580156148ac573d6000803e3d6000fd5b505b6146ea565b81156146ea576146ea838584614ac9565b60006148cf83614c2e565b156148e557506001600160a01b03811631614777565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561493b57600080fd5b505afa15801561494f573d6000803e3d6000fd5b505050506040513d602081101561496557600080fd5b50519050614777565b6000828211156149b1576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b1580156149f557600080fd5b505afa158015614a09573d6000803e3d6000fd5b505050506040513d6040811015614a1f57600080fd5b508051602090910151909250905080158015614a39575081155b15614a45578593508492505b80158015614a535750600082115b15614a6057859350600092505b600081118015614a705750600082115b15614abf576000614a818784614c4d565b90506000614a8f8784614c4d565b9050808211614aac57879550614aa58383614c7e565b9450614abc565b869450614ab98482614c7e565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526147e7908490614ca8565b801580614ba1575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614b7357600080fd5b505afa158015614b87573d6000803e3d6000fd5b505050506040513d6020811015614b9d57600080fd5b5051155b614bdc5760405162461bcd60e51b815260040180806020018281038252603681526020018061508c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526147e7908490614ca8565b6001600160a01b038116600080516020614fab83398151915214919050565b6000614c7782614c6b85670de0b6b3a764000063ffffffff614dfd16565b9063ffffffff614e5816565b9392505050565b6000670de0b6b3a7640000614c99848463ffffffff614dfd16565b81614ca057fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b60208310614ce65780518252601f199092019160209182019101614cc7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614d48576040519150601f19603f3d011682016040523d82523d6000602084013e614d4d565b606091505b509150915081614da4576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156146ea57808060200190516020811015614dc057600080fd5b50516146ea5760405162461bcd60e51b815260040180806020018281038252602a81526020018061503d602a913960400191505060405180910390fd5b600082614e0c57506000614777565b82820282848281614e1957fe5b0414614c77576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211614e9f576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b818381614ca057fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc64736f6c6343000609003300000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a

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

00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a

-----Decoded View---------------
Arg [0] : dvmFactory (address): 0x79887f65f83bdf15bcc8736b5e5bcdb48fb8fe13
Arg [1] : dppFactory (address): 0x95e887adf9eaa22cc1c6e3cb7f07adc95b4b25a8
Arg [2] : weth (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : dodoApproveProxy (address): 0x01feea29da5ae41b0b5f6b10b93ee34752ef80d7
Arg [4] : dodoSellHelper (address): 0xdfaf9584f5d229a9dbe5978523317820a8897c5a

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe13
Arg [1] : 00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a8
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : 00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7
Arg [4] : 000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a


Deployed ByteCode Sourcemap

32555:22846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10246:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10246:127:0;-1:-1:-1;;;;;10246:127:0;;:::i;32841:31::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32841:31:0;;;;;;;;;;;;;;38678:1270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38678:1270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48308:2378::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48308:2378:0;;-1:-1:-1;;48308:2378:0;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39956:1391;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;39956:1391:0;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;:::i;9613:22::-;;;;;;;;;;;;;:::i;43096:1716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43096:1716:0;;-1:-1:-1;;43096:1716:0;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;:::i;34120:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34120:119:0;-1:-1:-1;;;;;34120:119:0;;:::i;50696:2075::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;50696:2075:0;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;:::i;10552:228::-;;;;;;;;;;;;;:::i;41396:1692::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41396:1692:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41396:1692:0;;-1:-1:-1;;41396:1692:0;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;:::i;46564:1736::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46564:1736:0;;-1:-1:-1;;;;46564:1736:0;;;;;-1:-1:-1;46564:1736:0;;;;:::i;35854:1465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35854:1465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;32981:38;;;;;;;;;;;;;:::i;33071:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33071:46:0;-1:-1:-1;;;;;33071:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9642:26;;;;;;;;;;;;;:::i;34322:1524::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;53227:1214;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53227:1214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32931:43;;;;;;;;;;;;;:::i;33026:38::-;;;;;;;;;;;;;:::i;52841:376::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52841:376:0;;;;;;;;;;;;;;;;;;;;:::i;33997:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33997:115:0;-1:-1:-1;;;;;33997:115:0;;:::i;32879:45::-;;;;;;;;;;;;;:::i;10381:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10381:163:0;-1:-1:-1;;;;;10381:163:0;;:::i;44820:1736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44820:1736:0;;-1:-1:-1;;44820:1736:0;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;:::i;10246:127::-;10035:13;;-1:-1:-1;;;10035:13:0;;;;10034:14;10026:43;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;;;;10332:4:::1;10316:20:::0;;-1:-1:-1;;;;10316:20:0::1;-1:-1:-1::0;;;10316:20:0::1;::::0;;;10347:18;;-1:-1:-1;;;;;10347:18:0;;::::1;10316:20;10347:18;-1:-1:-1::0;;;;;;10347:18:0;;::::1;::::0;;;::::1;::::0;;10246:127::o;32841:31::-;;;:::o;38678:1270::-;39086:22;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;39058:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;39151:13:::2;-1:-1:-1::0;;;;;39143:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;39143:46:0;;-1:-1:-1;39223:9:0;39265:10;39286:91:::2;39295:10;39143:46:::0;39223:9;39335:12;-1:-1:-1;;;;;39349:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39349:27:0::2;39286:8;:91::i;:::-;39388:170;39411:10;39436:14:::0;39465:11;39491:13;-1:-1:-1;;;;;39519:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39519:28:0::2;39388:8;:170::i;:::-;-1:-1:-1::0;;;;;39575:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39575:27:0::2;39571:52;;;39617:6;39604:19;;39571:52;-1:-1:-1::0;;;;;39638:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39638:28:0::2;39634:54;;;-1:-1:-1::0;39682:6:0::2;39634:54;39701:239;::::0;;-1:-1:-1;;;39701:239:0;;-1:-1:-1;;;;;39701:239:0;;::::2;;::::0;::::2;::::0;39787:10:::2;39701:239:::0;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;39709:13:::2;39701:42:::0;;::::2;::::0;::::2;::::0;:239;;;;;-1:-1:-1;;39701:239:0;;;;;;;;-1:-1:-1;39701:42:0;:239;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;38678:1270:0;;;-1:-1:-1;;;;;;;;;;;;;38678:1270:0:o;48308:2378::-;48668:20;48640:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;48733:1:::1;48714:9;:16;:20;48706:59;;;::::0;;-1:-1:-1;;;48706:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;48706:59:0;;;;;;;;;;;;;::::1;;48802:1;48784:15;:19;48776:65;;;;-1:-1:-1::0;;;48776:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48885:9:::0;48924:7;48952:93:::1;48961:10;48981:4;48885:9:::0;49000:15;-1:-1:-1;;;;;49017:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;49017:27:0::1;48952:8;:93::i;:::-;49063:9;49058:1070;49082:9;:16;49078:1;:20;49058:1070;;;49120:19;49142:9;49152:1;49142:12;;;;;;;;;;;;;;49120:34;;49173:10;49186:1;49173:14;49191:1;49173:19;49169:905;;;49213:19;49243:11;-1:-1:-1::0;;;;;49235:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49235:35:0;49311:44:::1;::::0;;-1:-1:-1;;;49311:44:0;;49349:4:::1;49311:44;::::0;::::1;::::0;;;49235:35;;-1:-1:-1;49289:19:0::1;::::0;-1:-1:-1;;;;;49311:29:0;::::1;::::0;::::1;::::0;:44;;;;;49235:35:::1;::::0;49311:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49311:44:0;;-1:-1:-1;49374:65:0::1;-1:-1:-1::0;;;;;49374:39:0;::::1;49414:11:::0;49311:44;49374:65:::1;:39;:65;:::i;:::-;49466:11;-1:-1:-1::0;;;;;49458:34:0::1;;49493:11;49506:1;49458:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49169:905:0::1;::::0;-1:-1:-1;;;49169:905:0::1;;49553:20;49584:11;-1:-1:-1::0;;;;;49576:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49576:36:0;49653:45:::1;::::0;;-1:-1:-1;;;49653:45:0;;49692:4:::1;49653:45;::::0;::::1;::::0;;;49576:36;;-1:-1:-1;49631:19:0::1;::::0;-1:-1:-1;;;;;49653:30:0;::::1;::::0;::::1;::::0;:45;;;;;49576:36:::1;::::0;49653:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49653:45:0;;-1:-1:-1;49717:66:0::1;-1:-1:-1::0;;;;;49717:40:0;::::1;49758:11:::0;49653:45;49717:66:::1;:40;:66;:::i;:::-;49829:142;::::0;;-1:-1:-1;;;49829:142:0;;-1:-1:-1;;;;;49829:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;49802:24:::1;::::0;49845:18:::1;49829:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49829:142:0;49990:68:::1;::::0;;-1:-1:-1;;;49990:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;49990:68:0;;;;;;;;49829:142;;-1:-1:-1;;;;;;49990:33:0;::::1;::::0;::::1;::::0;:68;;;;;49829:142:::1;::::0;49990:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;49169:905:0::1;-1:-1:-1::0;50115:1:0::1;50101:15:::0;;::::1;::::0;49100:3:::1;49058:1070;;;-1:-1:-1::0;;;;;;50154:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;50154:25:0::1;50150:256;;;50211:38;::::0;;-1:-1:-1;;;50211:38:0;;50243:4:::1;50211:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;50217:6:0::1;50211:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50211:38:0;50264:36:::1;::::0;;-1:-1:-1;;;50264:36:0;;::::1;::::0;::::1;::::0;;;;;50211:38;;-1:-1:-1;;;;;;50270:6:0::1;50264:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;50264:36:0;;;;;;;;-1:-1:-1;50264:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50150:256;;;50348:46;-1:-1:-1::0;;;;;50348:31:0;::::1;50388:4;50348:46;:31;:46;:::i;:::-;50333:61;;50150:256;50450:15;50434:12;:31;;50426:86;;;;-1:-1:-1::0;;;50426:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50523:60;-1:-1:-1::0;;;;;50523:34:0;::::1;50558:10;50570:12:::0;50523:60:::1;:34;:60;:::i;:::-;50601:77;::::0;;-1:-1:-1;;;;;50601:77:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;50636:10:::1;50601:77:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50601:77:0;;;;;;;::::1;33512:1;;48308:2378:::0;;;;;;;;;;;:::o;39956:1391::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;40461:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;40482:170:::2;40505:10;40530;40563;-1:-1:-1::0;;;;;40555:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40555:34:0;40604:13;;:10;;40615:1:::2;::::0;40604:13:::2;;;;;;;;;;40632:4;:9;;40640:1;40632:9;40482:8;:170::i;:::-;40663:171;40686:10;40711;40744;-1:-1:-1::0;;;;;40736:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40736:35:0;40786:13;;:10;;40797:1:::2;::::0;40786:13;::::2;;;;;;;;;;;40814:4;:9;;40822:1;40814:9;40663:8;:171::i;:::-;40871:10;-1:-1:-1::0;;;;;40863:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40863:29:0;40939:12;;-1:-1:-1;;;;;40855:44:0;;::::2;::::0;::::2;::::0;40914:10:::2;::::0;40939:9;;40949:1:::2;::::0;40939:12:::2;;;;;;;;;;40966:9;40976:1;40966:12;;;;;;;;;;;;;;40993:9;41003:1;40993:12;;;;;;;;;;;;;;41020:10;41031:1;41020:13;;;;;;;;;;;;;;41048:10;41059:1;41048:13;;;;;;;;;;;;;;41076:14;41105:15;40855:276;;;;;;;;;;;;;-1:-1:-1::0;;;;;40855:276:0::2;-1:-1:-1::0;;;;;40855:276:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40855:276:0;40847:301:::2;;;::::0;;-1:-1:-1;;;40847:301:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40847:301:0;;;;;;;;;;;;;::::2;;41161:83;41171:10;41191;-1:-1:-1::0;;;;;41183:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41183:34:0;41219:13;;:10;;41230:1:::2;::::0;41219:13;::::2;;;;;;;;;;;41234:4;:9;;41242:1;41234:9;41161;:83::i;:::-;41255:84;41265:10;41285;-1:-1:-1::0;;;;;41277:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41277:35:0;41314:13;;:10;;41325:1:::2;::::0;41314:13;::::2;;;;;;;;;;;41329:4;:9;;41337:1;41329:9;41255;:84::i;:::-;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;39956:1391:0:o;9613:22::-;;;;;;-1:-1:-1;;;;;9613:22:0;;:::o;43096:1716::-;43423:20;43395:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;43488:1:::1;43469:9;:16;:20;43461:59;;;::::0;;-1:-1:-1;;;43461:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;43461:59:0;;;;;;;;;;;;;::::1;;43557:1;43539:15;:19;43531:65;;;;-1:-1:-1::0;;;43531:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43635:20;-1:-1:-1::0;;;;;43617:51:0::1;;43669:9;43680:10;43692:9;43702:1;43692:12;;;;;;;;;;;;;;43706:15;43617:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43740:9:0::1;::::0;-1:-1:-1;;;43735:643:0::1;43759:9;:16;43755:1;:20;43735:643;;;43825:1;43806:9;:16;:20;43801:1;:25;43797:527;;;43864:1;43851:14:::0;::::1;43847:208;;43903:9;43913:1;43903:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:30:0::1;;43934:4;43895:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:45:0::1;-1:-1:-1::0;;;;;43895:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43847:208:0::1;::::0;-1:-1:-1;43847:208:0::1;;43997:9;44007:1;43997:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:31:0::1;;44029:4;43989:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:46:0::1;-1:-1:-1::0;;;;;43989:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43847:208:0::1;43797:527;;;44112:1;44099:14:::0;::::1;44095:214;;44151:9;44161:1;44151:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:30:0::1;;44174:9;44184:1;44188;44184:5;44174:16;;;;;;;;;;;;;;44143:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:48:0::1;-1:-1:-1::0;;;;;44143:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;44095:214;44248:9;44258:1;44248:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:31:0::1;;44272:9;44282:1;44286;44282:5;44272:16;;;;;;;;;;;;;;44240:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:49:0::1;-1:-1:-1::0;;;;;44240:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;44095:214:0::1;44365:1;44351:15:::0;;::::1;::::0;43777:3:::1;43735:643;;;-1:-1:-1::0;44403:38:0::1;::::0;;-1:-1:-1;;;44403:38:0;;44435:4:::1;44403:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;44409:6:0::1;44403:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44403:38:0;;-1:-1:-1;44460:31:0;;::::1;;44452:86;;;;-1:-1:-1::0;;;44452:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44555:6;-1:-1:-1::0;;;;;44549:22:0::1;;44572:12;44549:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44596:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;44596:33:0;::::1;;;::::0;-1:-1:-1;44616:12:0;;44596:33:::1;::::0;;;44616:12;44596:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44647:157:0::1;::::0;;-1:-1:-1;;;;;44647:157:0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;44647:157:0::1;::::0;::::1;::::0;44726:10:::1;44647:157:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44647:157:0;;;;;;;::::1;43096:1716:::0;;;;;;;;;;:::o;34120:119::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34196:27:0::1;34226:5;34196:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;34196:35:0::1;::::0;;34120:119::o;50696:2075::-;51081:20;51062:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;51140:1:::1;51122:8;:15;:19;51114:58;;;::::0;;-1:-1:-1;;;51114:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;51114:58:0;;;;;;;;;;;;;::::1;;51210:11;:18;51191:8;:15;:37;51183:87;;;;-1:-1:-1::0;;;51183:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51325:1;51308:7;:14;:18;51289:8;:15;:37;51281:87;;;;-1:-1:-1::0;;;51281:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51405:1;51387:15;:19;51379:65;;;;-1:-1:-1::0;;;51379:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51478:9:::0;51517:7;51562:15;51457:18:::1;51629:47;-1:-1:-1::0;;;;;51629:35:0;::::1;51665:10;51629:47;:35;:47;:::i;:::-;51598:78;;51697:91;51706:10;51718:7;51726:1;51718:10;;;;;;;;;;;;;;51730;51742:16;-1:-1:-1::0;;;;;;;;;;;;;;;;51760:27:0::1;:10;-1:-1:-1::0;;;;;51760:27:0::1;;51697:8;:91::i;:::-;51806:9;51801:355;51825:8;:15;51821:1;:19;51801:355;;;51879:1;51866:14:::0;::::1;51862:240;;51919:11;51931:1;51919:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;51906:37:0::1;;51944:7;51952:1;51956;51952:5;51944:14;;;;;;;;;;;;;;51959:8;51968:1;51959:11;;;;;;;;;::::0;;::::1;::::0;;;;;;51906:69:::1;::::0;;-1:-1:-1;;;;;;51906:69:0::1;::::0;;;;;;-1:-1:-1;;;;;51906:69:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;51906:69:0;;;;;;;;;;;;;;;;;;-1:-1:-1;51906:69:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;;;52029:11;52041:1;52029:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52016:38:0::1;;52055:7;52063:1;52067;52063:5;52055:14;;;;;;;;;;;;;;52070:8;52079:1;52070:11;;;;;;;;;::::0;;::::1;::::0;;;;;;52016:70:::1;::::0;;-1:-1:-1;;;;;;52016:70:0::1;::::0;;;;;;-1:-1:-1;;;;;52016:70:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;52016:70:0;;;;;;;;;;;;;;;;;;-1:-1:-1;52016:70:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;52143:1;52129:15:::0;;::::1;::::0;51842:3:::1;51801:355;;;-1:-1:-1::0;;;;;;52171:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;52171:25:0::1;52168:325;;;52228:38;::::0;;-1:-1:-1;;;52228:38:0;;52260:4:::1;52228:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;52234:6:0::1;52228:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52228:38:0;52281:36:::1;::::0;;-1:-1:-1;;;52281:36:0;;::::1;::::0;::::1;::::0;;;;;52228:38;;-1:-1:-1;;;;;;52287:6:0::1;52281:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;52281:36:0;;;;;;;;-1:-1:-1;52281:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52332:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;52332:33:0;::::1;;;::::0;-1:-1:-1;52352:12:0;;52332:33:::1;::::0;;;52352:12;52332:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52168:325;;;52412:69;52460:20:::0;52412:43:::1;-1:-1:-1::0;;;;;52412:31:0;::::1;52444:10;52412:43;:31;:43;:::i;:::-;:47:::0;:69:::1;:47;:69;:::i;:::-;52397:84;;52168:325;52529:15;52513:12;:31;;52505:86;;;;-1:-1:-1::0;;;52505:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52609:154;::::0;;-1:-1:-1;;;;;52609:154:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;52684:10:::1;52609:154:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52609:154:0;;;;;;;::::1;33512:1;;;;50696:2075:::0;;;;;;;;;;;;;:::o;10552:228::-;10618:11;;-1:-1:-1;;;;;10618:11:0;10604:10;:25;10596:51;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;;;;10693:11;;;10684:7;;10663:42;;-1:-1:-1;;;;;10693:11:0;;;;;10684:7;;;;;;;10663:42;;;10726:11;;;;10716:21;;-1:-1:-1;;;;;;10716:21:0;10726:11;-1:-1:-1;;;;;10726:11:0;;10716:21;;;;-1:-1:-1;;;;;;10748:24:0;;;10552:228::o;41396:1692::-;41704:20;41676:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;41769:1:::1;41750:9;:16;:20;41742:59;;;::::0;;-1:-1:-1;;;41742:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41742:59:0;;;;;;;;;;;;;::::1;;41838:1;41820:15;:19;41812:65;;;;-1:-1:-1::0;;;41812:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41929:37;::::0;;-1:-1:-1;;;41929:37:0;;41955:10:::1;41929:37;::::0;::::1;::::0;;;41898:28:::1;::::0;-1:-1:-1;;;;;41929:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41929:37:0;41977:41:::1;::::0;;-1:-1:-1;;;41977:41:0;;;;41929:37;;-1:-1:-1;;;;;;41983:6:0::1;41977:21;::::0;::::1;::::0;42006:9:::1;::::0;41977:41:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;42006:9;41977:21;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42035:6;-1:-1:-1::0;;;;;42029:22:0::1;;42052:9;42062:1;42052:12;;;;;;;;;;;;;;42066:9;42029:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;42029:47:0::1;-1:-1:-1::0;;;;;42029:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42094:9:0::1;::::0;-1:-1:-1;42089:637:0::1;42113:9;:16;42109:1;:20;42089:637;;;42179:1;42160:9;:16;:20;42155:1;:25;42151:521;;;42218:1;42205:14:::0;::::1;42201:202;;42257:9;42267:1;42257:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:30:0::1;;42280:10;42249:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:42:0::1;-1:-1:-1::0;;;;;42249:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42201:202:0::1;::::0;-1:-1:-1;42201:202:0::1;;42348:9;42358:1;42348:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:31:0::1;;42372:10;42340:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:43:0::1;-1:-1:-1::0;;;;;42340:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42201:202:0::1;42151:521;;;42460:1;42447:14:::0;::::1;42443:214;;42499:9;42509:1;42499:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:30:0::1;;42522:9;42532:1;42536;42532:5;42522:16;;;;;;;;;;;;;;42491:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:48:0::1;-1:-1:-1::0;;;;;42491:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;42443:214;42596:9;42606:1;42596:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:31:0::1;;42620:9;42630:1;42634;42630:5;42620:16;;;;;;;;;;;;;;42588:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:49:0::1;-1:-1:-1::0;;;;;42588:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42443:214:0::1;42713:1;42699:15:::0;;::::1;::::0;42131:3:::1;42089:637;;;-1:-1:-1::0;42753:37:0::1;::::0;;-1:-1:-1;;;42753:37:0;;42779:10:::1;42753:37;::::0;::::1;::::0;;;:63:::1;::::0;42795:20;;-1:-1:-1;;;;;42753:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42753:37:0;;:63:::1;:41;:63;:::i;:::-;42738:78;;42851:15;42835:12;:31;;42827:86;;;;-1:-1:-1::0;;;42827:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42931:149;::::0;;-1:-1:-1;;;;;;;;;;;42931:149:0;;-1:-1:-1;;;;;42931:149:0;::::1;;::::0;::::1;::::0;43008:10:::1;42931:149:::0;;;;43033:9:::1;42931:149:::0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42931:149:0;;;;;;;::::1;33512:1;41396:1692:::0;;;;;;;;;:::o;46564:1736::-;46959:20;46931:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;47023:1:::1;47005:15;:19;46997:65;;;;-1:-1:-1::0;;;46997:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47083:28;47114:46;-1:-1:-1::0;;;;;47114:34:0;::::1;47149:10;47114:46;:34;:46;:::i;:::-;47083:77:::0;-1:-1:-1;;;;;;47175:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;47175:26:0::1;47171:332;;47218:189;::::0;;-1:-1:-1;;;47218:189:0;;-1:-1:-1;;;;;47218:189:0;;::::1;;::::0;::::1;::::0;47316:10:::1;47218:189:::0;;;;47353:4:::1;47218:189:::0;;;;;;;;;;;;47236:20:::1;47218:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;47218:189:0;;;;;;;;-1:-1:-1;47218:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47422:69:0::1;::::0;-1:-1:-1;;;;;;;;47422:37:0;::::1;47460:13:::0;47475:15;47422:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;47523:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;47515:75;;;;-1:-1:-1::0;;;47515:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47602:12;-1:-1:-1::0;;;;;47620:15:0;;::::1;::::0;47643:26;::::1;-1:-1:-1::0;;;;;;;;;;;47643:26:0::1;:42;;47684:1;47643:42;;;47672:9;47643:42;47687:14;47620:82;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;47620:82:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47601:101;;;47723:7;47715:65;;;;-1:-1:-1::0;;;47715:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47793:133;47841:10;47866:49;-1:-1:-1::0;;;;;47866:34:0;::::1;47909:4;47866:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;47793:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;47954:72;48005:20:::0;47954:46:::1;-1:-1:-1::0;;;;;47954:34:0;::::1;47989:10;47954:46;:34;:46;:::i;:72::-;47939:87;;48061:15;48045:12;:31;;48037:86;;;;-1:-1:-1::0;;;48037:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;48168:9:0::1;48192:7;48214:10;48239:15;48269:12;48141:151;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33512:1;;46564:1736:::0;;;;;;;;;;;;:::o;35854:1465::-;36278:14;32013:9;;36278:14;;;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;36236:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;36422:10:::0;36491:101:::2;36422:10:::0;36541:12;36568:13;36491:16:::2;:101::i;:::-;36443:149:::0;;-1:-1:-1;36443:149:0;-1:-1:-1;36625:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;36691:14;36666:21;:39;;36625:80;36603:173;;;;-1:-1:-1::0;;;36603:173:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36789:89;36798:10;36810:4;36824;-1:-1:-1::0;;;;;36816:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36816:28:0;36846:20;36876:1:::2;36868:9;::::0;::::2;;36789:8;:89::i;:::-;36889:91;36898:10;36910:4;36924;-1:-1:-1::0;;;;;36916:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36916:29:0;36947:21;36978:1:::2;36970:9;::::0;::::2;;36889:8;:91::i;:::-;37016:35;::::0;;-1:-1:-1;;;37016:35:0;;37040:10:::2;37016:35;::::0;::::2;::::0;;;-1:-1:-1;;;;;37016:23:0;::::2;::::0;::::2;::::0;:35;;;;;::::2;::::0;;;;;;;;-1:-1:-1;37016:23:0;:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37016:35:0;;-1:-1:-1;37102:1:0::2;37094:9;::::0;::::2;;:45:::0;::::2;;;;37119:20;37107:9;:32;37094:45;37090:104;;;37141:53;::::0;:10:::2;::::0;37161:9:::2;:32:::0;;::::2;37141:53:::0;::::2;;;::::0;::::2;::::0;;;37161:32;37141:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37090:104;37209:4;:9;;37217:1;37209:9;:46;;;;;37234:21;37222:9;:33;37209:46;37205:106;;;37257:54;::::0;:10:::2;::::0;37277:9:::2;:33:::0;;::::2;37257:54:::0;::::2;;;::::0;::::2;::::0;;;37277:33;37257:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37205:106;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;35854:1465;;;;-1:-1:-1;35854:1465:0;;-1:-1:-1;35854:1465:0;-1:-1:-1;;;;;35854:1465:0:o;32981:38::-;;;:::o;33071:46::-;;;;;;;;;;;;;;;:::o;9642:26::-;;;-1:-1:-1;;;;;9642:26:0;;:::o;34322:1524::-;34733:25;32013:9;;34733:25;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;34705:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;34807:18:::2;-1:-1:-1::0;;;;;34828:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;34828:26:0::2;:47;;34866:9;34828:47;;;34857:6;34828:47;34807:68:::0;-1:-1:-1;34890:19:0::2;-1:-1:-1::0;;;;;34912:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;34912:27:0::2;:49;;34951:10;34912:49;;;34942:6;34912:49;34996:218;::::0;;-1:-1:-1;;;34996:218:0;;-1:-1:-1;;;;;34996:218:0;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;;;-1:-1:-1;35004:13:0::2;34996:47:::0;;::::2;::::0;::::2;::::0;:218;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;34996:47:0;:218;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34996:218:0;;-1:-1:-1;35274:9:0;;-1:-1:-1;35320:10:0;;-1:-1:-1;35345:194:0::2;35372:10;34996:218:::0;35274:9;35466:12;-1:-1:-1;;;;;35497:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;35497:27:0::2;35345:8;:194::i;:::-;35554:197;35581:10;35610:17:::0;35646:11;35676:13;-1:-1:-1;;;;;35708:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;35708:28:0::2;35554:8;:197::i;:::-;-1:-1:-1::0;;35790:48:0::2;::::0;;-1:-1:-1;;;35790:48:0;;35827:10:::2;35790:48;::::0;::::2;::::0;;;-1:-1:-1;;;;;35790:36:0;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;-1:-1:-1;35790:36:0;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35790:48:0;32098:5;32086:17;;-1:-1:-1;;32086:17:0;;;34322:1524;;35790:48;;-1:-1:-1;34322:1524:0;;-1:-1:-1;;;;;;;;;;34322:1524:0:o;53227:1214::-;53572:18;32013:9;;53572:18;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53554:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53624:18:::2;53653:4;-1:-1:-1::0;;;;;53645:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53645:28:0;53706:29:::2;::::0;;-1:-1:-1;;;53706:29:0;;;;53645:28;;-1:-1:-1;53684:19:0::2;::::0;-1:-1:-1;;;;;53706:27:0;::::2;::::0;::::2;::::0;:29:::2;::::0;;::::2;::::0;53645:28:::2;::::0;53706:29;;;;;;;:27;:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53706:29:0;;-1:-1:-1;53756:70:0::2;53765:10;53785:4;53792:10:::0;53804;53824:1:::2;53816:9;::::0;::::2;;53756:8;:70::i;:::-;53837:72;53846:10;53866:4;53873:11;53886;53899:4;:9;;53907:1;53899:9;53837:8;:72::i;:::-;53935:14:::0;;53932:181:::2;;53966:56;-1:-1:-1::0;;;;;53966:38:0;::::2;54005:4:::0;54011:10;53966:56:::2;:38;:56;:::i;:::-;54050:51;::::0;;-1:-1:-1;;;54050:51:0;;54078:10:::2;54050:51;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54050:27:0;::::2;::::0;::::2;::::0;:51;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54050:27:0;:51;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54050:51:0;;-1:-1:-1;53932:181:0::2;54126:15:::0;;54123:187:::2;;54158:58;-1:-1:-1::0;;;;;54158:39:0;::::2;54198:4:::0;54204:11;54158:58:::2;:39;:58;:::i;:::-;54245:53;::::0;;-1:-1:-1;;;54245:53:0;;54274:10:::2;54245:53;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54245:28:0;::::2;::::0;::::2;::::0;:53;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54245:28:0;:53;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54245:53:0;;-1:-1:-1;54123:187:0::2;54344:13;54330:10;:27;;:60;;;;;54376:14;54361:11;:29;;54330:60;54322:111;;;;-1:-1:-1::0;;;54322:111:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;53227:1214:0;;;;-1:-1:-1;53227:1214:0;-1:-1:-1;;;;;;53227:1214:0:o;32931:43::-;;;:::o;33026:38::-;;;:::o;52841:376::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53052:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53073:91:::2;53082:10;53094:9;53113;-1:-1:-1::0;;;;;53105:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53105:34:0;53141:11;53162:1:::2;53154:9;::::0;::::2;;53073:8;:91::i;:::-;53175:34;::::0;;-1:-1:-1;;;53175:34:0;;53198:10:::2;53175:34;::::0;::::2;::::0;;;-1:-1:-1;;;;;53175:22:0;::::2;::::0;::::2;::::0;:34;;;;;-1:-1:-1;;53175:34:0;;;;;;;-1:-1:-1;53175:22:0;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;;52841:376:0:o;33997:115::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34070:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;34070:34:0::1;34100:4;34070:34;::::0;;33997:115::o;32879:45::-;;;:::o;10381:163::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;10485:7:::1;::::0;;10459:44:::1;::::0;-1:-1:-1;;;;;10459:44:0;;::::1;::::0;10485:7:::1;::::0;;::::1;;::::0;10459:44:::1;::::0;::::1;10514:11;:22:::0;;-1:-1:-1;;;;;;10514:22:0::1;-1:-1:-1::0;;;;;10514:22:0;;;::::1;::::0;;;::::1;::::0;;10381:163::o;44820:1736::-;45175:20;45147:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;45240:1:::1;45221:9;:16;:20;45213:59;;;::::0;;-1:-1:-1;;;45213:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;45213:59:0;;;;;;;;;;;;;::::1;;45309:1;45291:15;:19;45283:65;;;;-1:-1:-1::0;;;45283:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45392:37;::::0;;-1:-1:-1;;;45392:37:0;;45418:10:::1;45392:37;::::0;::::1;::::0;;;45361:28:::1;::::0;-1:-1:-1;;;;;45392:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45392:37:0;45515:12;;45392:37;;-1:-1:-1;;;;;;45458:20:0::1;45440:51;::::0;::::1;::::0;45492:9;;45503:10:::1;::::0;45515:9;;45525:1:::1;::::0;45515:12:::1;;;;;;;;;;45529:15;45440:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45563:9:0::1;::::0;-1:-1:-1;;;45558:636:0::1;45582:9;:16;45578:1;:20;45558:636;;;45648:1;45629:9;:16;:20;45624:1;:25;45620:520;;;45687:1;45674:14:::0;::::1;45670:202;;45726:9;45736:1;45726:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:30:0::1;;45749:10;45718:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:42:0::1;-1:-1:-1::0;;;;;45718:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45670:202:0::1;::::0;-1:-1:-1;45670:202:0::1;;45817:9;45827:1;45817:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:31:0::1;;45841:10;45809:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:43:0::1;-1:-1:-1::0;;;;;45809:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45670:202:0::1;45620:520;;;45928:1;45916:13:::0;::::1;45912:213;;45967:9;45977:1;45967:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:30:0::1;;45990:9;46000:1;46004;46000:5;45990:16;;;;;;;;;;;;;;45959:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:48:0::1;-1:-1:-1::0;;;;;45959:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;45912:213;46064:9;46074:1;46064:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:31:0::1;;46088:9;46098:1;46102;46098:5;46088:16;;;;;;;;;;;;;;46056:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:49:0::1;-1:-1:-1::0;;;;;46056:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45912:213:0::1;46181:1;46167:15:::0;;::::1;::::0;45600:3:::1;45558:636;;;-1:-1:-1::0;46219:37:0::1;::::0;;-1:-1:-1;;;46219:37:0;;46245:10:::1;46219:37;::::0;::::1;::::0;;;:63:::1;::::0;46261:20;;-1:-1:-1;;;;;46219:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;:63;46204:78;;46317:15;46301:12;:31;;46293:86;;;;-1:-1:-1::0;;;46293:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46397:151;::::0;;-1:-1:-1;;;;;46397:151:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;46470:10:::1;46397:151:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46397:151:0;;;;;;;::::1;33512:1;44820:1736:::0;;;;;;;;;;;:::o;54455:495::-;54618:5;54614:329;;;54644:10;;54640:183;;54681:6;-1:-1:-1;;;;;54675:21:0;;54704:6;54675:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54736:19:0;;54750:4;54736:19;;-1:-1:-1;54732:75:0;;54757:50;54787:6;54796:2;54800:6;54757:22;:50::i;:::-;54614:329;;;54855:76;;;-1:-1:-1;;;54855:76:0;;-1:-1:-1;;;;;54855:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54873:20;54855:51;;;;;;:76;;;;;-1:-1:-1;;54855:76:0;;;;;;;;-1:-1:-1;54855:51:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54614:329;54455:495;;;;;:::o;30708:374::-;30853:34;;;-1:-1:-1;;;30853:34:0;;30877:4;30853:34;;;;-1:-1:-1;;;;;30853:34:0;;;;;;;;;30833:17;;30853:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30853:34:0;;-1:-1:-1;30902:18:0;;;30898:177;;;30941:13;;30937:78;;30975:24;-1:-1:-1;;;;;30975:17:0;;30993:2;30997:1;30975:24;:17;:24;:::i;:::-;31029:34;-1:-1:-1;;;;;31029:17:0;;31047:2;-1:-1:-1;;31029:34:0;:17;:34;:::i;:::-;30708:374;;;;:::o;31326:129::-;31400:7;31427:5;-1:-1:-1;;;;;31427:15:0;;31443:3;31427:20;;;;;;;;;;;;;-1:-1:-1;;;;;31427:20:0;-1:-1:-1;;;;;31427:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31427:20:0;;-1:-1:-1;31326:129:0;;;;;:::o;30377:323::-;30512:10;;30508:185;;30543:12;30549:5;30543;:12::i;:::-;30539:143;;;30576:19;;-1:-1:-1;;;;;30576:11:0;;;:19;;;;;30588:6;;30576:19;;;;30588:6;30576:11;:19;;;;;;;;;;;;;;;;;;;;;30539:143;;;30636:30;-1:-1:-1;;;;;30636:18:0;;30655:2;30659:6;30636:30;:18;:30;:::i;:::-;30377:323;;;:::o;54958:440::-;55107:5;55103:288;;;55133:10;;55129:119;;55170:6;-1:-1:-1;;;;;55164:22:0;;55187:6;55164:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55213:19:0;;-1:-1:-1;;;;;55213:11:0;;;-1:-1:-1;55213:19:0;;;;;-1:-1:-1;55225:6:0;;55213:19;;;;55225:6;55213:11;:19;;;;;;;;;;;;;;;;;;;;;55129:119;55103:288;;;55284:10;;55280:100;;55315:49;55345:5;55353:2;55357:6;55315:22;:49::i;31090:228::-;31168:7;31192:12;31198:5;31192;:12::i;:::-;31188:123;;;-1:-1:-1;;;;;;31228:11:0;;;31221:18;;31188:123;31279:5;-1:-1:-1;;;;;31279:15:0;;31295:3;31279:20;;;;;;;;;;;;;-1:-1:-1;;;;;31279:20:0;-1:-1:-1;;;;;31279:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31279:20:0;;-1:-1:-1;31272:27:0;;14035:137;14093:7;14126:1;14121;:6;;14113:28;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;;;;-1:-1:-1;14159:5:0;;;14035:137::o;37327:1276::-;37475:28;37505:29;37548:19;37569:20;37601:10;-1:-1:-1;;;;;37593:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37593:37:0;;;;;;;;;-1:-1:-1;37593:37:0;-1:-1:-1;37645:17:0;;:37;;;;-1:-1:-1;37666:16:0;;37645:37;37641:157;;;37722:12;37699:35;;37773:13;37749:37;;37641:157;37812:17;;:36;;;;;37847:1;37833:11;:15;37812:36;37808:144;;;37888:12;37865:35;;37939:1;37915:25;;37808:144;37981:1;37966:12;:16;:35;;;;;38000:1;37986:11;:15;37966:35;37962:634;;;38018:25;38046:47;38067:12;38081:11;38046:20;:47::i;:::-;38018:75;;38108:26;38137:49;38158:13;38173:12;38137:20;:49::i;:::-;38108:78;;38226:18;38205:17;:39;38201:384;;38288:12;38265:35;;38343:53;38364:12;38378:17;38343:20;:53::i;:::-;38319:77;;38201:384;;;38461:13;38437:37;;38516:53;38537:11;38550:18;38516:20;:53::i;:::-;38493:76;;38201:384;37962:634;;;37327:1276;;;;;;;;:::o;27498:211::-;27642:58;;;-1:-1:-1;;;;;27642:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27642:58:0;-1:-1:-1;;;27642:58:0;;;27615:86;;27635:5;;27615:19;:86::i;28010:670::-;28428:10;;;28427:62;;-1:-1:-1;28444:39:0;;;-1:-1:-1;;;28444:39:0;;28468:4;28444:39;;;;-1:-1:-1;;;;;28444:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28444:39:0;:44;28427:62;28405:166;;;;-1:-1:-1;;;28405:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28609:62;;;-1:-1:-1;;;;;28609:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28609:62:0;-1:-1:-1;;;28609:62:0;;;28582:90;;28602:5;;28582:19;:90::i;31463:104::-;-1:-1:-1;;;;;31539:20:0;;-1:-1:-1;;;;;;;;;;;31539:20:0;31463:104;;;:::o;15156:128::-;15224:7;15251:25;15274:1;15251:18;:6;15262;15251:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;:::-;15244:32;15156:128;-1:-1:-1;;;15156:128:0:o;14882:127::-;14950:7;14994:6;14977:13;:6;14988:1;14977:13;:10;:13;:::i;:::-;:24;;;;;;;14882:127;-1:-1:-1;;;14882:127:0:o;29071:1046::-;29731:12;29745:23;29780:5;-1:-1:-1;;;;;29772:19:0;29792:4;29772:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29772:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29730:67;;;;29816:7;29808:52;;;;;-1:-1:-1;;;29808:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29877:17;;:21;29873:237;;30032:10;30021:30;;;;;;;;;;;;;;;-1:-1:-1;30021:30:0;30013:85;;;;-1:-1:-1;;;30013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13356:226;13414:7;13438:6;13434:47;;-1:-1:-1;13468:1:0;13461:8;;13434:47;13505:5;;;13509:1;13505;:5;:1;13529:5;;;;;:10;13521:32;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;;;13590:141;13648:7;13680:1;13676;:5;13668:32;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;;;;13722:1;13718;:5;;;

Swarm Source

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