Contract 0xc2544a32872a91f4a553b404c6950e89de901fdb 7

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf8f9f20c4898e827e36058f5b58ab8f9e107cdfd11dfc2092405667bb195fc32Swap Tokens For ...13281732022-06-28 8:43:0021 secs ago0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.19241472
0x962de515c06465f7472d6330cbb81be967981a7c85b5b1ee49adc59436aec436Swap Tokens For ...13279742022-06-28 8:01:0642 mins ago0xd0c44bfe57153fabbdd02c98568ed88925eca578 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.054378038
0x1bfbf95c4041852ef421a8d27cb0f4429eae459825524c698557d6e51da0382bSwap Tokens For ...13279742022-06-28 8:01:0642 mins ago0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.1958784
0xff278c8c202949c6e3bf7324e24da7fcfb0ec5b18959f6e43a2a2ec71b1ad606Swap Tokens For ...13277112022-06-28 7:05:421 hr 37 mins ago0xd0c44bfe57153fabbdd02c98568ed88925eca578 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.082948338
0x38a110a01aa452375fc5c0b679c90073fa786e9d91b4ff81da8202ab102561dfSwap Tokens For ...13277042022-06-28 7:04:121 hr 39 mins ago0xd0c44bfe57153fabbdd02c98568ed88925eca578 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.084460662
0xd3b486c15f754e623cd72f2d831454c34ea764edb610eb39d995cba2d31c4737Swap Tokens For ...13275122022-06-28 6:23:542 hrs 19 mins ago0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.12679776
0xa3b8ddc19af9d96399f1bae1c6a4d8a8738f721977ee6912588dc24fc9a313b7Swap Exact Token...13275122022-06-28 6:23:542 hrs 19 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.222332
0x11cef20bf6e3eda8e779b018475aa8ebf463bb6a50b81270cfcb3a458e2c2819Swap Exact ETH F...13273942022-06-28 5:58:542 hrs 44 mins ago0xd0c44bfe57153fabbdd02c98568ed88925eca578 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR0.06861768
0x5e09af201fedfc12c5fe98c60a61228d314965eaf0776467f2ee3e5f48d85239Swap Exact ETH F...13273812022-06-28 5:56:122 hrs 47 mins ago0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d IN  0xc2544a32872a91f4a553b404c6950e89de901fdb722 GLMR0.18000768
0x93384dbb198cc61bd55090e42e181d79d3ac56240c82a7df9730c491a34c71c3Swap Exact ETH F...13273492022-06-28 5:49:182 hrs 54 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb3,000 GLMR0.2102386
0x5be93eaff0e3cd3977c9a38062aa220b67d7d0465b80f6d57cabbf13088d716bSwap Exact ETH F...13269282022-06-28 4:21:424 hrs 21 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb3,000 GLMR0.019033077
0x2dbd836af7ce98409853b9c1c84ffd076be11fad40b3ebe501f1fc09493a3971Swap Exact ETH F...13269182022-06-28 4:19:364 hrs 23 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,474.980402175001927 GLMR0.0190311485
0x6c1ccaadcae5589d256fbaaf565d5179af50163ea45203c035d0108df73f0797Swap Exact ETH F...13268472022-06-28 4:04:544 hrs 38 mins ago0x2b46c40b6d1f4d77a6719f92864cf40bb049e366 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb5,000 GLMR0.0187528
0x83c0636133adf3b7ef8773c25eed2561777057e7b7603d1006ee59410fb2245cSwap Exact ETH F...13268322022-06-28 4:01:544 hrs 41 mins ago0x2b46c40b6d1f4d77a6719f92864cf40bb049e366 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb4,000 GLMR0.0187528
0xf7a79404832f8be7cee59053c99c966cf1efa7faea629707aeff647a6d43e1cdSwap Exact ETH F...13268272022-06-28 4:00:424 hrs 42 mins ago0x2b46c40b6d1f4d77a6719f92864cf40bb049e366 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb4,000 GLMR0.0157065
0x6727c29dab743736cd3afe900c2ba39508b24123bcf2c258c04657824177f01fSwap Exact ETH F...13268132022-06-28 3:57:544 hrs 45 mins ago0x2b46c40b6d1f4d77a6719f92864cf40bb049e366 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,000 GLMR0.0203448
0xb4312fc2b255611eb40c70889c452eee375043f3c3beef4e663e0eacb6b58ba5Swap Exact ETH F...13268002022-06-28 3:55:124 hrs 48 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,000 GLMR0.01601961
0x3747b4f843024e69072369a93dc5bd863f9a1060a95ff1809e045d96b71e18afSwap Exact ETH F...13267942022-06-28 3:54:004 hrs 49 mins ago0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d583 IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,000 GLMR0.0159410825
0x6f5ae271ce379964efcac49ba4268c2946e61e39431c5a3ce718385f3f5d7aacSwap Exact Token...13267332022-06-28 3:41:245 hrs 1 min ago0x457f077499f1c483701610e6762012b7e3b5297a IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.15940293
0xa1474ca11e6135c4335ae50dc31d8db09cf3d3e6691499fe423e233cb3a54407Swap Exact Token...13267162022-06-28 3:37:545 hrs 5 mins ago0x457f077499f1c483701610e6762012b7e3b5297a IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.15940293
0x50b8be5caad6e4f6abfb781d347d6b6c9a0db9df8a4e7518233b59c9bbbc2018Swap Tokens For ...13267112022-06-28 3:36:485 hrs 6 mins ago0x2ca0734664f6fc53df9fff714c668424666eda1c IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.010054
0x6b47779cf742f45b38a0fa47813936e51bcade326b62713ff1a9dff616b0f09bSwap Exact Token...13267112022-06-28 3:36:485 hrs 6 mins ago0x457f077499f1c483701610e6762012b7e3b5297a IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.15940293
0x471e6b501d275e367d6bd2136688629b11721276192df631e5b14e80db975827Swap Exact ETH F...13267102022-06-28 3:36:365 hrs 6 mins ago0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d IN  0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR0.20425344
0x8330880597589bd73a64a194b43ce778888f40e528aed02be95962d8e64fc537Swap Tokens For ...13267092022-06-28 3:36:245 hrs 6 mins ago0x2ca0734664f6fc53df9fff714c668424666eda1c IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.010055
0x619d742ac58a578ddde0c367fceafe2b3d1f5885701e1e3d8d780a05af3066ffSwap Exact Token...13267092022-06-28 3:36:245 hrs 6 mins ago0x457f077499f1c483701610e6762012b7e3b5297a IN  0xc2544a32872a91f4a553b404c6950e89de901fdb0 GLMR0.18456873
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa7d60a754a80d37ff6a563a31598de20c760a449d1ea835cc079562bf60de3c813246412022-06-27 20:13:5412 hrs 29 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d5833,999.999999999999874891 GLMR
0xa7d60a754a80d37ff6a563a31598de20c760a449d1ea835cc079562bf60de3c813246412022-06-27 20:13:5412 hrs 29 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb3,999.999999999999874891 GLMR
0x46ffd9bc1335f1e951ea4eb6b64cde141cb91d7caf494af946472a186f0a0cec13243302022-06-27 19:06:2413 hrs 36 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0x3c55b45f250128b1b8946e32991c4b566de001b968174c1ba549a91d2b5f354013243302022-06-27 19:06:2413 hrs 36 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0xfc1a3d9a0842df65f059f7a4f40936dfdbb89a3cda9e43c3ffbc179b69ca157b13241312022-06-27 18:23:0614 hrs 20 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d5834,000.000000000000204096 GLMR
0xfc1a3d9a0842df65f059f7a4f40936dfdbb89a3cda9e43c3ffbc179b69ca157b13241312022-06-27 18:23:0614 hrs 20 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb4,000.000000000000204096 GLMR
0x9582bb48f65963b2fadfc1e6662a626d4d95f3e056af292bb54ba7dbcb4532b213241132022-06-27 18:19:1814 hrs 24 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0x65a8e3e6b8f6ddadc15bd168f680bc6bc0dcc4dd1,500 GLMR
0x9582bb48f65963b2fadfc1e6662a626d4d95f3e056af292bb54ba7dbcb4532b213241132022-06-27 18:19:1814 hrs 24 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR
0x39eee0c03278cf92a35d8a3d725f614f342e3bb89de38b2dfd06642744c0dbd213241112022-06-27 18:18:4814 hrs 24 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xd0c44bfe57153fabbdd02c98568ed88925eca578129.1 GLMR
0x39eee0c03278cf92a35d8a3d725f614f342e3bb89de38b2dfd06642744c0dbd213241112022-06-27 18:18:4814 hrs 24 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb129.1 GLMR
0xf369bfeaef740902b7ed42c775626af5d3d054bfa685faf2b9ea319d13bce96413241092022-06-27 18:18:2414 hrs 24 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0x65a8e3e6b8f6ddadc15bd168f680bc6bc0dcc4dd1,500 GLMR
0xf369bfeaef740902b7ed42c775626af5d3d054bfa685faf2b9ea319d13bce96413241092022-06-27 18:18:2414 hrs 24 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR
0x3a2617476721f1347de8e8d05132fc330fb1e56f4cb99ce5d9bb7a585b0c42a913241012022-06-27 18:16:3614 hrs 26 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xd0c44bfe57153fabbdd02c98568ed88925eca5781,500 GLMR
0x3a2617476721f1347de8e8d05132fc330fb1e56f4cb99ce5d9bb7a585b0c42a913241012022-06-27 18:16:3614 hrs 26 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR
0xc9248f5dde9212ae82e4490b3f35a0d2d60ce72b845305e6552ebf684d5f117413241012022-06-27 18:16:3614 hrs 26 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xd6627bf88ff2ff87f12703daec3dfda4ec60fc4d1,500 GLMR
0xc9248f5dde9212ae82e4490b3f35a0d2d60ce72b845305e6552ebf684d5f117413241012022-06-27 18:16:3614 hrs 26 mins ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb1,500 GLMR
0x8f02d0a580c4df9cb6cc5d77dd37d754835b56b4e8899beb6f7ab9dd9d593bb913240632022-06-27 18:08:2414 hrs 34 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0x85649077912e49fba38ef9f2a4d73c546ba29d7d7b3c9bf196bc6d0b7a71628613237862022-06-27 17:08:0015 hrs 35 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0x8ccb49878cdc36d456059194068ba65a4e467cf36eae3f522b177b09ec3cef9713237852022-06-27 17:07:4815 hrs 35 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0xfd52b1c9594712bc2f4b1d83c335550664dbab752c3f8d80f334ebdb9e30c0fe13235732022-06-27 16:21:5416 hrs 21 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0xafe34031ca9387a43f88b40bb6c2699b87b5f12401611109c25f56917ef9bc3e13235732022-06-27 16:21:5416 hrs 21 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token4,000 GLMR
0x84d12b268dba5dcdae3cf90a292af2209fa06f0f7fea77a15d5ea16b4a9bda5713235662022-06-27 16:20:3016 hrs 22 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token1,500 GLMR
0x1cd8f4b756bc26d4b793f22454672b987bc0a685c30c0402114dfdd1707cf20f13233922022-06-27 15:43:1817 hrs ago 0xc2544a32872a91f4a553b404c6950e89de901fdb0xa5d20094cf1bc45b6ff1eb3b5a828865c1e8d5834,000.000000000000000699 GLMR
0x1cd8f4b756bc26d4b793f22454672b987bc0a685c30c0402114dfdd1707cf20f13233922022-06-27 15:43:1817 hrs ago Moonbeam: WGLMR Token 0xc2544a32872a91f4a553b404c6950e89de901fdb4,000.000000000000000699 GLMR
0x18f13a70fc5162fc9ec5d3fb82ad565723b7af0a3ff49d8ec29a13a6964c9eaa13229582022-06-27 14:11:1818 hrs 32 mins ago 0xc2544a32872a91f4a553b404c6950e89de901fdb Moonbeam: WGLMR Token4,000 GLMR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FraxswapRouter

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 150000 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-05-22
*/

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

// Sources flattened with hardhat v2.9.6 https://hardhat.org

// File contracts/Fraxswap/core/interfaces/IUniswapV2FactoryV5.sol


interface IUniswapV2FactoryV5 {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// File contracts/Fraxswap/core/interfaces/IUniswapV2PairV5.sol


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

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

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

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

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

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

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

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


// File contracts/Fraxswap/core/interfaces/IFraxswapPair.sol


// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ========================= IFraxswapPair ==========================
// ====================================================================
// Fraxswap LP Pair Interface
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm

// Frax Finance: https://github.com/FraxFinance

// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett

// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian

interface IFraxswapPair is IUniswapV2PairV5 {
    // TWAMM

