Contract 0x304EE5a9e1Fa788999fE9b7c852595Bf62C7E8E9

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x850029919a20d28f036bb52b6b5bcb26b6ba024528ca9e4371f7490bb06409ffAdd Liquidity ET...58668492022-12-04 21:36:3212 mins ago0xc9b516d99a1112cdcc1bcf6addf2503955231660 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e962.376865468961039 CRO2.3235528510480
0x19c878ccbba8c80dc0c0056bf25ff4bbc4e529a772f21098eaea5242855af2e7Swap Exact ETH F...58665192022-12-04 21:05:2343 mins ago0x9232a600ca7aff8cac6aabcdff3c5a69e1b86da9 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9100 CRO1.124943432138 4,863.673802452
0xea3cdc6a87614ebcfbf715dbe6c5e8904d3de03e9008d1f7d2170c87f723eae3Swap Exact ETH F...58664632022-12-04 21:00:0549 mins ago0xf650c7dbbad1d432eea449e46590c6d7ba391d29 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9231 CRO1.125002389476 4,863.676367239
0x2d121bff73c3724cd53b0f73b9ad85b53ea45d591fc1e2250748e7e0f3700167Swap Exact ETH F...58663282022-12-04 20:47:181 hr 1 min ago0xf650c7dbbad1d432eea449e46590c6d7ba391d29 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9218 CRO1.125003824076 4,863.682569383
0xec2c1168c8a9d9ee33caff55d7ceb0787c3b22791dcac7696df852297b9b1f51Swap ETH For Exa...58661702022-12-04 20:32:241 hr 16 mins ago0x4e2b98c5a941f80a5baee38f44d424129bec3eb0 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9200.994544414013023 CRO1.1285628997380
0xb304400f900f2b27be86b4787b73027f94f754dae15eab6d8b73c73cf2de3fe9Swap Exact Token...58661192022-12-04 20:27:351 hr 21 mins ago0x21420c42f0f39b657b78d3cc04025913d4b6ad14 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138657795595 4,863.692029672
0xdf8d602ad3fc90f3df9ad70199feb02c0106b2007fae06bfa2aa4948eeb2484bSwap Exact Token...58661142022-12-04 20:27:061 hr 22 mins ago0x702c500ea5e7bb98cb95bba2cd3ebb9146fb206e IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138657894678 4,863.692255004
0x7768d31145bb01253c1bf6f9fa58c524a6254c744a6f722439a16fc164d70446Swap Exact Token...58661112022-12-04 20:26:491 hr 22 mins ago0xed8faf9678e10f55bcb28154eb4ed1394fa4f394 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138657955434 4,863.692393175
0xc8fb013537542fe06a5e86150380b831a7e4c88f8d529516367cd433d30524beSwap Exact Token...58661072022-12-04 20:26:271 hr 22 mins ago0x5fefa80003afb81bb356432801f7d419281e7177 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138599672064 4,863.692577249
0xf08f60444232bd4d2dc6f755d1e97763daf6e273f788c07382b7856a037ecf2bSwap Exact Token...58660912022-12-04 20:24:571 hr 24 mins ago0x6c90a375173eeb1be348d492c9e908c42f415d5e IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138658360582 4,863.693314555
0xdb5cd4b95b164148625859cb459b356ff32b944b3e7c67d21cdc384d7120e8ddSwap Exact Token...58660862022-12-04 20:24:281 hr 24 mins ago0xc816151f80af0dd53eb2e9cf25997dd31f635fb2 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138658457885 4,863.693535839
0xb085890227ff8ed1057e2b5bc43f39b7cf5bb43ecd3045834c309c7e1e79dfa6Swap Exact Token...58660822022-12-04 20:24:061 hr 25 mins ago0x31b2a9bf87895e736641d6cdfa2e52a363988bde IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.179513564356 4,863.693716081
0xf829e3c1f1df22c3d59d9fc0645fd6caa4f36100933d3441547105431803dbfbAdd Liquidity ET...58660172022-12-04 20:17:581 hr 31 mins ago0xc9b516d99a1112cdcc1bcf6addf2503955231660 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e962.024624049629667 CRO2.2747155764850
0xc1bc9a5251093badf7b46c3e50fe3646f02651e48527770968dbd097b6891a5eSwap Exact Token...58659132022-12-04 20:08:071 hr 41 mins ago0xee0b1b84d61fc985316b9fc22cdabae424452a2c IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.1787864926080
0x92fc23182ee40b7d8689d2e157ecb35dddaaea2f72a2ab699c89754363cd1c5dSwap Exact Token...58658652022-12-04 20:03:351 hr 45 mins ago0x54976bd3943c94a3ae9e324458226f2077d184c4 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.2758565168650
0xdefdffc5268e826cb64f02ee69ac20851cb486ec31b805756be9d180dca6346dSwap Exact ETH F...58654622022-12-04 19:25:302 hrs 23 mins ago0xc6402936419581bcd86a7df81ba35ecb4d47d50f IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e95,000 CRO1.092970692684 4,863.72177112
0x33fa5ff1e8579454d83845a09b4f1a85638d4ac05c5d57166b08cad1665c7d03Swap Exact Token...58653362022-12-04 19:13:372 hrs 35 mins ago0x31b2a9bf87895e736641d6cdfa2e52a363988bde IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.162700197917 4,863.727480872
0x30cb1804b3cbc25885cea71313d6e35cd8a15d87e8941d8a9ac5e6c839a2168cSwap Exact Token...58653322022-12-04 19:13:152 hrs 35 mins ago0xc816151f80af0dd53eb2e9cf25997dd31f635fb2 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.162758646681 4,863.727669853
0x14dfa3242d89426983a84aef828a287dc4853f7a77c88c9c382255c06bbfdb87Swap Exact Token...58653142022-12-04 19:11:332 hrs 37 mins ago0x6c90a375173eeb1be348d492c9e908c42f415d5e IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.16275902549 4,863.728521739
0xb9ab45424cc66e1a37749283edfce49e7ddaafc954114d15b51fdf9a3cd43adeSwap Exact Token...58653112022-12-04 19:11:162 hrs 37 mins ago0x5fefa80003afb81bb356432801f7d419281e7177 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.162700722741 4,863.728661157
0x57401fbb10470d0222814a75820ae564320e7c72ddc551fb4e46038eb315a533Swap Exact Token...58653082022-12-04 19:10:592 hrs 38 mins ago0xed8faf9678e10f55bcb28154eb4ed1394fa4f394 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.162759151289 4,863.728804643
0x5b5e5168292f9bb1a1e8eafb4912e2c7b9a7492bc727f7be1b9af08ebe2e694bSwap Exact Token...58653052022-12-04 19:10:422 hrs 38 mins ago0x702c500ea5e7bb98cb95bba2cd3ebb9146fb206e IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.162759213782 4,863.72894518
0x695e7d252452f61d58d90487c889b9d130f24aaba8684c871a9d78c6da803647Swap Exact Token...58653022022-12-04 19:10:262 hrs 38 mins ago0x21420c42f0f39b657b78d3cc04025913d4b6ad14 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.203614599779 4,863.729083918
0x5880fa8d000243a77d63d086bf806435d15eef7462cf83b8350bbbf4a2e12fbdSwap Exact Token...58651002022-12-04 18:51:182 hrs 57 mins ago0x22c73df24899c025d8a2e488f7da7972b3fb6d68 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138678169048 4,863.738362564
0x543079f13733ae62b6fc98657d00e8180d99469d50fcfcbfb610f97e98958a23Swap Exact Token...58649722022-12-04 18:39:133 hrs 10 mins ago0x48397228eb5f7ff3a61b3abf572e0f75f8d12562 IN  0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90 CRO2.138680748384 4,863.744228438
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x850029919a20d28f036bb52b6b5bcb26b6ba024528ca9e4371f7490bb06409ff58668492022-12-04 21:36:3212 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 Cronos: WCRO Token62.376865468961039007 CRO
0x850029919a20d28f036bb52b6b5bcb26b6ba024528ca9e4371f7490bb06409ff58668492022-12-04 21:36:3212 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 0xc647ae7bf53fb84277e4e4683e753ee6d0b516ca56.745182027072714288 CRO
0x850029919a20d28f036bb52b6b5bcb26b6ba024528ca9e4371f7490bb06409ff58668492022-12-04 21:36:3212 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e956.745182027072714288 CRO
0x19c878ccbba8c80dc0c0056bf25ff4bbc4e529a772f21098eaea5242855af2e758665192022-12-04 21:05:2343 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 Cronos: WCRO Token100 CRO
0xea3cdc6a87614ebcfbf715dbe6c5e8904d3de03e9008d1f7d2170c87f723eae358664632022-12-04 21:00:0549 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 Cronos: WCRO Token231 CRO
0x2d121bff73c3724cd53b0f73b9ad85b53ea45d591fc1e2250748e7e0f370016758663282022-12-04 20:47:181 hr 1 min ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 Cronos: WCRO Token218 CRO
0xec2c1168c8a9d9ee33caff55d7ceb0787c3b22791dcac7696df852297b9b1f5158661702022-12-04 20:32:241 hr 16 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90x4e2b98c5a941f80a5baee38f44d424129bec3eb00.999972857781159323 CRO
0xec2c1168c8a9d9ee33caff55d7ceb0787c3b22791dcac7696df852297b9b1f5158661702022-12-04 20:32:241 hr 16 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 Cronos: WCRO Token199.994571556231864607 CRO
0xb304400f900f2b27be86b4787b73027f94f754dae15eab6d8b73c73cf2de3fe958661192022-12-04 20:27:351 hr 21 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90x21420c42f0f39b657b78d3cc04025913d4b6ad1449.491513641164172966 CRO
0xb304400f900f2b27be86b4787b73027f94f754dae15eab6d8b73c73cf2de3fe958661192022-12-04 20:27:351 hr 21 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e949.491513641164172966 CRO
0xb304400f900f2b27be86b4787b73027f94f754dae15eab6d8b73c73cf2de3fe958661192022-12-04 20:27:351 hr 21 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 0xc647ae7bf53fb84277e4e4683e753ee6d0b516ca4.30699279891669681 CRO
0xb304400f900f2b27be86b4787b73027f94f754dae15eab6d8b73c73cf2de3fe958661192022-12-04 20:27:351 hr 21 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e94.30699279891669681 CRO
0xdf8d602ad3fc90f3df9ad70199feb02c0106b2007fae06bfa2aa4948eeb2484b58661142022-12-04 20:27:061 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90x702c500ea5e7bb98cb95bba2cd3ebb9146fb206e49.53232267512805135 CRO
0xdf8d602ad3fc90f3df9ad70199feb02c0106b2007fae06bfa2aa4948eeb2484b58661142022-12-04 20:27:061 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e949.53232267512805135 CRO
0xdf8d602ad3fc90f3df9ad70199feb02c0106b2007fae06bfa2aa4948eeb2484b58661142022-12-04 20:27:061 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 0xc647ae7bf53fb84277e4e4683e753ee6d0b516ca4.31057781657879504 CRO
0xdf8d602ad3fc90f3df9ad70199feb02c0106b2007fae06bfa2aa4948eeb2484b58661142022-12-04 20:27:061 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e94.31057781657879504 CRO
0x7768d31145bb01253c1bf6f9fa58c524a6254c744a6f722439a16fc164d7044658661112022-12-04 20:26:491 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90xed8faf9678e10f55bcb28154eb4ed1394fa4f39449.573182254592416225 CRO
0x7768d31145bb01253c1bf6f9fa58c524a6254c744a6f722439a16fc164d7044658661112022-12-04 20:26:491 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e949.573182254592416225 CRO
0x7768d31145bb01253c1bf6f9fa58c524a6254c744a6f722439a16fc164d7044658661112022-12-04 20:26:491 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 0xc647ae7bf53fb84277e4e4683e753ee6d0b516ca4.314167289229789776 CRO
0x7768d31145bb01253c1bf6f9fa58c524a6254c744a6f722439a16fc164d7044658661112022-12-04 20:26:491 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e94.314167289229789776 CRO
0xc8fb013537542fe06a5e86150380b831a7e4c88f8d529516367cd433d30524be58661072022-12-04 20:26:271 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90x5fefa80003afb81bb356432801f7d419281e717749.614092463096591549 CRO
0xc8fb013537542fe06a5e86150380b831a7e4c88f8d529516367cd433d30524be58661072022-12-04 20:26:271 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e949.614092463096591549 CRO
0xc8fb013537542fe06a5e86150380b831a7e4c88f8d529516367cd433d30524be58661072022-12-04 20:26:271 hr 22 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e9 0xc647ae7bf53fb84277e4e4683e753ee6d0b516ca4.317761224270211772 CRO
0xc8fb013537542fe06a5e86150380b831a7e4c88f8d529516367cd433d30524be58661072022-12-04 20:26:271 hr 22 mins ago Cronos: WCRO Token 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e94.317761224270211772 CRO
0xf08f60444232bd4d2dc6f755d1e97763daf6e273f788c07382b7856a037ecf2b58660912022-12-04 20:24:571 hr 24 mins ago 0x304ee5a9e1fa788999fe9b7c852595bf62c7e8e90x6c90a375173eeb1be348d492c9e908c42f415d5e49.655053384364960062 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ALIENdexRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-10-12
*/

// File: contracts/ALIENdex/interfaces/IALIENdexPair.sol

pragma solidity >=0.5.0;

interface IALIENdexPair {
    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/ALIENdex/libraries/SafeMath.sol

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathAlien {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

// File: contracts/ALIENdex/libraries/ALIENdexLibrary.sol

pragma solidity >=0.5.0;



library ALIENdexLibrary {
    using SafeMathAlien for uint;

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

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'425e22592e8553379fe0c6a197fa786db9f1aa3e6fa077841650a3877c48c0ff' // 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,) = IALIENdexPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

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

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

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

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

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

// File: contracts/ALIENdex/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint 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: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }

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

// File: contracts/ALIENdex/interfaces/IALIENdexRouter01.sol

pragma solidity >=0.6.2;

interface IALIENdexRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure 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/ALIENdex/interfaces/IALIENdexRouter.sol

pragma solidity >=0.6.2;


interface IALIENdexRouter is IALIENdexRouter01 {
    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/ALIENdex/interfaces/IALIENdexFactory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() 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;
    function setMigrator(address) external;
}

// File: contracts/ALIENdex/interfaces/IERC20.sol

pragma solidity >=0.5.0;

interface IERC20Alien {
    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/ALIENdex/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts/ALIENdex/ALIENdexRouter.sol

pragma solidity =0.6.12;

contract ALIENdexRouter is IALIENdexRouter {
    using SafeMathAlien for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'ALIENdexRouter: 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 (IALIENdexFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IALIENdexFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = ALIENdexLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = ALIENdexLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'ALIENdexRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = ALIENdexLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'ALIENdexRouter: 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 = ALIENdexLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IALIENdexPair(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 = ALIENdexLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IALIENdexPair(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 = ALIENdexLibrary.pairFor(factory, tokenA, tokenB);
        IALIENdexPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IALIENdexPair(pair).burn(to);
        (address token0,) = ALIENdexLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'ALIENdexRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'ALIENdexRouter: 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 = ALIENdexLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IALIENdexPair(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 = ALIENdexLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IALIENdexPair(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, IERC20Alien(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 = ALIENdexLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IALIENdexPair(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,) = ALIENdexLibrary.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 ? ALIENdexLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IALIENdexPair(ALIENdexLibrary.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 = ALIENdexLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ALIENdexRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ALIENdexLibrary.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 = ALIENdexLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ALIENdexRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ALIENdexLibrary.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, 'ALIENdexRouter: INVALID_PATH');
        amounts = ALIENdexLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ALIENdexRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ALIENdexLibrary.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, 'ALIENdexRouter: INVALID_PATH');
        amounts = ALIENdexLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ALIENdexRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ALIENdexLibrary.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, 'ALIENdexRouter: INVALID_PATH');
        amounts = ALIENdexLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ALIENdexRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ALIENdexLibrary.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, 'ALIENdexRouter: INVALID_PATH');
        amounts = ALIENdexLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'ALIENdexRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ALIENdexLibrary.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,) = ALIENdexLibrary.sortTokens(input, output);
            IALIENdexPair pair = IALIENdexPair(ALIENdexLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Alien(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = ALIENdexLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? ALIENdexLibrary.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, ALIENdexLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Alien(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Alien(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ALIENdexRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'ALIENdexRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(ALIENdexLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Alien(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Alien(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ALIENdexRouter: 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, 'ALIENdexRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ALIENdexLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Alien(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'ALIENdexRouter: 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 ALIENdexLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return ALIENdexLibrary.getAmountsIn(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":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051620046de380380620046de8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614559620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145596000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602a815260200180614442602a913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614442602a913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b815260040180806020018281038252602681526020018061448c6026913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614442602a913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602a815260200180614442602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602a815260200180614442602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b815260040180806020018281038252602681526020018061448c6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b81526004018080602001828103825260258152602001806143636025913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260258152602001806143f36025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b815260206004820152601760248201526000805160206143d3833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601c602482015260008051602061446c833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b815260040180806020018281038252602681526020018061448c6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144b26023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602a815260200180614418602a913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260278152602001806143886027913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601d60248201527f414c49454e6465784c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f425e22592e8553379fe0c6a197fa786db9f1aa3e6fa077841650a3877c48c0ff609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144d56024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601d60248201527f414c49454e6465784c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602b8152602001806144f9602b913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260278152602001806143886027913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b815260040180806020018281038252602481526020018061433f6024913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260278152602001806143886027913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b81526004018080602001828103825260248152602001806143af6024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601d60248201527f414c49454e6465784c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260258152602001806143f36025913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b81526004018080602001828103825260258152602001806143636025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe414c49454e6465784c6962726172793a20494e53554646494349454e545f414d4f554e54414c49454e646578526f757465723a20494e53554646494349454e545f415f414d4f554e54414c49454e6465784c6962726172793a20494e53554646494349454e545f4c4951554944495459414c49454e6465784c6962726172793a204944454e544943414c5f414444524553534553414c49454e646578526f757465723a2045585049524544000000000000000000414c49454e646578526f757465723a20494e53554646494349454e545f425f414d4f554e54414c49454e6465784c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54414c49454e646578526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54414c49454e646578526f757465723a20494e56414c49445f5041544800000000414c49454e646578526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544414c49454e6465784c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54a2646970667358221220148fa6ea3350d5864be2bcf13111549a2cdf8f366ae01db7ef5a639cb2e9740d64736f6c634300060c0033000000000000000000000000e43289c49c44f35d9661b2ece08bbe9a6133e9840000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

000000000000000000000000e43289c49c44f35d9661b2ece08bbe9a6133e9840000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0xe43289c49c44f35d9661b2ece08bbe9a6133e984
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e43289c49c44f35d9661b2ece08bbe9a6133e984
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

16421:18514:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16901:10;-1:-1:-1;;;;;16915:4:0;16901:18;;16894:26;;;;16421:18514;;;;;21034:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21034:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33883:261;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33883:261:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28184:846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28184:846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28184:846:0;;;;;;;;;;;;-1:-1:-1;28184:846:0;-1:-1:-1;;;;;;28184:846:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34680:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34680:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34680:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34680:252:0;;-1:-1:-1;34680:252:0;;-1:-1:-1;;;;;34680:252:0:i;21713:675::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21713:675:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25415:625::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25415:625:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25415:625:0;;;;;;;;;;;;-1:-1:-1;25415:625:0;-1:-1:-1;;;;;;25415:625:0;;;;;;;;:::i;27354:824::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27354:824:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27354:824:0;;;;;;;;;;;;-1:-1:-1;27354:824:0;-1:-1:-1;;;;;;27354:824:0;;;;;;;;:::i;23851:716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23851:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31208:722::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31208:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31208:722:0;;;;;;;;;;;;-1:-1:-1;31208:722:0;-1:-1:-1;;;;;;31208:722:0;;;;;;;;:::i;32799:845::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32799:845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32799:845:0;;;;;;;;;;;;-1:-1:-1;32799:845:0;-1:-1:-1;;;;;;32799:845:0;;;;;;;;:::i;26655:693::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26655:693:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26655:693:0;;;;;;;;;;;;-1:-1:-1;26655:693:0;-1:-1:-1;;;;;;26655:693:0;;;;;;;;:::i;34152:260::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34152:260:0;;;;;;;;;;;;:::i;26046:603::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26046:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26046:603:0;;;;;;;;;;;;-1:-1:-1;26046:603:0;-1:-1:-1;;;;;;26046:603:0;;;;;;;;:::i;16556:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16556:38:0;;;;;;;;;;;;;;33688:187;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33688:187:0;;;;;;;;;;;;:::i;23140:705::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23140:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31936:857::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31936:857:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31936:857:0;;;;;;;;;;;;-1:-1:-1;31936:857:0;-1:-1:-1;;;;;;31936:857:0;;;;;;;;:::i;20169:859::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20169:859:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16508:41::-;;;;;;;;;;;;;:::i;34420:252::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34420:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34420:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34420:252:0;;-1:-1:-1;34420:252:0;;-1:-1:-1;;;;;34420:252:0:i;22394:667::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22394:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18412:736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18412:736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19154:972;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19154:972:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29036:806::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29036:806:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29036:806:0;;;;;;;;;;;;-1:-1:-1;29036:806:0;-1:-1:-1;;;;;;29036:806:0;;;;;;;;:::i;21034:673::-;21271:16;21289:14;21252:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;21343:196:::1;21373:5;21393:4;21412:9;21436:14;21465:12;21500:4;21520:8;21343:15;:196::i;:::-;21316:223:::0;;-1:-1:-1;21316:223:0;-1:-1:-1;21550:51:0::1;21578:5:::0;21585:2;21316:223;21550:27:::1;:51::i;:::-;21618:4;-1:-1:-1::0;;;;;21612:20:0::1;;21633:9;21612:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21654:45;21685:2;21689:9;21654:30;:45::i;:::-;21034:673:::0;;;;;;;;;;:::o;33883:261::-;34036:14;34075:61;34104:8;34114:9;34125:10;34075:28;:61::i;:::-;34068:68;33883:261;-1:-1:-1;;;;33883:261:0:o;28184:846::-;28398:21;28370:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28470:4:0::1;28445:29;:4:::0;;-1:-1:-1;;28450:15:0;;28445:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28445:21:0::1;-1:-1:-1::0;;;;;28445:29:0::1;;28437:70;;;::::0;;-1:-1:-1;;;28437:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28437:70:0;;;;;;;;;;;;;::::1;;28528:54;28558:7;28567:8;28577:4;;28528:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28528:29:0::1;::::0;-1:-1:-1;;;28528:54:0:i:1;:::-;28518:64;;28632:12;28601:7;28626:1;28609:7;:14;:18;28601:27;;;;;;;;;;;;;;:43;;28593:98;;;;-1:-1:-1::0;;;28593:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28702:140;28748:4;;28753:1;28748:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28748:7:0::1;28757:10;28769:50;28793:7;28802:4;;28807:1;28802:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28802:7:0::1;28811:4;;28816:1;28811:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28811:7:0::1;28769:23;:50::i;:::-;28821:7;28829:1;28821:10;;;;;;;;;;;;;;28702:31;:140::i;:::-;28853:35;28859:7;28868:4;;28853:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28882:4:0::1;::::0;-1:-1:-1;28853:5:0::1;::::0;-1:-1:-1;;28853:35:0:i:1;:::-;28905:4;-1:-1:-1::0;;;;;28899:20:0::1;;28920:7;28945:1;28928:7;:14;:18;28920:27;;;;;;;;;;;;;;28899:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28959:63;28990:2;28994:7;29019:1;29002:7;:14;:18;28994:27;;;;;;;;;;;;;;28959:30;:63::i;:::-;28184:846:::0;;;;;;;;;:::o;34680:252::-;34824:21;34870:54;34899:7;34908:9;34919:4;34870:28;:54::i;:::-;34863:61;;34680:252;;;;;:::o;21713:675::-;22019:12;22033;22058;22073:48;22097:7;22106:6;22114;22073:23;:48::i;:::-;22058:63;;22132:10;22145;:33;;22169:9;22145:33;;;-1:-1:-1;;22145:33:0;22189:79;;;-1:-1:-1;;;22189:79:0;;22216:10;22189:79;;;;22236:4;22189:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22132:46;;-1:-1:-1;;;;;;22189:26:0;;;;;:79;;;;;-1:-1:-1;;22189:79:0;;;;;;;;-1:-1:-1;22189:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:80;22316:6;22324;22332:9;22343:10;22355;22367:2;22371:8;22300:15;:80::i;:::-;22279:101;;;;;;;;21713:675;;;;;;;;;;;;;;;;:::o;25415:625::-;25639:21;25620:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;25683:54:::1;25713:7;25722:8;25732:4;;25683:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25683:29:0::1;::::0;-1:-1:-1;;;25683:54:0:i:1;:::-;25673:64;;25787:12;25756:7;25781:1;25764:7;:14;:18;25756:27;;;;;;;;;;;;;;:43;;25748:98;;;;-1:-1:-1::0;;;25748:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25857:140;25903:4;;25908:1;25903:7;;;;;;25857:140;26008:24;26014:7;26023:4;;26008:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26029:2:0;;-1:-1:-1;26008:5:0::1;::::0;-1:-1:-1;;26008:24:0:i:1;27354:824::-:0;27568:21;27540:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27640:4:0::1;27615:29;:4:::0;;-1:-1:-1;;27620:15:0;;27615:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27615:21:0::1;-1:-1:-1::0;;;;;27615:29:0::1;;27607:70;;;::::0;;-1:-1:-1;;;27607:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27607:70:0;;;;;;;;;;;;;::::1;;27698:54;27727:7;27736:9;27747:4;;27698:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27698:28:0::1;::::0;-1:-1:-1;;;27698:54:0:i:1;:::-;27688:64;;27785:11;27771:7;27779:1;27771:10;;;;;;;;;;;;;;:25;;27763:76;;;;-1:-1:-1::0;;;27763:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23851:716:::0;24169:14;24196:12;24211:45;24235:7;24244:5;24251:4;24211:23;:45::i;:::-;24196:60;;24267:10;24280;:33;;24304:9;24280:33;;;-1:-1:-1;;24280:33:0;24324:79;;;-1:-1:-1;;;24324:79:0;;24351:10;24324:79;;;;24371:4;24324:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24267:46;;-1:-1:-1;;;;;;24324:26:0;;;;;:79;;;;;-1:-1:-1;;24324:79:0;;;;;;;;-1:-1:-1;24324:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24426:133;24488:5;24495:9;24506:14;24522:12;24536:2;24540:8;24426:47;:133::i;:::-;24414:145;23851:716;-1:-1:-1;;;;;;;;;;;;;23851:716:0:o;31208:722::-;31442:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;31463:138:::1;31509:4;;31514:1;31509:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31509:7:0::1;31518:10;31530:50;31554:7;31563:4;;31568:1;31563:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31563:7:0::1;31572:4;;31577:1;31572:7;;;;;;31530:50;31582:8;31463:31;:138::i;:::-;31612:18;31645:4:::0;;-1:-1:-1;;31650:15:0;;31645:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31645:21:0::1;-1:-1:-1::0;;;;;31633:44:0::1;;31678:2;31633:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;31633:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31633:48:0;31692:44:::1;::::0;;31633:48:::1;31692:44:::0;;::::1;::::0;;;;;;;;;;;31633:48;;-1:-1:-1;31692:44:0::1;::::0;;;31727:4;;;;;;31692:44;::::1;::::0;31727:4;;31692:44;31727:4;31692:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31733:2:0;;-1:-1:-1;31692:34:0::1;::::0;-1:-1:-1;;31692:44:0:i:1;:::-;31840:12:::0;31769:67:::1;31822:13:::0;31781:4;;-1:-1:-1;;31786:15:0;;31781:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31781:21:0::1;-1:-1:-1::0;;;;;31769:44:0::1;;31814:2;31769:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;31769:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31769:48:0;;:52:::1;:67::i;:::-;:83;;31747:175;;;;-1:-1:-1::0;;;31747:175:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16719:1;31208:722:::0;;;;;;;:::o;32799:845::-;33066:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33125:4:0::1;33100:29;:4:::0;;-1:-1:-1;;33105:15:0;;33100:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33100:21:0::1;-1:-1:-1::0;;;;;33100:29:0::1;;33092:70;;;::::0;;-1:-1:-1;;;33092:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33092:70:0;;;;;;;;;;;;;::::1;;33173:138;33219:4;;33224:1;33219:7;;;;;;33173:138;33322:55;33357:4;;33322:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33371:4:0::1;::::0;-1:-1:-1;33322:34:0::1;::::0;-1:-1:-1;;33322:55:0:i:1;:::-;33388:14;33417:4;-1:-1:-1::0;;;;;33405:27:0::1;;33441:4;33405:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;33405:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33405:42:0;;-1:-1:-1;33466:25:0;;::::1;;33458:80;;;;-1:-1:-1::0;;;33458:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33555:4;-1:-1:-1::0;;;;;33549:20:0::1;;33570:9;33549:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33591:45;33622:2;33626:9;33591:30;:45::i;26655:693::-:0;26871:21;26843:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;26929:4:::1;-1:-1:-1::0;;;;;26918:15:0::1;:4;;26923:1;26918:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26918:7:0::1;-1:-1:-1::0;;;;;26918:15:0::1;;26910:56;;;::::0;;-1:-1:-1;;;26910:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;26910:56:0;;;;;;;;;;;;;::::1;;26987:55;27017:7;27026:9;27037:4;;26987:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26987:29:0::1;::::0;-1:-1:-1;;;26987:55:0:i:1;:::-;26977:65;;27092:12;27061:7;27086:1;27069:7;:14;:18;27061:27;;;;;;;;;;;;;;:43;;27053:98;;;;-1:-1:-1::0;;;27053:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27168:4;-1:-1:-1::0;;;;;27162:19:0::1;;27189:7;27197:1;27189:10;;;;;;;;;;;;;;27162:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27226:4;-1:-1:-1::0;;;;;27220:20:0::1;;27241:50;27265:7;27274:4;;27279:1;27274:7;;;;;;27241:50;27293:7;27301:1;27293:10;;;;;;;;;;;;;;27220:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;27220:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27220:84:0;27213:92:::1;;;;27316:24;27322:7;27331:4;;27316:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27337:2:0;;-1:-1:-1;27316:5:0::1;::::0;-1:-1:-1;;27316:24:0:i:1;:::-;26655:693:::0;;;;;;;;:::o;34152:260::-;34305:13;34343:61;34371:9;34382;34393:10;34343:27;:61::i;26046:603::-;26270:21;26251:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;26314:54:::1;26343:7;26352:9;26363:4;;26314:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26314:28:0::1;::::0;-1:-1:-1;;;26314:54:0:i:1;:::-;26304:64;;26401:11;26387:7;26395:1;26387:10;;;;;;;;;;;;;;:25;;26379:76;;;;-1:-1:-1::0;;;26379:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16556:38:::0;;;:::o;33688:187::-;33785:12;33817:50;33839:7;33848:8;33858;33817:21;:50::i;23140:705::-;23406:14;23387:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;23449:196:::1;23479:5;23499:4;23518:9;23542:14;23571:12;23606:4;23626:8;23449:15;:196::i;:::-;23433:212;;;;;;23656:83;23684:5;23691:2;23707:5;-1:-1:-1::0;;;;;23695:28:0::1;;23732:4;23695:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;23695:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23695:43:0;23656:27:::1;:83::i;:::-;23756:4;-1:-1:-1::0;;;;;23750:20:0::1;;23771:9;23750:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23792:45;23823:2;23827:9;23792:30;:45::i;31936:857::-:0;32196:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;32241:4:::1;-1:-1:-1::0;;;;;32230:15:0::1;:4;;32235:1;32230:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32230:7:0::1;-1:-1:-1::0;;;;;32230:15:0::1;;32222:56;;;::::0;;-1:-1:-1;;;32222:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32222:56:0;;;;;;;;;;;;;::::1;;32289:13;32305:9;32289:25;;32331:4;-1:-1:-1::0;;;;;32325:19:0::1;;32352:8;32325:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32387:4;-1:-1:-1::0;;;;;32381:20:0::1;;32402:50;32426:7;32435:4;;32440:1;32435:7;;;;;;32402:50;32454:8;32381:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;32381:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32381:82:0;32374:90:::1;;;;32475:18;32508:4:::0;;-1:-1:-1;;32513:15:0;;32508:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32508:21:0::1;-1:-1:-1::0;;;;;32496:44:0::1;;32541:2;32496:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;32496:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32496:48:0;32555:44:::1;::::0;;32496:48:::1;32555:44:::0;;::::1;::::0;;;;;;;;;;;32496:48;;-1:-1:-1;32555:44:0::1;::::0;;;32590:4;;;;;;32555:44;::::1;::::0;32590:4;;32555:44;32590:4;32555:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32596:2:0;;-1:-1:-1;32555:34:0::1;::::0;-1:-1:-1;;32555:44:0:i:1;:::-;32703:12:::0;32632:67:::1;32685:13:::0;32644:4;;-1:-1:-1;;32649:15:0;;32644:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32644:21:0::1;-1:-1:-1::0;;;;;32632:44:0::1;;32677:2;32632:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;32632:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20169:859:::0;20423:12;20437;20404:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;20462:12:::1;20477:48;20501:7;20510:6;20518;20477:23;:48::i;:::-;20536:61;::::0;;-1:-1:-1;;;20536:61:0;;20569:10:::1;20536:61;::::0;::::1;::::0;-1:-1:-1;;;;;20536:32:0;::::1;:61:::0;;;;;;;;;;;;;;20462:63;;-1:-1:-1;20536:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20536:32:0;:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20665:28:0::1;::::0;;-1:-1:-1;;;20665:28:0;;-1:-1:-1;;;;;20665:28:0;;::::1;;::::0;::::1;::::0;;;20635:12:::1;::::0;;;20665:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;20635:12;20665:24;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20665:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20665:28:0;-1:-1:-1;20705:14:0::1;20724:42;20751:6:::0;20759;20724:26:::1;:42::i;:::-;20704:62;;;20808:6;-1:-1:-1::0;;;;;20798:16:0::1;:6;-1:-1:-1::0;;;;;20798:16:0::1;;:58;;20839:7;20848;20798:58;;;20818:7;20827;20798:58;20777:79:::0;;-1:-1:-1;20777:79:0;-1:-1:-1;20875:21:0;;::::1;;20867:71;;;;-1:-1:-1::0;;;20867:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20968:10;20957:7;:21;;20949:71;;;;-1:-1:-1::0;;;20949:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16719:1;;;;20169:859:::0;;;;;;;;;;;:::o;16508:41::-;;;:::o;34420:252::-;34564:21;34610:54;34640:7;34649:8;34659:4;34610:29;:54::i;22394:667::-;22683:16;22701:14;22728:12;22743:45;22767:7;22776:5;22783:4;22743:23;:45::i;:::-;22728:60;;22799:10;22812;:33;;22836:9;22812:33;;;-1:-1:-1;;22812:33:0;22856:79;;;-1:-1:-1;;;22856:79:0;;22883:10;22856:79;;;;22903:4;22856:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22799:46;;-1:-1:-1;;;;;;22856:26:0;;;;;:79;;;;;-1:-1:-1;;22856:79:0;;;;;;;;-1:-1:-1;22856:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:80;22992:5;22999:9;23010:14;23026:12;23040:2;23044:8;22973:18;:80::i;:::-;22946:107;;;;-1:-1:-1;22394:667:0;-1:-1:-1;;;;;;;;;;;;;22394:667:0:o;18412:736::-;18700:12;18714;18728:14;18681:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;18776:85:::1;18790:6;18798;18806:14;18822;18838:10;18850;18776:13;:85::i;:::-;18755:106:::0;;-1:-1:-1;18755:106:0;-1:-1:-1;18872:12:0::1;18887:48;18911:7;18920:6:::0;18928;18887:23:::1;:48::i;:::-;18872:63;;18946:66;18978:6;18986:10;18998:4;19004:7;18946:31;:66::i;:::-;19023;19055:6;19063:10;19075:4;19081:7;19023:31;:66::i;:::-;19126:4;-1:-1:-1::0;;;;;19112:24:0::1;;19137:2;19112:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;19112:28:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19112:28:0;18412:736;;;;-1:-1:-1;19112:28:0;;-1:-1:-1;18412:736:0;;-1:-1:-1;;;;;;;;;18412:736:0:o;19154:972::-;19407:16;19425:14;19441;19388:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;19495:176:::1;19523:5;19543:4;19562:18;19595:9;19619:14;19648:12;19495:13;:176::i;:::-;19468:203:::0;;-1:-1:-1;19468:203:0;-1:-1:-1;19682:12:0::1;19697:45;19721:7;19730:5:::0;19737:4:::1;19697:23;:45::i;:::-;19682:60;;19753:69;19785:5;19792:10;19804:4;19810:11;19753:31;:69::i;:::-;19839:4;-1:-1:-1::0;;;;;19833:19:0::1;;19860:9;19833:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;19896:4;-1:-1:-1::0;;;;;19890:20:0::1;;19911:4;19917:9;19890:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19890:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19890:37:0;19883:45:::1;;;;19965:4;-1:-1:-1::0;;;;;19951:24:0::1;;19976:2;19951:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;19951:28:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19951:28:0;;-1:-1:-1;20030:9:0::1;:21:::0;-1:-1:-1;20026:92:0::1;;;20053:65;20084:10;20108:9;20096;:21;20053:30;:65::i;:::-;16719:1;19154:972:::0;;;;;;;;;;;:::o;29036:806::-;29249:21;29221:8;16665:15;16653:8;:27;;16645:63;;;;;-1:-1:-1;;;16645:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16645:63:0;;;;;;;;;;;;;;;29307:4:::1;-1:-1:-1::0;;;;;29296:15:0::1;:4;;29301:1;29296:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29296:7:0::1;-1:-1:-1::0;;;;;29296:15:0::1;;29288:56;;;::::0;;-1:-1:-1;;;29288:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29288:56:0;;;;;;;;;;;;;::::1;;29365:54;29394:7;29403:9;29414:4;;29365:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29365:28:0::1;::::0;-1:-1:-1;;;29365:54:0:i:1;:::-;29355:64;;29452:9;29438:7;29446:1;29438:10;;;;;;;;;;;;;;:23;;29430:74;;;;-1:-1:-1::0;;;29430:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29521:4;-1:-1:-1::0;;;;;29515:19:0::1;;29542:7;29550:1;29542:10;;;;;;;;;;;;;;29515:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29579:4;-1:-1:-1::0;;;;;29573:20:0::1;;29594:50;29618:7;29627:4;;29632:1;29627:7;;;;;;29594:50;29646:7;29654:1;29646:10;;;;;;;;;;;;;;29573:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;29573:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29573:84:0;29566:92:::1;;;;29669:24;29675:7;29684:4;;29669:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29690:2:0;;-1:-1:-1;29669:5:0::1;::::0;-1:-1:-1;;29669:24:0:i:1;:::-;29756:7;29764:1;29756:10;;;;;;;;;;;;;;29744:9;:22;29740:94;;;29768:66;29799:10;29823:7;29831:1;29823:10;;;;;;;;;;;;;;29811:9;:22;29768:30;:66::i;8320:361::-:0;8515:45;;;-1:-1:-1;;;;;8515:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8515:45:0;-1:-1:-1;;;8515:45:0;;;8504:57;;;;8469:12;;8483:17;;8504:10;;;;8515:45;8504:57;;;8515:45;8504:57;;8515:45;8504:57;;;;;;;;;;-1:-1:-1;;8504:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8468:93;;;;8580:7;:57;;;;-1:-1:-1;8592:11:0;;:16;;:44;;;8623:4;8612:24;;;;;;;;;;;;;;;-1:-1:-1;8612:24:0;8592:44;8572:101;;;;;-1:-1:-1;;;8572:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8320:361;;;;;:::o;9099:195::-;9207:12;;;9169;9207;;;;;;;;;-1:-1:-1;;;;;9186:7:0;;;9200:5;;9186:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9186:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9168:52;;;9239:7;9231:55;;;;-1:-1:-1;;;9231:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9099:195;;;:::o;5359:515::-;5452:14;5498:1;5487:8;:12;5479:67;;;;-1:-1:-1;;;5479:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5577:1;5565:9;:13;:31;;;;;5595:1;5582:10;:14;5565:31;5557:83;;;;-1:-1:-1;;;5557:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5651:20;5674:17;:8;5687:3;5674:12;:17::i;:::-;5651:40;-1:-1:-1;5702:14:0;5719:31;5651:40;5739:10;5719:19;:31::i;:::-;5702:48;-1:-1:-1;5761:16:0;5780:40;5804:15;5780:19;:9;5794:4;5780:13;:19::i;:::-;:23;;:40::i;:::-;5761:59;;5855:11;5843:9;:23;;;;;;;5359:515;-1:-1:-1;;;;;;;5359:515:0:o;6547:510::-;6648:21;6705:1;6690:4;:11;:16;;6682:58;;;;;-1:-1:-1;;;6682:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6772:4;:11;6761:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6761:23:0;;6751:33;;6808:8;6795:7;6803:1;6795:10;;;;;;;;;;;;;:21;;;;;6832:6;6827:223;6858:1;6844:4;:11;:15;6840:1;:19;6827:223;;;6882:14;6898:15;6917:42;6929:7;6938:4;6943:1;6938:7;;;;;;;;;;;;;;6947:4;6952:1;6956;6952:5;6947:11;;;;;;;;;;;;;;6917;:42::i;:::-;6881:78;;;;6991:47;7004:7;7012:1;7004:10;;;;;;;;;;;;;;7016:9;7027:10;6991:12;:47::i;:::-;6974:7;6982:1;6986;6982:5;6974:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6861:3:0;;6827:223;;;;6547:510;;;;;:::o;3879:478::-;3968:12;3994:14;4010;4028:26;4039:6;4047;4028:10;:26::i;:::-;4192:32;;;-1:-1:-1;;4192:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4182:43;;;;;;-1:-1:-1;;;;;;4095:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4085:262;;;;;;;;;3879:478;-1:-1:-1;;;;;3879:478:0:o;8689:402::-;8914:51;;;-1:-1:-1;;;;;8914:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8914:51:0;-1:-1:-1;;;8914:51:0;;;8903:63;;;;8868:12;;8882:17;;8903:10;;;;8914:51;8903:63;;;8914:51;8903:63;;8914:51;8903:63;;;;;;;;;;-1:-1:-1;;8903:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8867:99;;;;8985:7;:57;;;;-1:-1:-1;8997:11:0;;:16;;:44;;;9028:4;9017:24;;;;;;;;;;;;;;;-1:-1:-1;9017:24:0;8997:44;8977:106;;;;-1:-1:-1;;;8977:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8689:402;;;;;;:::o;24678:731::-;24785:6;24780:622;24811:1;24797:4;:11;:15;24793:1;:19;24780:622;;;24835:13;24850:14;24869:4;24874:1;24869:7;;;;;;;;;;;;;;24878:4;24883:1;24887;24883:5;24878:11;;;;;;;;;;;;;;24834:56;;;;24906:14;24925:41;24952:5;24959:6;24925:26;:41::i;:::-;24905:61;;;24981:14;24998:7;25006:1;25010;25006:5;24998:14;;;;;;;;;;;;;;24981:31;;25028:15;25045;25073:6;-1:-1:-1;;;;;25064:15:0;:5;-1:-1:-1;;;;;25064:15:0;;:61;;25106:9;25122:1;25064:61;;;25088:1;25092:9;25064:61;25027:98;;;;25140:10;25171:1;25157:4;:11;:15;25153:1;:19;:81;;25231:3;25153:81;;;25175:53;25199:7;25208:6;25216:4;25221:1;25225;25221:5;25216:11;;;;;;;;;;;;;;25175:23;:53::i;:::-;25140:94;;25263:47;25287:7;25296:5;25303:6;25263:23;:47::i;:::-;-1:-1:-1;;;;;25249:67:0;;25335:10;25347;25359:2;25373:1;25363:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25363:12:0;;25249:141;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25249:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24814:3:0;;;;;-1:-1:-1;24780:622:0;;-1:-1:-1;;;;;;;;24780:622:0;;;24678:731;;;:::o;7138:531::-;7239:21;7296:1;7281:4;:11;:16;;7273:58;;;;;-1:-1:-1;;;7273:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7363:4;:11;7352:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7352:23:0;;7342:33;;7416:9;7386:7;7411:1;7394:7;:14;:18;7386:27;;;;;;;;;;;;;;;;;:39;7450:11;;-1:-1:-1;;7450:15:0;7436:226;7467:5;;7436:226;;7495:14;7511:15;7530:42;7542:7;7551:4;7560:1;7556;:5;7551:11;;;;;;;;;;;;;;7564:4;7569:1;7564:7;;;;;;;7530:42;7494:78;;;;7604:46;7616:7;7624:1;7616:10;;;;;;;;;;;;;;7628:9;7639:10;7604:11;:46::i;:::-;7587:7;7599:1;7595;:5;7587:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7474:3:0;7436:226;;29989:1213;30102:6;30097:1098;30128:1;30114:4;:11;:15;30110:1;:19;30097:1098;;;30152:13;30167:14;30186:4;30191:1;30186:7;;;;;;;;;;;;;;30195:4;30200:1;30204;30200:5;30195:11;;;;;;;;;;;;;;30151:56;;;;30223:14;30242:41;30269:5;30276:6;30242:26;:41::i;:::-;30222:61;;;30298:18;30333:47;30357:7;30366:5;30373:6;30333:23;:47::i;:::-;30298:83;;30396:16;30427:17;30515:13;30530;30548:4;-1:-1:-1;;;;;30548:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30548:18:0;;;;;;;-1:-1:-1;;;;;30514:52:0;;;;-1:-1:-1;30514:52:0;;-1:-1:-1;30582:17:0;;-1:-1:-1;;;;;30623:15:0;;;;;;;:61;;30665:8;30675;30623:61;;;30642:8;30652;30623:61;30581:103;;;;30713:61;30761:12;30725:5;-1:-1:-1;;;;;30713:28:0;;30750:4;30713:43;;;;;;;;;;;;;-1:-1:-1;;;;;30713:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;:61;30699:75;;30804:70;30833:11;30846:12;30860:13;30804:28;:70::i;:::-;30789:85;;30097:1098;;;;30905:15;30922;30950:6;-1:-1:-1;;;;;30941:15:0;:5;-1:-1:-1;;;;;30941:15:0;;:67;;30986:12;31005:1;30941:67;;;30965:1;30969:12;30941:67;30904:104;;;;31023:10;31054:1;31040:4;:11;:15;31036:1;:19;:81;;31114:3;31036:81;;;31058:53;31082:7;31091:6;31099:4;31104:1;31108;31104:5;31099:11;;;;;;;31058:53;31170:12;;;31180:1;31170:12;;;;;;;;;;-1:-1:-1;;;31132:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31132:51:0;;;;;;;;;;;;;;;;;;;;;;31023:94;;-1:-1:-1;31132:9:0;;;;;;31142:10;;31154;;31023:94;;31170:12;;31132:51;;;;;;;;31170:12;;31132:51;;;;31170:12;;31132:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30131:3:0;;;;;-1:-1:-1;30097:1098:0;;-1:-1:-1;;;;;;;;;;30097:1098:0;2892:129;2976:5;;;2971:16;;;;2963:50;;;;;-1:-1:-1;;;2963:50:0;;;;;;;;;;;;-1:-1:-1;;;2963:50:0;;;;;;;;;;;;;;5995:470;6088:13;6134:1;6122:9;:13;6114:69;;;;-1:-1:-1;;;6114:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6214:1;6202:9;:13;:31;;;;;6232:1;6219:10;:14;6202:31;6194:83;;;;-1:-1:-1;;;6194:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6288:14;6305:34;6334:4;6305:24;:9;6319;6305:13;:24::i;:::-;:28;;:34::i;:::-;6288:51;-1:-1:-1;6350:16:0;6369:34;6399:3;6369:25;:10;6384:9;6369:14;:25::i;:34::-;6350:53;;6425:32;6455:1;6438:11;6426:9;:23;;;;;;;6425:29;:32::i;:::-;6414:43;5995:470;-1:-1:-1;;;;;;5995:470:0:o;4918:319::-;5000:12;5043:1;5033:7;:11;5025:60;;;;-1:-1:-1;;;5025:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5115:1;5104:8;:12;:28;;;;;5131:1;5120:8;:12;5104:28;5096:80;;;;-1:-1:-1;;;5096:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5221:8;5197:21;:7;5209:8;5197:11;:21::i;:::-;:32;;;;;;;4918:319;-1:-1:-1;;;;4918:319:0:o;3440:347::-;3515:14;3531;3576:6;-1:-1:-1;;;;;3566:16:0;:6;-1:-1:-1;;;;;3566:16:0;;;3558:65;;;;-1:-1:-1;;;3558:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3662:6;-1:-1:-1;;;;;3653:15:0;:6;-1:-1:-1;;;;;3653:15:0;;:53;;3691:6;3699;3653:53;;;3672:6;3680;3653:53;3634:72;;-1:-1:-1;3634:72:0;-1:-1:-1;;;;;;3725:20:0;;3717:62;;;;;-1:-1:-1;;;3717:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3440:347;;;;;:::o;17023:1383::-;17241:12;17255;17397:1;-1:-1:-1;;;;;17336:63:0;17353:7;-1:-1:-1;;;;;17336:33:0;;17370:6;17378;17336:49;;;;;;;;;;;;;-1:-1:-1;;;;;17336:49:0;;;;;;-1:-1:-1;;;;;17336:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17336:49:0;-1:-1:-1;;;;;17336:63:0;;17332:148;;;17433:7;-1:-1:-1;;;;;17416:36:0;;17453:6;17461;17416:52;;;;;;;;;;;;;-1:-1:-1;;;;;17416:52:0;;;;;;-1:-1:-1;;;;;17416:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17332:148:0;17491:13;17506;17523:52;17551:7;17560:6;17568;17523:27;:52::i;:::-;17490:85;;;;17590:8;17602:1;17590:13;:30;;;;-1:-1:-1;17607:13:0;;17590:30;17586:813;;;17659:14;;-1:-1:-1;17675:14:0;;-1:-1:-1;17586:813:0;;;17723:19;17745:57;17767:14;17783:8;17793;17745:21;:57::i;:::-;17723:79;;17839:14;17821;:32;17817:571;;17900:10;17882:14;:28;;17874:78;;;;-1:-1:-1;;;17874:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17993:14;;-1:-1:-1;18009:14:0;-1:-1:-1;18009:14:0;17817:571;;;18065:19;18087:57;18109:14;18125:8;18135;18087:21;:57::i;:::-;18065:79;;18188:14;18170;:32;;18163:40;;;;18248:10;18230:14;:28;;18222:78;;;;-1:-1:-1;;;18222:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18341:14;-1:-1:-1;18357:14:0;;-1:-1:-1;17817:571:0;17586:813;;17023:1383;;;;;;;;;;;:::o;3029:142::-;3081:6;3108;;;:30;;-1:-1:-1;;3123:5:0;;;3137:1;3132;3123:5;3132:1;3118:15;;;;;:20;3108:30;3100:63;;;;;-1:-1:-1;;;3100:63:0;;;;;;;;;;;;-1:-1:-1;;;3100:63:0;;;;;;;;;;;;;;2756:128;2840:5;;;2835:16;;;;2827:49;;;;;-1:-1:-1;;;2827:49:0;;;;;;;;;;;;-1:-1:-1;;;2827:49:0;;;;;;;;;;;;;;4415:390;4508:13;4523;4550:14;4569:26;4580:6;4588;4569:10;:26::i;:::-;4549:46;;;4607:13;4622;4654:32;4662:7;4671:6;4679;4654:7;:32::i;:::-;-1:-1:-1;;;;;4640:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4640:61:0;;;;;;;-1:-1:-1;;;;;4606:95:0;;;;-1:-1:-1;4606:95:0;;-1:-1:-1;;;;;;4735:16:0;;;;;;;:62;;4778:8;4788;4735:62;;;4755:8;4765;4735:62;4712:85;;;;-1:-1:-1;4415:390:0;-1:-1:-1;;;;;;;4415:390:0:o

Swarm Source

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