    event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals);
    event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals);
    event CancelLongTermOrder(address indexed addr, uint256 orderId, address sellToken, uint256 unsoldAmount, address buyToken, uint256 purchasedAmount);
    event WithdrawProceedsFromLongTermOrder(address indexed addr, uint256 orderId, address indexed proceedToken, uint256 proceeds, bool orderExpired);

    function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
    function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
    function cancelLongTermSwap(uint256 orderId) external;
    function withdrawProceedsFromLongTermSwap(uint256 orderId) external returns (bool is_expired, address rewardTkn, uint256 totalReward);
    function executeVirtualOrders(uint256 blockTimestamp) external;

    function orderTimeInterval() external returns (uint256);
    function getTWAPHistoryLength() external view returns (uint);
    function getTwammReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast, uint112 _twammReserve0, uint112 _twammReserve1);
    function getReserveAfterTwamm(uint256 blockTimestamp) external view returns (uint112 _reserve0, uint112 _reserve1, uint256 lastVirtualOrderTimestamp, uint112 _twammReserve0, uint112 _twammReserve1);
    function getNextOrderID() external view returns (uint256);
    function getOrderIDsForUser(address user) external view returns (uint256[] memory);
    function getOrderIDsForUserLength(address user) external view returns (uint256);
//    function getDetailedOrdersForUser(address user, uint256 offset, uint256 limit) external view returns (LongTermOrdersLib.Order[] memory detailed_orders);
    function twammUpToDate() external view returns (bool);
    function getTwammState() external view returns (uint256 token0Rate, uint256 token1Rate, uint256 lastVirtualOrderTimestamp, uint256 orderTimeInterval_rtn, uint256 rewardFactorPool0, uint256 rewardFactorPool1);
    function getTwammSalesRateEnding(uint256 _blockTimestamp) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding);
    function getTwammRewardFactor(uint256 _blockTimestamp) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp);
    function getTwammOrder(uint256 orderId) external view returns (uint256 id, uint256 expirationTimestamp, uint256 saleRate, address owner, address sellTokenAddr, address buyTokenAddr);
    function getTwammOrderProceedsView(uint256 orderId, uint256 blockTimestamp) external view returns (bool orderExpired, uint256 totalReward);
    function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward);


    function togglePauseNewSwaps() external;
}


// File contracts/Fraxswap/libraries/TransferHelper.sol



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

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

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

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


// File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router01V5.sol


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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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


// File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router02V5.sol


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

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


// File contracts/Fraxswap/periphery/libraries/FraxswapRouterLibrary.sol


// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ======================= FraxswapRouterLibrary ======================
// ====================================================================
// Fraxswap Router Library Functions
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm

// Frax Finance: https://github.com/FraxFinance

// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett

// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost

// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM

library FraxswapRouterLibrary {

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

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

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);

        (uint reserve0, uint reserve1,) = IFraxswapPair(pairFor(factory, tokenA, tokenB)).getReserves();

        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    function getReservesWithTwamm(address factory, address tokenA, address tokenB) internal returns (uint reserveA, uint reserveB, uint twammReserveA, uint twammReserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);

        IFraxswapPair pair = IFraxswapPair(pairFor(factory, tokenA, tokenB));

        pair.executeVirtualOrders(block.timestamp);

        (uint reserve0, uint reserve1,,uint twammReserve0, uint twammReserve1) = pair.getTwammReserves();

        (reserveA, reserveB, twammReserveA, twammReserveB) = tokenA == token0 ? (reserve0, reserve1, twammReserve0, twammReserve1) : (reserve1, reserve0, twammReserve1, twammReserve0);
    }

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

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

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

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

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

    // performs chained getAmountOut calculations on any number of pairs with Twamm
    function getAmountsOutWithTwamm(address factory, uint amountIn, address[] memory path) internal returns (uint[] memory amounts) {
        require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            address pairAddress = FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]);
            IFraxswapPair(pairAddress).executeVirtualOrders(block.timestamp);
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs with Twamm
    function getAmountsInWithTwamm(address factory, uint amountOut, address[] memory path) internal returns (uint[] memory amounts) {
        require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            address pairAddress = FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]);
            IFraxswapPair(pairAddress).executeVirtualOrders(block.timestamp);
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}


// File contracts/Fraxswap/periphery/interfaces/IERC20.sol


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

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

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


// File contracts/Fraxswap/periphery/interfaces/IWETH.sol


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


// File contracts/Fraxswap/periphery/FraxswapRouter.sol


// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ========================== FraxswapRouter ==========================
// ====================================================================
// TWAMM Router
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm

// Frax Finance: https://github.com/FraxFinance

// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett

// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost

// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM
contract FraxswapRouter is IUniswapV2Router02V5 {

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2FactoryV5(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2FactoryV5(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB,,) = FraxswapRouterLibrary.getReservesWithTwamm(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = FraxswapRouterLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = FraxswapRouterLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IFraxswapPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IFraxswapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
        IFraxswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IFraxswapPair(pair).burn(to);
        (address token0,) = FraxswapRouterLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? type(uint).max : liquidity;
        IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = FraxswapRouterLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
        amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
        amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
        amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    virtual
    override
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
        amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = FraxswapRouterLibrary.sortTokens(input, output);
            IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
                (uint reserveInput, uint reserveOutput, uint twammReserveInput, uint twammReserveOutput) =  FraxswapRouterLibrary.getReservesWithTwamm(factory, input, output);
                amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput - twammReserveInput;
                amountOutput = FraxswapRouterLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
            'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
    external
    virtual
    override
    payable
    ensure(deadline)
    {
        require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
            'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
    external
    virtual
    override
    ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

    function getAmountsOutWithTwamm(uint amountIn, address[] memory path)
    public
    returns (uint[] memory amounts)
    {
        return FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
    }

    function getAmountsInWithTwamm(uint amountOut, address[] memory path)
    public
    returns (uint[] memory amounts)
    {
        return FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
    }
}

Contract ABI

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

60c06040523480156200001157600080fd5b506040516200609538038062006095833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a051615e4d62000248600039600081816101c2015281816103f00152818161061801528181610680015281816107a001528181610a8a01528181610f3d0152818161113f01528181611678015281816117cb0152818161190c015281816119f601528181611be801528181611c8301528181611fe9015281816120e0015281816121f5015281816122d601528181612357015281816129a901528181612cb201528181612d0801528181612d3c01528181612e0401528181612fad01528181613193015261322e0152600081816104dc01528181610873015281816109b501528181610b7d01528181610bb401528181610d53015281816110100152818161111d015281816112fc015281816115d001528181611ad501528181611cc201528181611e6401528181612162015281816123960152818161266d015281816129570152818161298701528181612b5801528181612ce60152818161308c0152818161326d01528181613e5c01528181613e8f015281816145280152818161455e015281816146b201528181614eeb01528181614fc001526150370152615e4d6000f3fe6080604052600436106101a55760003560e01c80638803dbee116100e1578063baa2abde1161008a578063ded9382a11610064578063ded9382a1461051e578063e8e337001461053e578063f305d71914610579578063fb3bdb411461058c57600080fd5b8063baa2abde146104aa578063c45a0155146104ca578063d06ca61f146104fe57600080fd5b8063af2979eb116100bb578063af2979eb14610457578063b66caf0614610477578063b6f9de951461049757600080fd5b80638803dbee146103be578063ad5c4648146103de578063ad615dec1461043757600080fd5b80634a25d94a1161014e578063704c32cf11610128578063704c32cf1461034b578063791ac9471461036b5780637ff36ab51461038b57806385f8c2591461039e57600080fd5b80634a25d94a146102eb5780635b0d59841461030b5780635c11d7951461032b57600080fd5b80631f00ca741161017f5780631f00ca741461028b5780632195995c146102ab57806338ed1739146102cb57600080fd5b806302751cec146101f6578063054d50d41461023057806318cbafe51461025e57600080fd5b366101f1573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101ef576101ef6154b7565b005b600080fd5b34801561020257600080fd5b5061021661021136600461551b565b61059f565b604080519283526020830191909152015b60405180910390f35b34801561023c57600080fd5b5061025061024b366004615579565b610707565b604051908152602001610227565b34801561026a57600080fd5b5061027e6102793660046155ea565b61071c565b604051610227919061565d565b34801561029757600080fd5b5061027e6102a63660046156d0565b610b76565b3480156102b757600080fd5b506102166102c63660046157de565b610baa565b3480156102d757600080fd5b5061027e6102e63660046155ea565b610ce1565b3480156102f757600080fd5b5061027e6103063660046155ea565b610eb9565b34801561031757600080fd5b50610250610326366004615888565b611115565b34801561033757600080fd5b506101ef6103463660046155ea565b611260565b34801561035757600080fd5b5061027e6103663660046156d0565b6115c9565b34801561037757600080fd5b506101ef6103863660046155ea565b6115f6565b61027e61039936600461591e565b611987565b3480156103aa57600080fd5b506102506103b9366004615579565b611de5565b3480156103ca57600080fd5b5061027e6103d93660046155ea565b611df2565b3480156103ea57600080fd5b506104127f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610227565b34801561044357600080fd5b50610250610452366004615579565b611f69565b34801561046357600080fd5b5061025061047236600461551b565b611f76565b34801561048357600080fd5b5061027e6104923660046156d0565b61215b565b6101ef6104a536600461591e565b612188565b3480156104b657600080fd5b506102166104c5366004615985565b6125f8565b3480156104d657600080fd5b506104127f000000000000000000000000000000000000000000000000000000000000000081565b34801561050a57600080fd5b5061027e6105193660046156d0565b612950565b34801561052a57600080fd5b50610216610539366004615888565b61297d565b34801561054a57600080fd5b5061055e6105593660046159f7565b612ace565b60408051938452602084019290925290820152606001610227565b61055e61058736600461551b565b612c3c565b61027e61059a36600461591e565b612f3e565b6000808242811015610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b610641897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6125f8565b90935091506106518986856133d2565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156106d957600080fd5b505af11580156106ed573d6000803e3d6000fd5b505050506106fb8583613568565b50965096945050505050565b6000610714848484613677565b949350505050565b60608142811015610789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866107cd600182615aa2565b8181106107dc576107dc615ab9565b90506020020160208101906107f19190615ae8565b73ffffffffffffffffffffffffffffffffffffffff161461086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6108cc7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137f292505050565b91508682600184516108de9190615aa2565b815181106108ee576108ee615ab9565b60200260200101511015610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610a498686600081811061099a5761099a615ab9565b90506020020160208101906109af9190615ae8565b33610a297f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106109e7576109e7615ab9565b90506020020160208101906109fc9190615ae8565b8b8b6001818110610a0f57610a0f615ab9565b9050602002016020810190610a249190615ae8565b613a8b565b85600081518110610a3c57610a3c615ab9565b6020026020010151613bc0565b610a8882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d5f915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610ad39190615aa2565b81518110610ae357610ae3615ab9565b60200260200101516040518263ffffffff1660e01b8152600401610b0991815260200190565b600060405180830381600087803b158015610b2357600080fd5b505af1158015610b37573d6000803e3d6000fd5b50505050610b6b848360018551610b4e9190615aa2565b81518110610b5e57610b5e615ab9565b6020026020010151613568565b509695505050505050565b6060610ba37f00000000000000000000000000000000000000000000000000000000000000008484613f71565b9392505050565b6000806000610bda7f00000000000000000000000000000000000000000000000000000000000000008f8f613a8b565b9050600087610be9578c610c0b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610ca057600080fd5b505af1158015610cb4573d6000803e3d6000fd5b50505050610cc78f8f8f8f8f8f8f6125f8565b809450819550505050509b509b9950505050505050505050565b60608142811015610d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b610dac7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137f292505050565b9150868260018451610dbe9190615aa2565b81518110610dce57610dce615ab9565b60200260200101511015610e64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610e7a8686600081811061099a5761099a615ab9565b610b6b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d5f915050565b60608142811015610f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168686610f6a600182615aa2565b818110610f7957610f79615ab9565b9050602002016020810190610f8e9190615ae8565b73ffffffffffffffffffffffffffffffffffffffff161461100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6110697f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b9150868260008151811061107f5761107f615ab9565b60200260200101511115610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b6000806111637f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613a8b565b9050600086611172578b611194565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b15801561122957600080fd5b505af115801561123d573d6000803e3d6000fd5b5050505061124f8d8d8d8d8d8d611f76565b9d9c50505050505050505050505050565b80428110156112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b61135c858560008181106112e1576112e1615ab9565b90506020020160208101906112f69190615ae8565b336113567f00000000000000000000000000000000000000000000000000000000000000008989600081811061132e5761132e615ab9565b90506020020160208101906113439190615ae8565b8a8a6001818110610a0f57610a0f615ab9565b8a613bc0565b6000858561136b600182615aa2565b81811061137a5761137a615ab9565b905060200201602081019061138f9190615ae8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190615b05565b90506114618686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508892506144b3915050565b86818787611470600182615aa2565b81811061147f5761147f615ab9565b90506020020160208101906114949190615ae8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190615b05565b6115319190615aa2565b10156115bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b5050505050505050565b6060610ba37f000000000000000000000000000000000000000000000000000000000000000084846137f2565b8042811015611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856116a5600182615aa2565b8181106116b4576116b4615ab9565b90506020020160208101906116c99190615ae8565b73ffffffffffffffffffffffffffffffffffffffff1614611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b61175c858560008181106112e1576112e1615ab9565b61179a8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506144b3915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190615b05565b9050868110156118dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050506115bf8482613568565b606081428110156119f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110611a3e57611a3e615ab9565b9050602002016020810190611a539190615ae8565b73ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b611b2e7f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506137f292505050565b9150868260018451611b409190615aa2565b81518110611b5057611b50615ab9565b60200260200101511015611be6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611c3557611c35615ab9565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c6857600080fd5b505af1158015611c7c573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611cf47f00000000000000000000000000000000000000000000000000000000000000008989600081811061132e5761132e615ab9565b84600081518110611d0757611d07615ab9565b60200260200101516040518363ffffffff1660e01b8152600401611d4d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d909190615b1e565b611d9c57611d9c6154b7565b611ddb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d5f915050565b5095945050505050565b6000610714848484614794565b60608142811015611e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b611ebd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b91508682600081518110611ed357611ed3615ab9565b60200260200101511115610e64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b6000610714848484614914565b60008142811015611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612012887f000000000000000000000000000000000000000000000000000000000000000089898930896125f8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506120b191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612088573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ac9190615b05565b6133d2565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561213957600080fd5b505af115801561214d573d6000803e3d6000fd5b50505050610b6b8483613568565b6060610ba37f00000000000000000000000000000000000000000000000000000000000000008484614240565b80428110156121f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061223d5761223d615ab9565b90506020020160208101906122529190615ae8565b73ffffffffffffffffffffffffffffffffffffffff16146122cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561233c57600080fd5b505af1158015612350573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123c87f00000000000000000000000000000000000000000000000000000000000000008989600081811061132e5761132e615ab9565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e9190615b1e565b61246a5761246a6154b7565b60008686612479600182615aa2565b81811061248857612488615ab9565b905060200201602081019061249d9190615ae8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561250b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252f9190615b05565b905061256f8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506144b3915050565b8781888861257e600182615aa2565b81811061258d5761258d615ab9565b90506020020160208101906125a29190615ae8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024016114e6565b6000808242811015612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b60006126937f00000000000000000000000000000000000000000000000000000000000000008c8c613a8b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561270f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127339190615b1e565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156127a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ca9190615b3b565b9150915060006127da8e8e614a56565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461281757818361281a565b82825b90975095508a8710156128af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b8986101561293f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b505050505097509795505050505050565b6060610ba37f00000000000000000000000000000000000000000000000000000000000000008484614c00565b60008060006129cd7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613a8b565b90506000876129dc578c6129fe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b50505050612ab98e8e8e8e8e8e61059f565b909f909e509c50505050505050505050505050565b60008060008342811015612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612b4c8c8c8c8c8c8c614e97565b90945092506000612b7e7f00000000000000000000000000000000000000000000000000000000000000008e8e613a8b565b9050612b8c8d338388613bc0565b612b988c338387613bc0565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2a9190615b05565b92505050985098509895505050505050565b60008060008342811015612cac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612cda8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614e97565b90945092506000612d2c7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613a8b565b9050612d3a8b338388613bc0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612da257600080fd5b505af1158015612db6573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e759190615b1e565b612e8157612e816154b7565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f139190615b05565b925083341115612f3057612f3033612f2b8634615aa2565b613568565b505096509650969350505050565b60608142811015612fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110612ff557612ff5615ab9565b905060200201602081019061300a9190615ae8565b73ffffffffffffffffffffffffffffffffffffffff1614613087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6130e57f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b915034826000815181106130fb576130fb615ab9565b60200260200101511115613191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106131e0576131e0615ab9565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561321357600080fd5b505af1158015613227573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61329f7f00000000000000000000000000000000000000000000000000000000000000008989600081811061132e5761132e615ab9565b846000815181106132b2576132b2615ab9565b60200260200101516040518363ffffffff1660e01b81526004016132f892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015613317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333b9190615b1e565b613347576133476154b7565b61338682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d5f915050565b8160008151811061339957613399615ab9565b6020026020010151341115611ddb57611ddb33836000815181106133bf576133bf615ab9565b602002602001015134612f2b9190615aa2565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916134699190615b8b565b6000604051808303816000865af19150503d80600081146134a6576040519150601f19603f3d011682016040523d82523d6000602084013e6134ab565b606091505b50915091508180156134d55750805115806134d55750808060200190518101906134d59190615b1e565b613561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610609565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161359f9190615b8b565b60006040518083038185875af1925050503d80600081146135dc576040519150601f19603f3d011682016040523d82523d6000602084013e6135e1565b606091505b5050905080613672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610609565b505050565b6000808411613708576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f494e5055545f414d4f554e54000000000000000000000000000000006064820152608401610609565b6000831180156137185750600082115b6137a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610609565b60006137b2856103e5615ba7565b905060006137c08483615ba7565b90506000826137d1876103e8615ba7565b6137db9190615be4565b90506137e78183615bfc565b979650505050505050565b6060600282511015613886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156138a0576138a06156a1565b6040519080825280602002602001820160405280156138c9578160200160208202803683370190505b50905082816000815181106138e0576138e0615ab9565b60200260200101818152505060005b600183516138fd9190615aa2565b811015613a8357600061394f8685848151811061391c5761391c615ab9565b6020026020010151868560016139329190615be4565b8151811061394257613942615ab9565b6020026020010151613a8b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156139b957600080fd5b505af11580156139cd573d6000803e3d6000fd5b50505050600080613a1d888786815181106139ea576139ea615ab9565b602002602001015188876001613a009190615be4565b81518110613a1057613a10615ab9565b60200260200101516151f6565b91509150613a45858581518110613a3657613a36615ab9565b60200260200101518383613677565b85613a51866001615be4565b81518110613a6157613a61615ab9565b6020026020010181815250505050508080613a7b90615c37565b9150506138ef565b509392505050565b6000806000613a9a8585614a56565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001613b809291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f56d8137e6dc7681d67b2c0b0ecb99a25da51343f540d36e93a2d172fea4597f7603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613c5f9190615b8b565b6000604051808303816000865af19150503d8060008114613c9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ca1565b606091505b5091509150818015613ccb575080511580613ccb575080806020019051810190613ccb9190615b1e565b613d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610609565b505050505050565b60005b60018351613d709190615aa2565b811015613f6b57600080848381518110613d8c57613d8c615ab9565b602002602001015185846001613da29190615be4565b81518110613db257613db2615ab9565b6020026020010151915091506000613dca8383614a56565b509050600087613ddb866001615be4565b81518110613deb57613deb615ab9565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613e3357826000613e37565b6000835b91509150600060028a51613e4b9190615aa2565b8810613e575788613e88565b613e887f0000000000000000000000000000000000000000000000000000000000000000878c6139328c6002615be4565b9050613eb57f00000000000000000000000000000000000000000000000000000000000000008888613a8b565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613eff576020820181803683370190505b506040518563ffffffff1660e01b8152600401613f1f9493929190615c6f565b600060405180830381600087803b158015613f3957600080fd5b505af1158015613f4d573d6000803e3d6000fd5b50505050505050505050508080613f6390615c37565b915050613d62565b50505050565b6060600282511015614005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff81111561401f5761401f6156a1565b604051908082528060200260200182016040528015614048578160200160208202803683370190505b50905082816001835161405b9190615aa2565b8151811061406b5761406b615ab9565b6020026020010181815250506000600183516140879190615aa2565b90505b8015613a83576140ca85846140a0600185615aa2565b815181106140b0576140b0615ab9565b602002602001015185848151811061394257613942615ab9565b73ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141389190615b1e565b61419e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b6000806141db87866141b1600187615aa2565b815181106141c1576141c1615ab9565b6020026020010151878681518110613a1057613a10615ab9565b915091506142038484815181106141f4576141f4615ab9565b60200260200101518383614794565b8461420f600186615aa2565b8151811061421f5761421f615ab9565b6020026020010181815250505050808061423890615ceb565b91505061408a565b60606002825110156142d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156142ee576142ee6156a1565b604051908082528060200260200182016040528015614317578160200160208202803683370190505b50905082816001835161432a9190615aa2565b8151811061433a5761433a615ab9565b6020026020010181815250506000600183516143569190615aa2565b90505b8015613a8357600061439b8685614371600186615aa2565b8151811061438157614381615ab9565b602002602001015186858151811061394257613942615ab9565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561440557600080fd5b505af1158015614419573d6000803e3d6000fd5b5050505060008061445c88876001876144329190615aa2565b8151811061444257614442615ab9565b6020026020010151888781518110613a1057613a10615ab9565b915091506144758585815181106141f4576141f4615ab9565b85614481600187615aa2565b8151811061449157614491615ab9565b60200260200101818152505050505080806144ab90615ceb565b915050614359565b60005b600183516144c49190615aa2565b811015613672576000808483815181106144e0576144e0615ab9565b6020026020010151858460016144f69190615be4565b8151811061450657614506615ab9565b602002602001015191509150600061451e8383614a56565b509050600061454e7f00000000000000000000000000000000000000000000000000000000000000008585613a8b565b90506000806000806000806145847f00000000000000000000000000000000000000000000000000000000000000008b8b6152f5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa158015614600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146249190615b05565b61462e9190615aa2565b6146389190615aa2565b9550614645868585613677565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146146895782600061468d565b6000835b91509150600060028c516146a19190615aa2565b8a106146ad578a6146de565b6146de7f0000000000000000000000000000000000000000000000000000000000000000898e6139328e6002615be4565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906147469086908690869060248101615c6f565b600060405180830381600087803b15801561476057600080fd5b505af1158015614774573d6000803e3d6000fd5b50505050505050505050505050808061478c90615c37565b9150506144b6565b6000808411614825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4f55545055545f414d4f554e540000000000000000000000000000006064820152608401610609565b6000831180156148355750600082115b6148c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610609565b60006148cd8585615ba7565b6148d9906103e8615ba7565b905060006148e78685615aa2565b6148f3906103e5615ba7565b90506148ff8183615bfc565b61490a906001615be4565b9695505050505050565b60008084116149a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610609565b6000831180156149b55750600082115b614a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610609565b82614a4c8386615ba7565b6107149190615bfc565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603614b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610609565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614b4e578284614b51565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610609565b9250929050565b6060600282511015614c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff811115614cae57614cae6156a1565b604051908082528060200260200182016040528015614cd7578160200160208202803683370190505b5090508281600081518110614cee57614cee615ab9565b60200260200101818152505060005b60018351614d0b9190615aa2565b811015613a8357614d3e85848381518110614d2857614d28615ab9565b6020026020010151858460016139329190615be4565b73ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dac9190615b1e565b614e12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b600080614e4187868581518110614e2b57614e2b615ab9565b602002602001015187866001613a009190615be4565b91509150614e5a848481518110613a3657613a36615ab9565b84614e66856001615be4565b81518110614e7657614e76615ab9565b60200260200101818152505050508080614e8f90615c37565b915050614cfd565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015614f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f589190615d20565b73ffffffffffffffffffffffffffffffffffffffff160361502f576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015615009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061502d9190615d20565b505b60008061505d7f00000000000000000000000000000000000000000000000000000000000000008b8b6152f5565b505091509150816000148015615071575080155b15615081578793508692506151e9565b600061508e898484614914565b90508781116151325785811015615127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b8894509250826151e7565b600061513f898486614914565b905089811115615151576151516154b7565b878110156151e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b94508793505b505b5050965096945050505050565b60008060006152058585614a56565b509050600080615216888888613a8b565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015615260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152849190615d6f565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146152e35780826152e6565b81815b90999098509650505050505050565b60008060008060006153078787614a56565b5090506000615317898989613a8b565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561538157600080fd5b505af1158015615395573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160a060405180830381865afa1580156153ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061540e9190615db2565b6dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146154935782848284615498565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461550857600080fd5b50565b8035615516816154e6565b919050565b60008060008060008060c0878903121561553457600080fd5b863561553f816154e6565b95506020870135945060408701359350606087013592506080870135615564816154e6565b8092505060a087013590509295509295509295565b60008060006060848603121561558e57600080fd5b505081359360208301359350604090920135919050565b60008083601f8401126155b757600080fd5b50813567ffffffffffffffff8111156155cf57600080fd5b6020830191508360208260051b8501011115614bf957600080fd5b60008060008060008060a0878903121561560357600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561562857600080fd5b61563489828a016155a5565b9095509350506060870135615648816154e6565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561569557835183529284019291840191600101615679565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156156e357600080fd5b8235915060208084013567ffffffffffffffff8082111561570357600080fd5b818601915086601f83011261571757600080fd5b813581811115615729576157296156a1565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561576c5761576c6156a1565b60405291825284820192508381018501918983111561578a57600080fd5b938501935b828510156157af576157a08561550b565b8452938501939285019261578f565b8096505050505050509250929050565b801515811461550857600080fd5b803560ff8116811461551657600080fd5b60008060008060008060008060008060006101608c8e03121561580057600080fd5b8b3561580b816154e6565b9a5060208c013561581b816154e6565b995060408c0135985060608c0135975060808c0135965060a08c0135615840816154e6565b955060c08c0135945060e08c0135615857816157bf565b93506158666101008d016157cd565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d0312156158a857600080fd5b8a356158b3816154e6565b995060208b0135985060408b0135975060608b0135965060808b01356158d8816154e6565b955060a08b0135945060c08b01356158ef816157bf565b93506158fd60e08c016157cd565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561593657600080fd5b85359450602086013567ffffffffffffffff81111561595457600080fd5b615960888289016155a5565b9095509350506040860135615974816154e6565b949793965091946060013592915050565b600080600080600080600060e0888a0312156159a057600080fd5b87356159ab816154e6565b965060208801356159bb816154e6565b955060408801359450606088013593506080880135925060a08801356159e0816154e6565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215615a1457600080fd5b8835615a1f816154e6565b97506020890135615a2f816154e6565b965060408901359550606089013594506080890135935060a0890135925060c0890135615a5b816154e6565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015615ab457615ab4615a73565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215615afa57600080fd5b8135610ba3816154e6565b600060208284031215615b1757600080fd5b5051919050565b600060208284031215615b3057600080fd5b8151610ba3816157bf565b60008060408385031215615b4e57600080fd5b505080516020909101519092909150565b60005b83811015615b7a578181015183820152602001615b62565b83811115613f6b5750506000910152565b60008251615b9d818460208701615b5f565b9190910192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615bdf57615bdf615a73565b500290565b60008219821115615bf757615bf7615a73565b500190565b600082615c32577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615c6857615c68615a73565b5060010190565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff831660408201526080606082015260008251806080840152615cb68160a0850160208701615b5f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b600081615cfa57615cfa615a73565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060208284031215615d3257600080fd5b8151610ba3816154e6565b80516dffffffffffffffffffffffffffff8116811461551657600080fd5b805163ffffffff8116811461551657600080fd5b600080600060608486031215615d8457600080fd5b615d8d84615d3d565b9250615d9b60208501615d3d565b9150615da960408501615d5b565b90509250925092565b600080600080600060a08688031215615dca57600080fd5b615dd386615d3d565b9450615de160208701615d3d565b9350615def60408701615d5b565b9250615dfd60608701615d3d565b9150615e0b60808701615d3d565b9050929550929590935056fea26469706673582212200fd6004382ce51bea931d5e9e7a639dfde62137f4fa7330d49767627c5cadb5164736f6c634300080d00330000000000000000000000005ca135cb8527d76e932f34b5145575f9d8cbe08e000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

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

0000000000000000000000005ca135cb8527d76e932f34b5145575f9d8cbe08e000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

-----Decoded View---------------
Arg [0] : _factory (address): 0x5ca135cb8527d76e932f34b5145575f9d8cbe08e
Arg [1] : _WETH (address): 0xacc15dc74880c9944775448304b263d191c6077f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005ca135cb8527d76e932f34b5145575f9d8cbe08e
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f


Deployed ByteCode Sourcemap

25553:19061:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26005:10;:18;26019:4;26005:18;;25998:26;;;;:::i;:::-;25553:19061;;;;;30205:673;;;;;;;;;;-1:-1:-1;30205:673:0;;;;;:::i;:::-;;:::i;:::-;;;;1343:25:1;;;1399:2;1384:18;;1377:34;;;;1316:18;30205:673:0;;;;;;;;43164:247;;;;;;;;;;-1:-1:-1;43164:247:0;;;;;:::i;:::-;;:::i;:::-;;;1889:25:1;;;1877:2;1862:18;43164:247:0;1743:177:1;37456:851:0;;;;;;;;;;-1:-1:-1;37456:851:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43919:238::-;;;;;;;;;;-1:-1:-1;43919:238:0;;;;;:::i;:::-;;:::i;30884:687::-;;;;;;;;;;-1:-1:-1;30884:687:0;;;;;:::i;:::-;;:::i;34635:648::-;;;;;;;;;;-1:-1:-1;34635:648:0;;;;;:::i;:::-;;:::i;36621:829::-;;;;;;;;;;-1:-1:-1;36621:829:0;;;;;:::i;:::-;;:::i;33041:728::-;;;;;;;;;;-1:-1:-1;33041:728:0;;;;;:::i;:::-;;:::i;40522:717::-;;;;;;;;;;-1:-1:-1;40522:717:0;;;;;:::i;:::-;;:::i;44165:219::-;;;;;;;;;;-1:-1:-1;44165:219:0;;;;;:::i;:::-;;:::i;42085:834::-;;;;;;;;;;-1:-1:-1;42085:834:0;;;;;:::i;:::-;;:::i;35921:694::-;;;;;;:::i;:::-;;:::i;43419:246::-;;;;;;;;;;-1:-1:-1;43419:246:0;;;;;:::i;:::-;;:::i;35289:626::-;;;;;;;;;;-1:-1:-1;35289:626:0;;;;;:::i;:::-;;:::i;25658:38::-;;;;;;;;;;;;;;;;;;8503:42:1;8491:55;;;8473:74;;8461:2;8446:18;25658:38:0;8327:226:1;42963:193:0;;;;;;;;;;-1:-1:-1;42963:193:0;;;;;:::i;:::-;;:::i;32335:700::-;;;;;;;;;;-1:-1:-1;32335:700:0;;;;;:::i;:::-;;:::i;44392:219::-;;;;;;;;;;-1:-1:-1;44392:219:0;;;;;:::i;:::-;;:::i;41245:834::-;;;;;;:::i;:::-;;:::i;29324:875::-;;;;;;;;;;-1:-1:-1;29324:875:0;;;;;:::i;:::-;;:::i;25610:41::-;;;;;;;;;;;;;;;43673:238;;;;;;;;;;-1:-1:-1;43673:238:0;;;;;:::i;:::-;;:::i;31577:679::-;;;;;;;;;;-1:-1:-1;31577:679:0;;;;;:::i;:::-;;:::i;27555:742::-;;;;;;;;;;-1:-1:-1;27555:742:0;;;;;:::i;:::-;;:::i;:::-;;;;10449:25:1;;;10505:2;10490:18;;10483:34;;;;10533:18;;;10526:34;10437:2;10422:18;27555:742:0;10247:319:1;28303:978:0;;;;;;:::i;:::-;;:::i;38313:807::-;;;;;;:::i;:::-;;:::i;30205:673::-;30442:16;30460:14;30423:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;;;;;;;;;30514:196:::1;30544:5;30564:4;30583:9;30607:14;30636:12;30671:4;30691:8;30514:15;:196::i;:::-;30487:223:::0;;-1:-1:-1;30487:223:0;-1:-1:-1;30721:51:0::1;30749:5:::0;30756:2;30487:223;30721:27:::1;:51::i;:::-;30783:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;30789:4:0::1;30783:20;;::::0;::::1;::::0;1862:18:1;;30783:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30825:45;30856:2;30860:9;30825:30;:45::i;:::-;30205:673:::0;;;;;;;;;;:::o;43164:247::-;43297:14;43336:67;43371:8;43381:9;43392:10;43336:34;:67::i;:::-;43329:74;43164:247;-1:-1:-1;;;;43164:247:0:o;37456:851::-;37650:21;37626:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;37697:29:::1;37722:4;37697:29;:4:::0;;37702:15:::1;37716:1;37697:4:::0;37702:15:::1;:::i;:::-;37697:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;37689:72;;;::::0;::::1;::::0;;11887:2:1;37689:72:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;37689:72:0::1;11685:354:1::0;37689:72:0::1;37782:69;37827:7;37836:8;37846:4;;37782:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37782:44:0::1;::::0;-1:-1:-1;;;37782:69:0:i:1;:::-;37772:79;;37901:12;37870:7;37895:1;37878:7;:14;:18;;;;:::i;:::-;37870:27;;;;;;;;:::i;:::-;;;;;;;:43;;37862:100;;;::::0;::::1;::::0;;12246:2:1;37862:100:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;12395:14;12375:18;;;12368:42;12427:19;;37862:100:0::1;12044:408:1::0;37862:100:0::1;37973:146;38019:4;;38024:1;38019:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38028:10;38040:56;38070:7;38079:4;;38084:1;38079:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38088:4;;38093:1;38088:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38040:29;:56::i;:::-;38098:7;38106:1;38098:10;;;;;;;;:::i;:::-;;;;;;;37973:31;:146::i;:::-;38130:35;38136:7;38145:4;;38130:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38159:4:0::1;::::0;-1:-1:-1;38130:5:0::1;::::0;-1:-1:-1;;38130:35:0:i:1;:::-;38182:4;38176:20;;;38197:7;38222:1;38205:7;:14;:18;;;;:::i;:::-;38197:27;;;;;;;;:::i;:::-;;;;;;;38176:49;;;;;;;;;;;;;1889:25:1::0;;1877:2;1862:18;;1743:177;38176:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38236:63;38267:2;38271:7;38296:1;38279:7;:14;:18;;;;:::i;:::-;38271:27;;;;;;;;:::i;:::-;;;;;;;38236:30;:63::i;:::-;37456:851:::0;;;;;;;;;:::o;43919:238::-;44043:21;44089:60;44124:7;44133:9;44144:4;44089:34;:60::i;:::-;44082:67;43919:238;-1:-1:-1;;;43919:238:0:o;30884:687::-;31190:12;31204;31229;31244:54;31274:7;31283:6;31291;31244:29;:54::i;:::-;31229:69;;31309:10;31322;:39;;31352:9;31322:39;;;31335:14;31322:39;31372:79;;;;;31399:10;31372:79;;;12829:34:1;31419:4:0;12879:18:1;;;12872:43;12931:18;;;12924:34;;;12974:18;;;12967:34;;;13050:4;13038:17;;13017:19;;;13010:46;13072:19;;;13065:35;;;13116:19;;;13109:35;;;31309:52:0;;-1:-1:-1;31372:26:0;;;;;;12740:19:1;;31372:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31483:80;31499:6;31507;31515:9;31526:10;31538;31550:2;31554:8;31483:15;:80::i;:::-;31462:101;;;;;;;;31218:353;;30884:687;;;;;;;;;;;;;;:::o;34635:648::-;34859:21;34840:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;34903:69:::1;34948:7;34957:8;34967:4;;34903:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34903:44:0::1;::::0;-1:-1:-1;;;34903:69:0:i:1;:::-;34893:79;;35022:12;34991:7;35016:1;34999:7;:14;:18;;;;:::i;:::-;34991:27;;;;;;;;:::i;:::-;;;;;;;:43;;34983:100;;;::::0;::::1;::::0;;12246:2:1;34983:100:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;12395:14;12375:18;;;12368:42;12427:19;;34983:100:0::1;12044:408:1::0;34983:100:0::1;35094:146;35140:4;;35145:1;35140:7;;;;;;;:::i;35094:146::-;35251:24;35257:7;35266:4;;35251:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35272:2:0;;-1:-1:-1;35251:5:0::1;::::0;-1:-1:-1;;35251:24:0:i:1;36621:829::-:0;36815:21;36791:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;36862:29:::1;36887:4;36862:29;:4:::0;;36867:15:::1;36881:1;36862:4:::0;36867:15:::1;:::i;:::-;36862:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;36854:72;;;::::0;::::1;::::0;;11887:2:1;36854:72:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;36854:72:0::1;11685:354:1::0;36854:72:0::1;36947:69;36991:7;37000:9;37011:4;;36947:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36947:43:0::1;::::0;-1:-1:-1;;;36947:69:0:i:1;:::-;36937:79;;37049:11;37035:7;37043:1;37035:10;;;;;;;;:::i;:::-;;;;;;;:25;;37027:78;;;::::0;::::1;::::0;;13357:2:1;37027:78:0::1;::::0;::::1;13339:21:1::0;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;13506:10;13486:18;;;13479:38;13534:19;;37027:78:0::1;13155:404:1::0;33041:728:0;33359:14;33386:12;33401:51;33431:7;33440:5;33447:4;33401:29;:51::i;:::-;33386:66;;33463:10;33476;:39;;33506:9;33476:39;;;33489:14;33476:39;33526:79;;;;;33553:10;33526:79;;;12829:34:1;33573:4:0;12879:18:1;;;12872:43;12931:18;;;12924:34;;;12974:18;;;12967:34;;;13050:4;13038:17;;13017:19;;;13010:46;13072:19;;;13065:35;;;13116:19;;;13109:35;;;33463:52:0;;-1:-1:-1;33526:26:0;;;;;;12740:19:1;;33526:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33628:133;33690:5;33697:9;33708:14;33724:12;33738:2;33742:8;33628:47;:133::i;:::-;33616:145;33041:728;-1:-1:-1;;;;;;;;;;;;;33041:728:0:o;40522:717::-;40756:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;40777:144:::1;40823:4;;40828:1;40823:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40832:10;40844:56;40874:7;40883:4;;40888:1;40883:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40892:4;;40897:1;40892:7;;;;;;;:::i;40844:56::-;40902:8;40777:31;:144::i;:::-;40932:18;40960:4:::0;;40965:15:::1;40979:1;40960:4:::0;40965:15:::1;:::i;:::-;40960:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40953:43;::::0;;;;:39:::1;8491:55:1::0;;;40953:43:0::1;::::0;::::1;8473:74:1::0;40953:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;40953:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40932:64;;41007:44;41042:4;;41007:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41048:2:0;;-1:-1:-1;41007:34:0::1;::::0;-1:-1:-1;;41007:44:0:i:1;:::-;41147:12:::0;41130:13;41091:4;;41096:15:::1;41110:1;41091:4:::0;41096:15:::1;:::i;:::-;41091:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41084:43;::::0;;;;:39:::1;8491:55:1::0;;;41084:43:0::1;::::0;::::1;8473:74:1::0;41084:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;41084:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;41062:169;;;::::0;::::1;::::0;;12246:2:1;41062:169:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;12395:14;12375:18;;;12368:42;12427:19;;41062:169:0::1;12044:408:1::0;41062:169:0::1;40766:473;40522:717:::0;;;;;;;:::o;44165:219::-;44261:21;44307:69;44352:7;44361:8;44371:4;44307:44;:69::i;42085:834::-;42336:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;42370:29:::1;42395:4;42370:29;:4:::0;;42375:15:::1;42389:1;42370:4:::0;42375:15:::1;:::i;:::-;42370:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;42362:72;;;::::0;::::1;::::0;;11887:2:1;42362:72:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;42362:72:0::1;11685:354:1::0;42362:72:0::1;42445:144;42491:4;;42496:1;42491:7;;;;;;;:::i;42445:144::-;42600:55;42635:4;;42600:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42649:4:0::1;::::0;-1:-1:-1;42600:34:0::1;::::0;-1:-1:-1;;42600:55:0:i:1;:::-;42683:37;::::0;;;;42714:4:::1;42683:37;::::0;::::1;8473:74:1::0;42666:14:0::1;::::0;42690:4:::1;42683:22;;::::0;::::1;::::0;8446:18:1;;42683:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42666:54;;42752:12;42739:9;:25;;42731:82;;;::::0;::::1;::::0;;12246:2:1;42731:82:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;12395:14;12375:18;;;12368:42;12427:19;;42731:82:0::1;12044:408:1::0;42731:82:0::1;42824:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;42830:4:0::1;42824:20;;::::0;::::1;::::0;1862:18:1;;42824:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42866:45;42897:2;42901:9;42866:30;:45::i;35921:694::-:0;36113:21;36089:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;36171:4:::1;36160:15;;:4;;36165:1;36160:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;36152:58;;;::::0;::::1;::::0;;11887:2:1;36152:58:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;36152:58:0::1;11685:354:1::0;36152:58:0::1;36231:70;36276:7;36285:9;36296:4;;36231:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36231:44:0::1;::::0;-1:-1:-1;;;36231:70:0:i:1;:::-;36221:80;;36351:12;36320:7;36345:1;36328:7;:14;:18;;;;:::i;:::-;36320:27;;;;;;;;:::i;:::-;;;;;;;:43;;36312:100;;;::::0;::::1;::::0;;12246:2:1;36312:100:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;12395:14;12375:18;;;12368:42;12427:19;;36312:100:0::1;12044:408:1::0;36312:100:0::1;36429:4;36423:19;;;36450:7;36458:1;36450:10;;;;;;;;:::i;:::-;;;;;;;36423:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;36487:4;36481:20;;;36502:56;36532:7;36541:4;;36546:1;36541:7;;;;;;;:::i;36502:56::-;36560:7;36568:1;36560:10;;;;;;;;:::i;:::-;;;;;;;36481:90;;;;;;;;;;;;;;;13957:42:1::0;13945:55;;;;13927:74;;14032:2;14017:18;;14010:34;13915:2;13900:18;;13753:297;36481:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36474:98;;;;:::i;:::-;36583:24;36589:7;36598:4;;36583:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36604:2:0;;-1:-1:-1;36583:5:0::1;::::0;-1:-1:-1;;36583:24:0:i:1;:::-;35921:694:::0;;;;;;;;:::o;43419:246::-;43552:13;43590:67;43624:9;43635;43646:10;43590:33;:67::i;35289:626::-;35513:21;35494:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;35557:69:::1;35601:7;35610:9;35621:4;;35557:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35557:43:0::1;::::0;-1:-1:-1;;;35557:69:0:i:1;:::-;35547:79;;35659:11;35645:7;35653:1;35645:10;;;;;;;;:::i;:::-;;;;;;;:25;;35637:78;;;::::0;::::1;::::0;;13357:2:1;35637:78:0::1;::::0;::::1;13339:21:1::0;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;13506:10;13486:18;;;13479:38;13534:19;;35637:78:0::1;13155:404:1::0;42963:193:0;43060:12;43092:56;43120:7;43129:8;43139;43092:27;:56::i;32335:700::-;32601:14;32582:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;32644:196:::1;32674:5;32694:4;32713:9;32737:14;32766:12;32801:4;32821:8;32644:15;:196::i;:::-;32890:38;::::0;;;;32922:4:::1;32890:38;::::0;::::1;8473:74:1::0;32628:212:0;;-1:-1:-1;32851:78:0::1;::::0;-1:-1:-1;32879:5:0;;32886:2;;32890:23:::1;::::0;::::1;::::0;::::1;::::0;8446:18:1;;32890:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32851:27;:78::i;:::-;32940:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;32946:4:0::1;32940:20;;::::0;::::1;::::0;1862:18:1;;32940:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32982:45;33013:2;33017:9;32982:30;:45::i;44392:219::-:0;44488:21;44534:69;44578:7;44587:9;44598:4;44534:43;:69::i;41245:834::-;41485:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;41530:4:::1;41519:15;;:4;;41524:1;41519:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;41511:58;;;::::0;::::1;::::0;;11887:2:1;41511:58:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;41511:58:0::1;11685:354:1::0;41511:58:0::1;41580:13;41596:9;41580:25;;41622:4;41616:19;;;41643:8;41616:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;41678:4;41672:20;;;41693:56;41723:7;41732:4;;41737:1;41732:7;;;;;;;:::i;41693:56::-;41672:88;::::0;;::::1;::::0;;;;;;13957:42:1;13945:55;;;41672:88:0::1;::::0;::::1;13927:74:1::0;14017:18;;;14010:34;;;13900:18;;41672:88:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41665:96;;;;:::i;:::-;41772:18;41800:4:::0;;41805:15:::1;41819:1;41800:4:::0;41805:15:::1;:::i;:::-;41800:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41793:43;::::0;;;;:39:::1;8491:55:1::0;;;41793:43:0::1;::::0;::::1;8473:74:1::0;41793:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;41793:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41772:64;;41847:44;41882:4;;41847:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41888:2:0;;-1:-1:-1;41847:34:0::1;::::0;-1:-1:-1;;41847:44:0:i:1;:::-;41987:12:::0;41970:13;41931:4;;41936:15:::1;41950:1;41931:4:::0;41936:15:::1;:::i;:::-;41931:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41924:43;::::0;;;;:39:::1;8491:55:1::0;;;41924:43:0::1;::::0;::::1;8473:74:1::0;41924:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;41924:43:0::1;8327:226:1::0;29324:875:0;29578:12;29592;29559:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;29617:12:::1;29632:54;29662:7;29671:6;29679;29632:29;:54::i;:::-;29697:61;::::0;;;;29730:10:::1;29697:61;::::0;::::1;14568:34:1::0;29697:32:0::1;::::0;::::1;14618:18:1::0;;;14611:43;;;14670:18;;;14663:34;;;29617:69:0;;-1:-1:-1;29697:32:0::1;::::0;14480:18:1;;29697:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29826:28:0::1;::::0;;;;:24:::1;8491:55:1::0;;;29826:28:0::1;::::0;::::1;8473:74:1::0;29796:12:0::1;::::0;;;29826:24;::::1;::::0;::::1;::::0;8446:18:1;;29826:28:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29795:59;;;;29866:14;29885:48;29918:6;29926;29885:32;:48::i;:::-;29865:68;;;29975:6;29965:16;;:6;:16;;;:58;;30006:7;30015;29965:58;;;29985:7;29994;29965:58;29944:79:::0;;-1:-1:-1;29944:79:0;-1:-1:-1;30042:21:0;;::::1;;30034:73;;;::::0;::::1;::::0;;15160:2:1;30034:73:0::1;::::0;::::1;15142:21:1::0;15199:2;15179:18;;;15172:30;15238:34;15218:18;;;15211:62;15309:9;15289:18;;;15282:37;15336:19;;30034:73:0::1;14958:403:1::0;30034:73:0::1;30137:10;30126:7;:21;;30118:73;;;::::0;::::1;::::0;;15568:2:1;30118:73:0::1;::::0;::::1;15550:21:1::0;15607:2;15587:18;;;15580:30;15646:34;15626:18;;;15619:62;15717:9;15697:18;;;15690:37;15744:19;;30118:73:0::1;15366:403:1::0;30118:73:0::1;29606:593;;;;29324:875:::0;;;;;;;;;;;:::o;43673:238::-;43797:21;43843:60;43879:7;43888:8;43898:4;43843:35;:60::i;31577:679::-;31866:16;31884:14;31911:12;31926:51;31956:7;31965:5;31972:4;31926:29;:51::i;:::-;31911:66;;31988:10;32001;:39;;32031:9;32001:39;;;32014:14;32001:39;32051:79;;;;;32078:10;32051:79;;;12829:34:1;32098:4:0;12879:18:1;;;12872:43;12931:18;;;12924:34;;;12974:18;;;12967:34;;;13050:4;13038:17;;13017:19;;;13010:46;13072:19;;;13065:35;;;13116:19;;;13109:35;;;31988:52:0;;-1:-1:-1;32051:26:0;;;;;;12740:19:1;;32051:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32168:80;32187:5;32194:9;32205:14;32221:12;32235:2;32239:8;32168:18;:80::i;:::-;32141:107;;;;-1:-1:-1;31577:679:0;-1:-1:-1;;;;;;;;;;;;;31577:679:0:o;27555:742::-;27843:12;27857;27871:14;27824:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;27919:85:::1;27933:6;27941;27949:14;27965;27981:10;27993;27919:13;:85::i;:::-;27898:106:::0;;-1:-1:-1;27898:106:0;-1:-1:-1;28015:12:0::1;28030:54;28060:7;28069:6:::0;28077;28030:29:::1;:54::i;:::-;28015:69;;28095:66;28127:6;28135:10;28147:4;28153:7;28095:31;:66::i;:::-;28172;28204:6;28212:10;28224:4;28230:7;28172:31;:66::i;:::-;28261:28;::::0;;;;:24:::1;8491:55:1::0;;;28261:28:0::1;::::0;::::1;8473:74:1::0;28261:24:0;::::1;::::0;::::1;::::0;8446:18:1;;28261:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28249:40;;27887:410;27555:742:::0;;;;;;;;;;;;;:::o;28303:978::-;28556:16;28574:14;28590;28537:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;28644:176:::1;28672:5;28692:4;28711:18;28744:9;28768:14;28797:12;28644:13;:176::i;:::-;28617:203:::0;;-1:-1:-1;28617:203:0;-1:-1:-1;28831:12:0::1;28846:51;28876:7;28885:5:::0;28892:4:::1;28846:29;:51::i;:::-;28831:66;;28908:69;28940:5;28947:10;28959:4;28965:11;28908:31;:69::i;:::-;28994:4;28988:19;;;29015:9;28988:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29045:37:0::1;::::0;;;;:20:::1;13945:55:1::0;;;29045:37:0::1;::::0;::::1;13927:74:1::0;14017:18;;;14010:34;;;29051:4:0::1;29045:20;::::0;-1:-1:-1;29045:20:0::1;::::0;-1:-1:-1;13900:18:1;;;-1:-1:-1;29045:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29038:45;;;;:::i;:::-;29106:28;::::0;;;;:24:::1;8491:55:1::0;;;29106:28:0::1;::::0;::::1;8473:74:1::0;29106:24:0;::::1;::::0;::::1;::::0;8446:18:1;;29106:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29094:40;;29197:9;29185;:21;29181:92;;;29208:65;29239:10;29251:21;29263:9:::0;29251::::1;:21;:::i;:::-;29208:30;:65::i;:::-;28606:675;28303:978:::0;;;;;;;;;;;:::o;38313:807::-;38502:21;38478:8;25767:15;25755:8;:27;;25747:65;;;;;;;10773:2:1;25747:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;25747:65:0;10571:349:1;25747:65:0;38560:4:::1;38549:15;;:4;;38554:1;38549:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;38541:58;;;::::0;::::1;::::0;;11887:2:1;38541:58:0::1;::::0;::::1;11869:21:1::0;11926:2;11906:18;;;11899:30;11965:32;11945:18;;;11938:60;12015:18;;38541:58:0::1;11685:354:1::0;38541:58:0::1;38620:69;38664:7;38673:9;38684:4;;38620:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38620:43:0::1;::::0;-1:-1:-1;;;38620:69:0:i:1;:::-;38610:79;;38722:9;38708:7;38716:1;38708:10;;;;;;;;:::i;:::-;;;;;;;:23;;38700:76;;;::::0;::::1;::::0;;13357:2:1;38700:76:0::1;::::0;::::1;13339:21:1::0;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;13506:10;13486:18;;;13479:38;13534:19;;38700:76:0::1;13155:404:1::0;38700:76:0::1;38793:4;38787:19;;;38814:7;38822:1;38814:10;;;;;;;;:::i;:::-;;;;;;;38787:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;38851:4;38845:20;;;38866:56;38896:7;38905:4;;38910:1;38905:7;;;;;;;:::i;38866:56::-;38924:7;38932:1;38924:10;;;;;;;;:::i;:::-;;;;;;;38845:90;;;;;;;;;;;;;;;13957:42:1::0;13945:55;;;;13927:74;;14032:2;14017:18;;14010:34;13915:2;13900:18;;13753:297;38845:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38838:98;;;;:::i;:::-;38947:24;38953:7;38962:4;;38947:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38968:2:0;;-1:-1:-1;38947:5:0::1;::::0;-1:-1:-1;;38947:24:0:i:1;:::-;39034:7;39042:1;39034:10;;;;;;;;:::i;:::-;;;;;;;39022:9;:22;39018:94;;;39046:66;39077:10;39101:7;39109:1;39101:10;;;;;;;;:::i;:::-;;;;;;;39089:9;:22;;;;:::i;8379:449::-:0;8611:45;;;8600:10;13945:55:1;;;8611:45:0;;;13927:74:1;14017:18;;;;14010:34;;;8611:45:0;;;;;;;;;;13900:18:1;;;;8611:45:0;;;;;;;;;;;;;8600:57;;-1:-1:-1;;;;8600:10:0;;;;:57;;8611:45;8600:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8564:93;;;;8690:7;:57;;;;-1:-1:-1;8702:11:0;;:16;;:44;;;8733:4;8722:24;;;;;;;;;;;;:::i;:::-;8668:152;;;;;;;16518:2:1;8668:152:0;;;16500:21:1;16557:2;16537:18;;;16530:30;16596:34;16576:18;;;16569:62;16667:15;16647:18;;;16640:43;16700:19;;8668:152:0;16316:409:1;8668:152:0;8486:342;;8379:449;;;:::o;9342:217::-;9455:12;;;9415;9455;;;;;;;;;9433:7;;;;9448:5;;9433:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9414:54;;;9487:7;9479:72;;;;;;;16932:2:1;9479:72:0;;;16914:21:1;16971:2;16951:18;;;16944:30;17010:34;16990:18;;;16983:62;17081:22;17061:18;;;17054:50;17121:19;;9479:72:0;16730:416:1;9479:72:0;9403:156;9342:217;;:::o;18815:517::-;18908:14;18954:1;18943:8;:12;18935:73;;;;;;;17353:2:1;18935:73:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:34;17411:18;;;17404:62;17502:18;17482;;;17475:46;17538:19;;18935:73:0;17151:412:1;18935:73:0;19039:1;19027:9;:13;:31;;;;;19057:1;19044:10;:14;19027:31;19019:89;;;;;;;17770:2:1;19019:89:0;;;17752:21:1;17809:2;17789:18;;;17782:30;17848:34;17828:18;;;17821:62;17919:15;17899:18;;;17892:43;17952:19;;19019:89:0;17568:409:1;19019:89:0;19119:20;19142:14;:8;19153:3;19142:14;:::i;:::-;19119:37;-1:-1:-1;19167:14:0;19184:28;19202:10;19119:37;19184:28;:::i;:::-;19167:45;-1:-1:-1;19223:16:0;19263:15;19243:16;:9;19255:4;19243:16;:::i;:::-;19242:36;;;;:::i;:::-;19223:55;-1:-1:-1;19301:23:0;19223:55;19301:9;:23;:::i;:::-;19289:35;18815:517;-1:-1:-1;;;;;;;18815:517:0:o;21503:696::-;21608:21;21665:1;21650:4;:11;:16;;21642:64;;;;;;;18829:2:1;21642:64:0;;;18811:21:1;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;18978:5;18958:18;;;18951:33;19001:19;;21642:64:0;18627:399:1;21642:64:0;21738:4;:11;21727:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21727:23:0;;21717:33;;21774:8;21761:7;21769:1;21761:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;21798:6;21793:399;21824:1;21810:4;:11;:15;;;;:::i;:::-;21806:1;:19;21793:399;;;21847:19;21869:60;21899:7;21908:4;21913:1;21908:7;;;;;;;;:::i;:::-;;;;;;;21917:4;21922:1;21926;21922:5;;;;:::i;:::-;21917:11;;;;;;;;:::i;:::-;;;;;;;21869:29;:60::i;:::-;21944:64;;;;;21992:15;21944:64;;;1889:25:1;21847:82:0;;-1:-1:-1;21944:47:0;;;;;;1862:18:1;;21944:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22024:14;22040:15;22059:42;22071:7;22080:4;22085:1;22080:7;;;;;;;;:::i;:::-;;;;;;;22089:4;22094:1;22098;22094:5;;;;:::i;:::-;22089:11;;;;;;;;:::i;:::-;;;;;;;22059;:42::i;:::-;22023:78;;;;22133:47;22146:7;22154:1;22146:10;;;;;;;;:::i;:::-;;;;;;;22158:9;22169:10;22133:12;:47::i;:::-;22116:7;22124:5;:1;22128;22124:5;:::i;:::-;22116:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;21832:360;;;21827:3;;;;;:::i;:::-;;;;21793:399;;;;21503:696;;;;;:::o;16640:487::-;16729:12;16755:14;16771;16789:26;16800:6;16808;16789:10;:26::i;:::-;16961:32;;19398:66:1;19493:2;19489:15;;;19485:24;;16961:32:0;;;19473:37:1;19544:15;;;19540:24;19526:12;;;19519:46;16754:61:0;;-1:-1:-1;16754:61:0;-1:-1:-1;16925:7:0;;19581:12:1;;16961:32:0;;;;;;;;;;;;16951:43;;;;;;16864:251;;;;;;;;19975:66:1;19963:79;;20079:2;20075:15;;;;20092:66;20071:88;20067:1;20058:11;;20051:109;20185:2;20176:12;;20169:28;20227:66;20222:2;20213:12;;20206:88;20319:2;20310:12;;19604:724;16864:251:0;;;;;;;;;;;;;;16854:262;;16864:251;16854:262;;;;;16640:487;-1:-1:-1;;;;;;16640:487:0:o;8836:498::-;9107:51;;;9096:10;14586:15:1;;;9107:51:0;;;14568:34:1;14638:15;;;14618:18;;;14611:43;14670:18;;;;14663:34;;;9107:51:0;;;;;;;;;;14480:18:1;;;;9107:51:0;;;;;;;;;;;;;9096:63;;-1:-1:-1;;;;9096:10:0;;;;:63;;9107:51;9096:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9060:99;;;;9192:7;:57;;;;-1:-1:-1;9204:11:0;;:16;;:44;;;9235:4;9224:24;;;;;;;;;;;;:::i;:::-;9170:156;;;;;;;20535:2:1;9170:156:0;;;20517:21:1;20574:2;20554:18;;;20547:30;20613:34;20593:18;;;20586:62;20684:19;20664:18;;;20657:47;20721:19;;9170:156:0;20333:413:1;9170:156:0;8970:364;;8836:498;;;;:::o;33880:749::-;33987:6;33982:640;34013:1;33999:4;:11;:15;;;;:::i;:::-;33995:1;:19;33982:640;;;34037:13;34052:14;34071:4;34076:1;34071:7;;;;;;;;:::i;:::-;;;;;;;34080:4;34085:1;34089;34085:5;;;;:::i;:::-;34080:11;;;;;;;;:::i;:::-;;;;;;;34036:56;;;;34108:14;34127:47;34160:5;34167:6;34127:32;:47::i;:::-;-1:-1:-1;34107:67:0;-1:-1:-1;34189:14:0;34206:7;34214:5;:1;34218;34214:5;:::i;:::-;34206:14;;;;;;;;:::i;:::-;;;;;;;34189:31;;34236:15;34253;34281:6;34272:15;;:5;:15;;;:61;;34314:9;34330:1;34272:61;;;34296:1;34300:9;34272:61;34235:98;;;;34348:10;34379:1;34365:4;:11;:15;;;;:::i;:::-;34361:1;:19;:87;;34445:3;34361:87;;;34383:59;34413:7;34422:6;34430:4;34435:5;:1;34439;34435:5;:::i;34383:59::-;34348:100;;34477:53;34507:7;34516:5;34523:6;34477:29;:53::i;:::-;34463:73;;;34555:10;34567;34579:2;34593:1;34583:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34583:12:0;;34463:147;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34021:601;;;;;;;34016:3;;;;;:::i;:::-;;;;33982:640;;;;33880:749;;;:::o;20737:673::-;20838:21;20895:1;20880:4;:11;:16;;20872:64;;;;;;;18829:2:1;20872:64:0;;;18811:21:1;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;18978:5;18958:18;;;18951:33;19001:19;;20872:64:0;18627:399:1;20872:64:0;20968:4;:11;20957:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20957:23:0;;20947:33;;21021:9;20991:7;21016:1;20999:7;:14;:18;;;;:::i;:::-;20991:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;21046:6;21069:1;21055:4;:11;:15;;;;:::i;:::-;21046:24;;21041:362;21072:5;;21041:362;;21121:60;21151:7;21160:4;21165:5;21169:1;21165;:5;:::i;:::-;21160:11;;;;;;;;:::i;:::-;;;;;;;21173:4;21178:1;21173:7;;;;;;;;:::i;21121:60::-;21107:89;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21099:121;;;;;;;21664:2:1;21099:121:0;;;21646:21:1;21703:2;21683:18;;;21676:30;21742:19;21722:18;;;21715:47;21779:18;;21099:121:0;21462:341:1;21099:121:0;21236:14;;21271:42;21283:7;21292:4;21297:5;21301:1;21297;:5;:::i;:::-;21292:11;;;;;;;;:::i;:::-;;;;;;;21305:4;21310:1;21305:7;;;;;;;;:::i;21271:42::-;21235:78;;;;21345:46;21357:7;21365:1;21357:10;;;;;;;;:::i;:::-;;;;;;;21369:9;21380:10;21345:11;:46::i;:::-;21328:7;21336:5;21340:1;21336;:5;:::i;:::-;21328:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;21084:319;;21079:3;;;;;:::i;:::-;;;;21041:362;;22291:717;22396:21;22453:1;22438:4;:11;:16;;22430:64;;;;;;;18829:2:1;22430:64:0;;;18811:21:1;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;18978:5;18958:18;;;18951:33;19001:19;;22430:64:0;18627:399:1;22430:64:0;22526:4;:11;22515:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22515:23:0;;22505:33;;22579:9;22549:7;22574:1;22557:7;:14;:18;;;;:::i;:::-;22549:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;22604:6;22627:1;22613:4;:11;:15;;;;:::i;:::-;22604:24;;22599:402;22630:5;;22599:402;;22657:19;22679:60;22709:7;22718:4;22723:5;22727:1;22723;:5;:::i;:::-;22718:11;;;;;;;;:::i;:::-;;;;;;;22731:4;22736:1;22731:7;;;;;;;;:::i;22679:60::-;22754:64;;;;;22802:15;22754:64;;;1889:25:1;22657:82:0;;-1:-1:-1;22754:47:0;;;;;;1862:18:1;;22754:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22834:14;22850:15;22869:42;22881:7;22890:4;22899:1;22895;:5;;;;:::i;:::-;22890:11;;;;;;;;:::i;:::-;;;;;;;22903:4;22908:1;22903:7;;;;;;;;:::i;22869:42::-;22833:78;;;;22943:46;22955:7;22963:1;22955:10;;;;;;;;:::i;22943:46::-;22926:7;22934:5;22938:1;22934;:5;:::i;:::-;22926:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;22642:359;;;22637:3;;;;;:::i;:::-;;;;22599:402;;39267:1249;39380:6;39375:1134;39406:1;39392:4;:11;:15;;;;:::i;:::-;39388:1;:19;39375:1134;;;39430:13;39445:14;39464:4;39469:1;39464:7;;;;;;;;:::i;:::-;;;;;;;39473:4;39478:1;39482;39478:5;;;;:::i;:::-;39473:11;;;;;;;;:::i;:::-;;;;;;;39429:56;;;;39501:14;39520:47;39553:5;39560:6;39520:32;:47::i;:::-;39500:67;;;39582:18;39617:53;39647:7;39656:5;39663:6;39617:29;:53::i;:::-;39582:89;;39686:16;39717:17;39809;39828:18;39848:22;39872:23;39900:66;39943:7;39952:5;39959:6;39900:42;:66::i;:::-;39999:38;;;;;:23;8491:55:1;;;39999:38:0;;;8473:74:1;39808:158:0;;-1:-1:-1;39808:158:0;;-1:-1:-1;39808:158:0;;-1:-1:-1;39808:158:0;-1:-1:-1;39808:158:0;;;;39999:23;;;;;;8446:18:1;;39999:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;:73;;;;:::i;:::-;39985:87;;40106:76;40141:11;40154:12;40168:13;40106:34;:76::i;:::-;40091:91;;39749:449;;;;40213:15;40230;40258:6;40249:15;;:5;:15;;;:67;;40294:12;40313:1;40249:67;;;40273:1;40277:12;40249:67;40212:104;;;;40331:10;40362:1;40348:4;:11;:15;;;;:::i;:::-;40344:1;:19;:87;;40428:3;40344:87;;;40366:59;40396:7;40405:6;40413:4;40418:5;:1;40422;40418:5;:::i;40366:59::-;40484:12;;;40494:1;40484:12;;;;;;;;;40446:51;;;;40331:100;;-1:-1:-1;40446:9:0;;;;;;:51;;40456:10;;40468;;40331:100;;40446:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39414:1095;;;;;;;;;39409:3;;;;;:::i;:::-;;;;39375:1134;;19453:469;19546:13;19592:1;19580:9;:13;19572:75;;;;;;;22211:2:1;19572:75:0;;;22193:21:1;22250:2;22230:18;;;22223:30;22289:34;22269:18;;;22262:62;22360:19;22340:18;;;22333:47;22397:19;;19572:75:0;22009:413:1;19572:75:0;19678:1;19666:9;:13;:31;;;;;19696:1;19683:10;:14;19666:31;19658:89;;;;;;;17770:2:1;19658:89:0;;;17752:21:1;17809:2;17789:18;;;17782:30;17848:34;17828:18;;;17821:62;17919:15;17899:18;;;17892:43;17952:19;;19658:89:0;17568:409:1;19658:89:0;19758:14;19775:21;19787:9;19775;:21;:::i;:::-;:28;;19799:4;19775:28;:::i;:::-;19758:45;-1:-1:-1;19814:16:0;19834:22;19847:9;19834:10;:22;:::i;:::-;19833:30;;19860:3;19833:30;:::i;:::-;19814:49;-1:-1:-1;19886:23:0;19814:49;19886:9;:23;:::i;:::-;19885:29;;19913:1;19885:29;:::i;:::-;19874:40;19453:469;-1:-1:-1;;;;;;19453:469:0:o;18365:328::-;18447:12;18490:1;18480:7;:11;18472:66;;;;;;;22629:2:1;18472:66:0;;;22611:21:1;22668:2;22648:18;;;22641:30;22707:34;22687:18;;;22680:62;22778:12;22758:18;;;22751:40;22808:19;;18472:66:0;22427:406:1;18472:66:0;18568:1;18557:8;:12;:28;;;;;18584:1;18573:8;:12;18557:28;18549:86;;;;;;;17770:2:1;18549:86:0;;;17752:21:1;17809:2;17789:18;;;17782:30;17848:34;17828:18;;;17821:62;17919:15;17899:18;;;17892:43;17952:19;;18549:86:0;17568:409:1;18549:86:0;18677:8;18656:18;18666:8;18656:7;:18;:::i;:::-;:29;;;;:::i;16189:359::-;16264:14;16280;16325:6;16315:16;;:6;:16;;;16307:71;;;;;;;23040:2:1;16307:71:0;;;23022:21:1;23079:2;23059:18;;;23052:30;23118:34;23098:18;;;23091:62;23189:12;23169:18;;;23162:40;23219:19;;16307:71:0;22838:406:1;16307:71:0;16417:6;16408:15;;:6;:15;;;:53;;16446:6;16454;16408:53;;;16427:6;16435;16408:53;16389:72;;-1:-1:-1;16389:72:0;-1:-1:-1;16480:20:0;;;16472:68;;;;;;;23451:2:1;16472:68:0;;;23433:21:1;23490:2;23470:18;;;23463:30;23529:34;23509:18;;;23502:62;23600:5;23580:18;;;23573:33;23623:19;;16472:68:0;23249:399:1;16472:68:0;16189:359;;;;;:::o;20004:652::-;20105:21;20162:1;20147:4;:11;:16;;20139:64;;;;;;;18829:2:1;20139:64:0;;;18811:21:1;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;18978:5;18958:18;;;18951:33;19001:19;;20139:64:0;18627:399:1;20139:64:0;20235:4;:11;20224:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20224:23:0;;20214:33;;20271:8;20258:7;20266:1;20258:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;20295:6;20290:359;20321:1;20307:4;:11;:15;;;;:::i;:::-;20303:1;:19;20290:359;;;20366:60;20396:7;20405:4;20410:1;20405:7;;;;;;;;:::i;:::-;;;;;;;20414:4;20419:1;20423;20419:5;;;;:::i;20366:60::-;20352:89;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20344:121;;;;;;;21664:2:1;20344:121:0;;;21646:21:1;21703:2;21683:18;;;21676:30;21742:19;21722:18;;;21715:47;21779:18;;20344:121:0;21462:341:1;20344:121:0;20481:14;20497:15;20516:42;20528:7;20537:4;20542:1;20537:7;;;;;;;;:::i;:::-;;;;;;;20546:4;20551:1;20555;20551:5;;;;:::i;20516:42::-;20480:78;;;;20590:47;20603:7;20611:1;20603:10;;;;;;;;:::i;20590:47::-;20573:7;20581:5;:1;20585;20581:5;:::i;:::-;20573:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;20329:320;;20324:3;;;;;:::i;:::-;;;;20290:359;;26127:1422;26440:52;;;;;:66;23906:15:1;;;26440:52:0;;;23888:34:1;23958:15;;;23938:18;;;23931:43;-1:-1:-1;;;;;;26460:7:0;26440:36;;;;;;23800:18:1;;26440:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;26436:154;;26523:55;;;;;:39;23906:15:1;;;26523:55:0;;;23888:34:1;23958:15;;;23938:18;;;23931:43;26543:7:0;26523:39;;;;23800:18:1;;26523:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26436:154;26601:13;26616;26635:67;26678:7;26687:6;26695;26635:42;:67::i;:::-;26600:102;;;;;;26717:8;26729:1;26717:13;:30;;;;-1:-1:-1;26734:13:0;;26717:30;26713:829;;;26786:14;;-1:-1:-1;26802:14:0;;-1:-1:-1;26713:829:0;;;26850:19;26872:63;26900:14;26916:8;26926;26872:27;:63::i;:::-;26850:85;;26972:14;26954;:32;26950:581;;27033:10;27015:14;:28;;27007:80;;;;;;;15568:2:1;27007:80:0;;;15550:21:1;15607:2;15587:18;;;15580:30;15646:34;15626:18;;;15619:62;15717:9;15697:18;;;15690:37;15744:19;;27007:80:0;15366:403:1;27007:80:0;27128:14;;-1:-1:-1;27144:14:0;-1:-1:-1;27144:14:0;26950:581;;;27200:19;27222:63;27250:14;27266:8;27276;27222:27;:63::i;:::-;27200:85;;27329:14;27311;:32;;27304:40;;;;:::i;:::-;27389:10;27371:14;:28;;27363:80;;;;;;;15160:2:1;27363:80:0;;;15142:21:1;15199:2;15179:18;;;15172:30;15238:34;15218:18;;;15211:62;15309:9;15289:18;;;15282:37;15336:19;;27363:80:0;14958:403:1;27363:80:0;27484:14;-1:-1:-1;27500:14:0;;-1:-1:-1;26950:581:0;26835:707;26713:829;26373:1176;;26127:1422;;;;;;;;;:::o;17185:394::-;17278:13;17293;17320:14;17339:26;17350:6;17358;17339:10;:26::i;:::-;17319:46;;;17379:13;17394;17426:32;17434:7;17443:6;17451;17426:7;:32::i;:::-;17412:59;;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17378:95;;;;;;;;;17519:6;17509:16;;:6;:16;;;:62;;17552:8;17562;17509:62;;;17529:8;17539;17509:62;17486:85;;;;-1:-1:-1;17185:394:0;-1:-1:-1;;;;;;;17185:394:0:o;17587:665::-;17684:13;17699;17714:18;17734;17766:14;17785:26;17796:6;17804;17785:10;:26::i;:::-;17765:46;;;17824:18;17859:32;17867:7;17876:6;17884;17859:7;:32::i;:::-;17905:42;;;;;17931:15;17905:42;;;1889:25:1;17824:68:0;;-1:-1:-1;17905:25:0;;;;;;1862:18:1;;17905:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17961:13;17976;17991:18;18011;18033:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17960:96;;;;;;;;;;;;;;;;;18132:6;18122:16;;:6;:16;;;:122;;18195:8;18205;18215:13;18230;18122:122;;;18142:8;18152;18162:13;18177;18122:122;18069:175;;;;;;;;;;;;;;;;17754:498;;;;;;17587:665;;;;;;;:::o;14:184:1:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:134::-;430:20;;459:31;430:20;459:31;:::i;:::-;362:134;;;:::o;501:663::-;605:6;613;621;629;637;645;698:3;686:9;677:7;673:23;669:33;666:53;;;715:1;712;705:12;666:53;754:9;741:23;773:31;798:5;773:31;:::i;:::-;823:5;-1:-1:-1;875:2:1;860:18;;847:32;;-1:-1:-1;926:2:1;911:18;;898:32;;-1:-1:-1;977:2:1;962:18;;949:32;;-1:-1:-1;1033:3:1;1018:19;;1005:33;1047;1005;1047;:::i;:::-;1099:7;1089:17;;;1153:3;1142:9;1138:19;1125:33;1115:43;;501:663;;;;;;;;:::o;1422:316::-;1499:6;1507;1515;1568:2;1556:9;1547:7;1543:23;1539:32;1536:52;;;1584:1;1581;1574:12;1536:52;-1:-1:-1;;1607:23:1;;;1677:2;1662:18;;1649:32;;-1:-1:-1;1728:2:1;1713:18;;;1700:32;;1422:316;-1:-1:-1;1422:316:1:o;1925:367::-;1988:8;1998:6;2052:3;2045:4;2037:6;2033:17;2029:27;2019:55;;2070:1;2067;2060:12;2019:55;-1:-1:-1;2093:20:1;;2136:18;2125:30;;2122:50;;;2168:1;2165;2158:12;2122:50;2205:4;2197:6;2193:17;2181:29;;2265:3;2258:4;2248:6;2245:1;2241:14;2233:6;2229:27;2225:38;2222:47;2219:67;;;2282:1;2279;2272:12;2297:778;2419:6;2427;2435;2443;2451;2459;2512:3;2500:9;2491:7;2487:23;2483:33;2480:53;;;2529:1;2526;2519:12;2480:53;2565:9;2552:23;2542:33;;2622:2;2611:9;2607:18;2594:32;2584:42;;2677:2;2666:9;2662:18;2649:32;2704:18;2696:6;2693:30;2690:50;;;2736:1;2733;2726:12;2690:50;2775:70;2837:7;2828:6;2817:9;2813:22;2775:70;:::i;:::-;2864:8;;-1:-1:-1;2749:96:1;-1:-1:-1;;2949:2:1;2934:18;;2921:32;2962:31;2921:32;2962:31;:::i;:::-;3012:5;3002:15;;;3064:3;3053:9;3049:19;3036:33;3026:43;;2297:778;;;;;;;;:::o;3080:632::-;3251:2;3303:21;;;3373:13;;3276:18;;;3395:22;;;3222:4;;3251:2;3474:15;;;;3448:2;3433:18;;;3222:4;3517:169;3531:6;3528:1;3525:13;3517:169;;;3592:13;;3580:26;;3661:15;;;;3626:12;;;;3553:1;3546:9;3517:169;;;-1:-1:-1;3703:3:1;;3080:632;-1:-1:-1;;;;;;3080:632:1:o;3717:184::-;3769:77;3766:1;3759:88;3866:4;3863:1;3856:15;3890:4;3887:1;3880:15;3906:1248;3999:6;4007;4060:2;4048:9;4039:7;4035:23;4031:32;4028:52;;;4076:1;4073;4066:12;4028:52;4112:9;4099:23;4089:33;;4141:2;4194;4183:9;4179:18;4166:32;4217:18;4258:2;4250:6;4247:14;4244:34;;;4274:1;4271;4264:12;4244:34;4312:6;4301:9;4297:22;4287:32;;4357:7;4350:4;4346:2;4342:13;4338:27;4328:55;;4379:1;4376;4369:12;4328:55;4415:2;4402:16;4437:2;4433;4430:10;4427:36;;;4443:18;;:::i;:::-;4489:2;4486:1;4482:10;4521:2;4515:9;4580:66;4575:2;4571;4567:11;4563:84;4555:6;4551:97;4698:6;4686:10;4683:22;4678:2;4666:10;4663:18;4660:46;4657:72;;;4709:18;;:::i;:::-;4745:2;4738:22;4795:18;;;4829:15;;;;-1:-1:-1;4871:11:1;;;4867:20;;;4899:19;;;4896:39;;;4931:1;4928;4921:12;4896:39;4955:11;;;;4975:148;4991:6;4986:3;4983:15;4975:148;;;5057:23;5076:3;5057:23;:::i;:::-;5045:36;;5008:12;;;;5101;;;;4975:148;;;5142:6;5132:16;;;;;;;;3906:1248;;;;;:::o;5159:118::-;5245:5;5238:13;5231:21;5224:5;5221:32;5211:60;;5267:1;5264;5257:12;5282:156;5348:20;;5408:4;5397:16;;5387:27;;5377:55;;5428:1;5425;5418:12;5443:1152;5587:6;5595;5603;5611;5619;5627;5635;5643;5651;5659;5667:7;5721:3;5709:9;5700:7;5696:23;5692:33;5689:53;;;5738:1;5735;5728:12;5689:53;5777:9;5764:23;5796:31;5821:5;5796:31;:::i;:::-;5846:5;-1:-1:-1;5903:2:1;5888:18;;5875:32;5916:33;5875:32;5916:33;:::i;:::-;5968:7;-1:-1:-1;6022:2:1;6007:18;;5994:32;;-1:-1:-1;6073:2:1;6058:18;;6045:32;;-1:-1:-1;6124:3:1;6109:19;;6096:33;;-1:-1:-1;6181:3:1;6166:19;;6153:33;6195;6153;6195;:::i;:::-;6247:7;-1:-1:-1;6301:3:1;6286:19;;6273:33;;-1:-1:-1;6358:3:1;6343:19;;6330:33;6372:30;6330:33;6372:30;:::i;:::-;6421:7;-1:-1:-1;6447:37:1;6479:3;6464:19;;6447:37;:::i;:::-;6437:47;;6531:3;6520:9;6516:19;6503:33;6493:43;;6584:3;6573:9;6569:19;6556:33;6545:44;;5443:1152;;;;;;;;;;;;;;:::o;6600:1008::-;6735:6;6743;6751;6759;6767;6775;6783;6791;6799;6807;6860:3;6848:9;6839:7;6835:23;6831:33;6828:53;;;6877:1;6874;6867:12;6828:53;6916:9;6903:23;6935:31;6960:5;6935:31;:::i;:::-;6985:5;-1:-1:-1;7037:2:1;7022:18;;7009:32;;-1:-1:-1;7088:2:1;7073:18;;7060:32;;-1:-1:-1;7139:2:1;7124:18;;7111:32;;-1:-1:-1;7195:3:1;7180:19;;7167:33;7209;7167;7209;:::i;:::-;7261:7;-1:-1:-1;7315:3:1;7300:19;;7287:33;;-1:-1:-1;7372:3:1;7357:19;;7344:33;7386:30;7344:33;7386:30;:::i;:::-;7435:7;-1:-1:-1;7461:37:1;7493:3;7478:19;;7461:37;:::i;:::-;7451:47;;7545:3;7534:9;7530:19;7517:33;7507:43;;7597:3;7586:9;7582:19;7569:33;7559:43;;6600:1008;;;;;;;;;;;;;:::o;7613:709::-;7726:6;7734;7742;7750;7758;7811:3;7799:9;7790:7;7786:23;7782:33;7779:53;;;7828:1;7825;7818:12;7779:53;7864:9;7851:23;7841:33;;7925:2;7914:9;7910:18;7897:32;7952:18;7944:6;7941:30;7938:50;;;7984:1;7981;7974:12;7938:50;8023:70;8085:7;8076:6;8065:9;8061:22;8023:70;:::i;:::-;8112:8;;-1:-1:-1;7997:96:1;-1:-1:-1;;8197:2:1;8182:18;;8169:32;8210:31;8169:32;8210:31;:::i;:::-;7613:709;;;;-1:-1:-1;7613:709:1;;8312:2;8297:18;8284:32;;7613:709;-1:-1:-1;;7613:709:1:o;8558:805::-;8671:6;8679;8687;8695;8703;8711;8719;8772:3;8760:9;8751:7;8747:23;8743:33;8740:53;;;8789:1;8786;8779:12;8740:53;8828:9;8815:23;8847:31;8872:5;8847:31;:::i;:::-;8897:5;-1:-1:-1;8954:2:1;8939:18;;8926:32;8967:33;8926:32;8967:33;:::i;:::-;9019:7;-1:-1:-1;9073:2:1;9058:18;;9045:32;;-1:-1:-1;9124:2:1;9109:18;;9096:32;;-1:-1:-1;9175:3:1;9160:19;;9147:33;;-1:-1:-1;9232:3:1;9217:19;;9204:33;9246;9204;9246;:::i;:::-;9298:7;9288:17;;;9352:3;9341:9;9337:19;9324:33;9314:43;;8558:805;;;;;;;;;;:::o;9368:874::-;9490:6;9498;9506;9514;9522;9530;9538;9546;9599:3;9587:9;9578:7;9574:23;9570:33;9567:53;;;9616:1;9613;9606:12;9567:53;9655:9;9642:23;9674:31;9699:5;9674:31;:::i;:::-;9724:5;-1:-1:-1;9781:2:1;9766:18;;9753:32;9794:33;9753:32;9794:33;:::i;:::-;9846:7;-1:-1:-1;9900:2:1;9885:18;;9872:32;;-1:-1:-1;9951:2:1;9936:18;;9923:32;;-1:-1:-1;10002:3:1;9987:19;;9974:33;;-1:-1:-1;10054:3:1;10039:19;;10026:33;;-1:-1:-1;10111:3:1;10096:19;;10083:33;10125;10083;10125;:::i;:::-;10177:7;10167:17;;;10231:3;10220:9;10216:19;10203:33;10193:43;;9368:874;;;;;;;;;;;:::o;10925:184::-;10977:77;10974:1;10967:88;11074:4;11071:1;11064:15;11098:4;11095:1;11088:15;11114:125;11154:4;11182:1;11179;11176:8;11173:34;;;11187:18;;:::i;:::-;-1:-1:-1;11224:9:1;;11114:125::o;11244:184::-;11296:77;11293:1;11286:88;11393:4;11390:1;11383:15;11417:4;11414:1;11407:15;11433:247;11492:6;11545:2;11533:9;11524:7;11520:23;11516:32;11513:52;;;11561:1;11558;11551:12;11513:52;11600:9;11587:23;11619:31;11644:5;11619:31;:::i;13564:184::-;13634:6;13687:2;13675:9;13666:7;13662:23;13658:32;13655:52;;;13703:1;13700;13693:12;13655:52;-1:-1:-1;13726:16:1;;13564:184;-1:-1:-1;13564:184:1:o;14055:245::-;14122:6;14175:2;14163:9;14154:7;14150:23;14146:32;14143:52;;;14191:1;14188;14181:12;14143:52;14223:9;14217:16;14242:28;14264:5;14242:28;:::i;14708:245::-;14787:6;14795;14848:2;14836:9;14827:7;14823:23;14819:32;14816:52;;;14864:1;14861;14854:12;14816:52;-1:-1:-1;;14887:16:1;;14943:2;14928:18;;;14922:25;14887:16;;14922:25;;-1:-1:-1;14708:245:1:o;15774:258::-;15846:1;15856:113;15870:6;15867:1;15864:13;15856:113;;;15946:11;;;15940:18;15927:11;;;15920:39;15892:2;15885:10;15856:113;;;15987:6;15984:1;15981:13;15978:48;;;-1:-1:-1;;16022:1:1;16004:16;;15997:27;15774:258::o;16037:274::-;16166:3;16204:6;16198:13;16220:53;16266:6;16261:3;16254:4;16246:6;16242:17;16220:53;:::i;:::-;16289:16;;;;;16037:274;-1:-1:-1;;16037:274:1:o;17982:228::-;18022:7;18148:1;18080:66;18076:74;18073:1;18070:81;18065:1;18058:9;18051:17;18047:105;18044:131;;;18155:18;;:::i;:::-;-1:-1:-1;18195:9:1;;17982:228::o;18215:128::-;18255:3;18286:1;18282:6;18279:1;18276:13;18273:39;;;18292:18;;:::i;:::-;-1:-1:-1;18328:9:1;;18215:128::o;18348:274::-;18388:1;18414;18404:189;;18449:77;18446:1;18439:88;18550:4;18547:1;18540:15;18578:4;18575:1;18568:15;18404:189;-1:-1:-1;18607:9:1;;18348:274::o;19031:195::-;19070:3;19101:66;19094:5;19091:77;19088:103;;19171:18;;:::i;:::-;-1:-1:-1;19218:1:1;19207:13;;19031:195::o;20751:706::-;20982:6;20971:9;20964:25;21025:6;21020:2;21009:9;21005:18;20998:34;21080:42;21072:6;21068:55;21063:2;21052:9;21048:18;21041:83;21160:3;21155:2;21144:9;21140:18;21133:31;20945:4;21193:6;21187:13;21237:6;21231:3;21220:9;21216:19;21209:35;21253:67;21313:6;21307:3;21296:9;21292:19;21287:2;21279:6;21275:15;21253:67;:::i;:::-;21372:2;21360:15;21377:66;21356:88;21341:104;;;;21447:3;21337:114;;20751:706;-1:-1:-1;;;;;20751:706:1:o;21808:196::-;21847:3;21875:5;21865:39;;21884:18;;:::i;:::-;-1:-1:-1;21931:66:1;21920:78;;21808:196::o;23985:251::-;24055:6;24108:2;24096:9;24087:7;24083:23;24079:32;24076:52;;;24124:1;24121;24114:12;24076:52;24156:9;24150:16;24175:31;24200:5;24175:31;:::i;24241:188::-;24320:13;;24373:30;24362:42;;24352:53;;24342:81;;24419:1;24416;24409:12;24434:167;24512:13;;24565:10;24554:22;;24544:33;;24534:61;;24591:1;24588;24581:12;24606:376;24693:6;24701;24709;24762:2;24750:9;24741:7;24737:23;24733:32;24730:52;;;24778:1;24775;24768:12;24730:52;24801:40;24831:9;24801:40;:::i;:::-;24791:50;;24860:49;24905:2;24894:9;24890:18;24860:49;:::i;:::-;24850:59;;24928:48;24972:2;24961:9;24957:18;24928:48;:::i;:::-;24918:58;;24606:376;;;;;:::o;24987:548::-;25092:6;25100;25108;25116;25124;25177:3;25165:9;25156:7;25152:23;25148:33;25145:53;;;25194:1;25191;25184:12;25145:53;25217:40;25247:9;25217:40;:::i;:::-;25207:50;;25276:49;25321:2;25310:9;25306:18;25276:49;:::i;:::-;25266:59;;25344:48;25388:2;25377:9;25373:18;25344:48;:::i;:::-;25334:58;;25411:49;25456:2;25445:9;25441:18;25411:49;:::i;:::-;25401:59;;25479:50;25524:3;25513:9;25509:19;25479:50;:::i;:::-;25469:60;;24987:548;;;;;;;;:::o

Swarm Source

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