Contract 0xa38cd27185a464914d3046f0ab9d43356b34829d 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3f9bd1ae1c3ea9d42a57aa0005a48a7ccb7af7704411fb3ef7be60150088134cAdd Liquidity391049422022-05-26 14:21:171 min ago0x9c71b6370dcdbdac36621c00b5d7e7e0d49fa8dd IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.157427754
0x955379a25690744539a12115c636108514c7e0080c7a5c7d092c3efcfdac1bc7Swap Exact Token...391047062022-05-26 14:16:465 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.053747284
0xfc6f3efeaddb372fd065f39336eb4a8a528aa545d8c2455531f62a70bc628b120xe8ef4681391046612022-05-26 14:15:516 mins ago0x9c71b6370dcdbdac36621c00b5d7e7e0d49fa8dd IN  0xa38cd27185a464914d3046f0ab9d43356b34829d172 FTM0.06710246
0x4cedd5e89c966a99fbe2b366febceaba7b0c55ebb86118dee4dbd0a320ed9d7d0xc6b9577e391046572022-05-26 14:15:476 mins ago0x2935f9621d4448d3ddc516c31c9a8c82e4ada863 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.20020991
0xfdbb0b909d237ce29cd9f1a10526396e4b8d47dcadba30843f9f41438790fc3f0xf41766d8391046522022-05-26 14:15:426 mins ago0xe83ff81e148b1dc5e12f18954e1c43816a5f2409 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.135317952
0x66fa05355dc20b7848e154e8c00cab20e4e151df1cf53c513ba66536cc63c16f0xf41766d8391046072022-05-26 14:14:507 mins ago0x903055dab0a4538f05acc6a51e9f3c0b62608a8f IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.0832748
0xb12b4f65e86b4e55e5faa6b4184da500ea802ad926132dbaf7fb0ca038363a270xe8ef4681391045962022-05-26 14:14:367 mins ago0x9c71b6370dcdbdac36621c00b5d7e7e0d49fa8dd IN  0xa38cd27185a464914d3046f0ab9d43356b34829d172 FTM0.100721761
0x3ddab610d3b18285fdcb4e46dd0ce20559cb338ca88f56f215eead9269524fc4Swap Exact Token...391045712022-05-26 14:14:098 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.06190395
0xd27f12c660ba3275fb31d27565f3bb75076fee04259414384e579a049bd19c33Swap Exact Token...391044982022-05-26 14:12:579 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.141055608
0x6b2688aa0960fdd1a6575d4de4651d7a29afc3e1df3f9c07e5ba854072012129Swap Exact Token...391043552022-05-26 14:10:1612 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.04920526
0x1ab04df1a3819818148e420df3912938c596c17bcf73b79c9df96156fdf8131eSwap Exact Token...391043052022-05-26 14:09:1413 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.613223097
0x43c3c5d295876bd9e2b76a7d7a0a81f58160087ed228c830a4cb430d1e692c4c0xf41766d8391042502022-05-26 14:07:3714 mins ago0xd3f486244745a12263c702bd901d4c9a19390ef7 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.076403126019
0xe21053c9cd0e7179cdadb3ff31ed747855aa10609c160ed5437cc05bc87d7cdcSwap Exact Token...391041492022-05-26 14:05:2116 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.045311296
0x0c6a352a6a7c3546beda0b8b63dc7ad130c5e5b895c972bd6fef237edaca85eaSwap Exact Token...391041352022-05-26 14:05:0617 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.047305424
0x0f978a86ec33014fb23a71b24fbdb6b7b092809f3d4b98b1d079f0fc49b713eeSwap Exact Token...391040662022-05-26 14:03:4518 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.047705364
0xd70ba8b5dd5d5b0d3b35fe11ed51bff2cb7c22cfc7b01b93cd56b54cd70282ef0xc6b9577e391040032022-05-26 14:02:4119 mins ago0x113da8c8d151df445d1b7056bc1c2335c3d3fb1e IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.060831714
0x8a30ccedbe34457db74c2e93c44a0e7a98b034ef43002574ae4dec64018af02f0xf41766d8391039312022-05-26 14:01:0321 mins ago0x2acbe85f5e71cb7c46b94e2cf3b817033571f561 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.079609068
0x47e844908e93467ade4fd7e4c7f7dfbaf1616a14470b22185fed0145feac40870xf41766d8391038452022-05-26 13:59:2922 mins ago0x4523b791292da89a9194b61ba4cd9d98f2af68e0 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.26723894
0xd209859807fdc31f03bee141ec50839c49c7e1b4fb1a66b4cb70853c2b3dae4e0xf41766d8391037442022-05-26 13:57:2924 mins ago0x903055dab0a4538f05acc6a51e9f3c0b62608a8f IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.031239
0x862e34cc7e57051cb89ecb0bccded509fd8fdedd7da47a48d8f88f72a70e55cf0xf41766d8391036922022-05-26 13:56:3125 mins ago0xdd15b64fcbff23c1d0d57abb630f2db80baada30 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.08864412
0xc68774799b1593c331d1ea08a6602e1112757c3a16cfb4cb2afcb25e8a715c9dSwap Exact Token...391035152022-05-26 13:53:0529 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.243970896
0xdb3f08b9e396b56d9bf692e755104d6b950c4a77e0217a48f3d0c553e660b8d4Swap Exact Token...391034512022-05-26 13:51:2230 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.172326613
0x12be12a435ff2a0a8ad3b2a3aadb4faa6e1a4e7303ca9db59a1a84822679a671Swap Exact Token...391034382022-05-26 13:51:0731 mins ago0xa64c3889eb7bb32f2b37fccd055752539b9856e6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.988836475
0xccf6a944ab2d60eeb1c45e117f86f3b1bc31aafbfd8d558b2a14ac396dd123adSwap Exact Token...391034242022-05-26 13:50:4731 mins ago0xdc0479535d8334c491eec85338860469b316fde6 IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM0.304354316594
0xd9c4ecf30bb640a0f6052abb1678ec7bac406c736fda3bbbe1a7fb98b6eb15940xf41766d8391034092022-05-26 13:50:1732 mins ago0xe7ec500e14edbe3ca3358bcde7df145968b2aead IN  0xa38cd27185a464914d3046f0ab9d43356b34829d0 FTM2.216903976767
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xfc6f3efeaddb372fd065f39336eb4a8a528aa545d8c2455531f62a70bc628b12391046612022-05-26 14:15:516 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token172 FTM
0x4cedd5e89c966a99fbe2b366febceaba7b0c55ebb86118dee4dbd0a320ed9d7d391046572022-05-26 14:15:476 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x2935f9621d4448d3ddc516c31c9a8c82e4ada863228.324799399733991929 FTM
0x4cedd5e89c966a99fbe2b366febceaba7b0c55ebb86118dee4dbd0a320ed9d7d391046572022-05-26 14:15:476 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d228.324799399733991929 FTM
0xb12b4f65e86b4e55e5faa6b4184da500ea802ad926132dbaf7fb0ca038363a27391045962022-05-26 14:14:367 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token172 FTM
0xd70ba8b5dd5d5b0d3b35fe11ed51bff2cb7c22cfc7b01b93cd56b54cd70282ef391040032022-05-26 14:02:4119 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x113da8c8d151df445d1b7056bc1c2335c3d3fb1e165.782482094638282675 FTM
0xd70ba8b5dd5d5b0d3b35fe11ed51bff2cb7c22cfc7b01b93cd56b54cd70282ef391040032022-05-26 14:02:4119 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d165.782482094638282675 FTM
0xf62ee7ebb5ea3aef652d099ab89ee3db9c489d6a07be1c195dd5077855059c1a391026832022-05-26 13:32:4349 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token246.25645426620219987 FTM
0x22d175d8fbb9a72261c7581b8b7dfebab22b9951ea32866171697324286254d4391010732022-05-26 12:54:481 hr 27 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token14.879352333858602779 FTM
0xe0dd2032d5675a933ab7fe08f2bb91547448e24fad5435dff0b707a434d919bc391005702022-05-26 12:45:291 hr 36 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0xa3b6befdac7697f04c0e7c0e627c4ad48c416cf712.396677472545416273 FTM
0xe0dd2032d5675a933ab7fe08f2bb91547448e24fad5435dff0b707a434d919bc391005702022-05-26 12:45:291 hr 36 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d12.396677472545416273 FTM
0x89e29927e64743302427293c3df168b3d470df6be6217e161ac92aab5201d2b8391004842022-05-26 12:44:001 hr 38 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x794b769d5c7e4d66d9a8d1da91e9cb7a94bb18e74.150058473109344963 FTM
0x89e29927e64743302427293c3df168b3d470df6be6217e161ac92aab5201d2b8391004842022-05-26 12:44:001 hr 38 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d4.150058473109344963 FTM
0x8f88af9395e2fa8dd15faf5db1a6845ebeca59561b213cf55bc1ca6ed14e5cfa391003572022-05-26 12:41:441 hr 40 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token52 FTM
0x2e914866b0989845c84e8f7b60d4c37a8a321e18a1540907f34fc47643c647f4391002662022-05-26 12:40:021 hr 42 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x375e9372dea897283bed1478c9b11cfa323e577f10.369501802272724117 FTM
0x2e914866b0989845c84e8f7b60d4c37a8a321e18a1540907f34fc47643c647f4391002662022-05-26 12:40:021 hr 42 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d10.369501802272724117 FTM
0x644f7e4c91d9cd5e3c178f56e8804ea6dfe9d72c25dd23eb666160e9a530bd94391002462022-05-26 12:39:411 hr 42 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x375e9372dea897283bed1478c9b11cfa323e577f92.7499147962575905 FTM
0x644f7e4c91d9cd5e3c178f56e8804ea6dfe9d72c25dd23eb666160e9a530bd94391002462022-05-26 12:39:411 hr 42 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d92.7499147962575905 FTM
0x006fc31470f9c60fc2a5401da03a401a4e35984bbda6acc36df934bbf7ac3d6b390981802022-05-26 12:00:332 hrs 21 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d0x05391a4b0749c29335024f41552a56cfa6bd38834.127031960678249355 FTM
0x006fc31470f9c60fc2a5401da03a401a4e35984bbda6acc36df934bbf7ac3d6b390981802022-05-26 12:00:332 hrs 21 mins ago Fantom Finance: Wrapped Fantom Token 0xa38cd27185a464914d3046f0ab9d43356b34829d4.127031960678249355 FTM
0x1452882bd2308047b8e736ddc3de9d2eed8c21a8cb08f3d749b7fa72c0d06999390970732022-05-26 11:39:192 hrs 43 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token146.91866063485292402 FTM
0xfacd992621126329f9a852a5e6b409a28a119053189411720269358d7e27a1d4390965802022-05-26 11:30:132 hrs 52 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token251.597915390680826 FTM
0x9c8085e8faffbe265c8a98a20089dbb09c435570135d8a705614164173d1b472390961922022-05-26 11:22:362 hrs 59 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token82 FTM
0xd4c449bbb3413b9cf09ccbf9cedb43e42c94709d3596c32161459991c1c541b6390959812022-05-26 11:18:253 hrs 3 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token241.305927213991509398 FTM
0x2ef3a37b99dde2e1fb055d82761ac64e6370292c508dc9a9ab0b33e3b6e1be12390954272022-05-26 11:07:293 hrs 14 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token229.881373347026505481 FTM
0x82dd48f13ae165a1168436d91ef23d96141a674ecd15a3eb0cb90691a13c3d86390939322022-05-26 10:35:143 hrs 47 mins ago 0xa38cd27185a464914d3046f0ab9d43356b34829d Fantom Finance: Wrapped Fantom Token10 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BaseV1Router01

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-02-10
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.11;

interface IBaseV1Factory {
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

interface IBaseV1Pair {
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

interface erc20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
}

library Math {
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

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

contract BaseV1Router01 {

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWFTM public immutable wftm;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

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

    constructor(address _factory, address _wftm) {
        factory = _factory;
        pairCodeHash = IBaseV1Factory(_factory).pairCodeHash();
        wftm = IWFTM(_wftm);
    }

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

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'BaseV1Router: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'BaseV1Router: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint256(keccak256(abi.encodePacked(
            hex'ff',
            factory,
            keccak256(abi.encodePacked(token0, token1, stable)),
            pairCodeHash // init code hash
        )))));
    }

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

    // fetches and sorts the reserves for a pair
    function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IBaseV1Pair(pairFor(tokenA, tokenB, stable)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IBaseV1Factory(factory).isPair(pair)) {
            amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IBaseV1Factory(factory).isPair(pair)) {
            amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'BaseV1Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IBaseV1Factory(factory).isPair(pair)) {
                amounts[i+1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IBaseV1Factory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = erc20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = erc20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin);
        require(amountBDesired >= amountBMin);
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IBaseV1Factory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBaseV1Pair(pair).mint(to);
    }

    function addLiquidityFTM(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountFTM, uint liquidity) {
        (amountToken, amountFTM) = _addLiquidity(
            token,
            address(wftm),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountFTMMin
        );
        address pair = pairFor(token, address(wftm), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        wftm.deposit{value: amountFTM}();
        assert(wftm.transfer(pair, amountFTM));
        liquidity = IBaseV1Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountFTM) _safeTransferFTM(msg.sender, msg.value - amountFTM);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair
        (uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityFTM(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountFTM) {
        (amountToken, amountFTM) = removeLiquidity(
            token,
            address(wftm),
            stable,
            liquidity,
            amountTokenMin,
            amountFTMMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        wftm.withdraw(amountFTM);
        _safeTransferFTM(to, amountFTM);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityFTMWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountFTMMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountFTM) {
        address pair = pairFor(token, address(wftm), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountFTM) = removeLiquidityFTM(token, stable, liquidity, amountTokenMin, amountFTMMin, to, deadline);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        route[] memory routes = new route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactFTMForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(wftm), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        wftm.deposit{value: amounts[0]}();
        assert(wftm.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForFTM(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(wftm), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        wftm.withdraw(amounts[amounts.length - 1]);
        _safeTransferFTM(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

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

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wftm","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityFTM","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityFTM","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","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":"removeLiquidityFTMWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactFTMForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForFTM","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct BaseV1Router01.route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wftm","outputs":[{"internalType":"contract IWFTM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003a4338038062003a438339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c05161384f620001f46000396000610a7501526000818161013e0152818161049d01528181610c1b01528181610c5101528181610c8601528181610d30015281816118f901528181611acc01528181611be701528181611c3701528181611ccf01528181611e5701528181611f6a015261200a0152600081816103a60152818161089301528181610a3a01528181610f590152818161106d015281816114a50152818161161901528181611dbf0152818161263701526126d8015261384f6000f3fe60806040526004361061012e5760003560e01c80639881fcb4116100ab578063cc1d17731161006f578063cc1d1773146103e8578063d28254b814610408578063e5e31b1314610428578063e8ef468114610458578063f41766d81461046b578063f4f45b461461048b57600080fd5b80639881fcb41461033457806398a0fb3c14610354578063a32b1fcd14610374578063c45a015514610394578063c6b9577e146103c857600080fd5b8063578caf32116100f2578063578caf32146102715780635a47ddc31461029f5780635e1e6325146102bf5780635e60dab5146102f45780637301e3c81461031457600080fd5b80630dede6c41461017257806313dcfc59146101ac5780634386e63c146101d95780634c1ee03e146101f9578063544caa561461023157600080fd5b3661016d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016b5761016b612b43565b005b600080fd5b34801561017e57600080fd5b5061019261018d366004612b8a565b6104bf565b604080519283526020830191909152015b60405180910390f35b3480156101b857600080fd5b506101cc6101c7366004612c0f565b610679565b6040516101a39190612c8a565b3480156101e557600080fd5b506101926101f4366004612cce565b61088c565b34801561020557600080fd5b50610219610214366004612d1f565b6109f3565b6040516001600160a01b0390911681526020016101a3565b34801561023d57600080fd5b5061025161024c366004612d6a565b610afb565b604080516001600160a01b039384168152929091166020830152016101a3565b61028461027f366004612da3565b610bef565b604080519384526020840192909252908201526060016101a3565b3480156102ab57600080fd5b506102846102ba366004612dfe565b610e41565b3480156102cb57600080fd5b506102df6102da366004612e8d565b610f21565b604080519283529015156020830152016101a3565b34801561030057600080fd5b5061019261030f366004612d1f565b611175565b34801561032057600080fd5b506101cc61032f366004612f74565b61123f565b34801561034057600080fd5b506101cc61034f3660046130c7565b61138f565b34801561036057600080fd5b5061028461036f36600461316d565b611611565b34801561038057600080fd5b5061019261038f3660046131d9565b611811565b3480156103a057600080fd5b506102197f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d457600080fd5b506101cc6103e3366004613295565b6118cc565b3480156103f457600080fd5b50610192610403366004612da3565b611bbd565b34801561041457600080fd5b50610192610423366004613308565b611cc4565b34801561043457600080fd5b506104486104433660046133b2565b611d9d565b60405190151581526020016101a3565b6101cc6104663660046133cf565b611e32565b34801561047757600080fd5b506101cc610486366004613295565b61218e565b34801561049757600080fd5b506102197f000000000000000000000000000000000000000000000000000000000000000081565b60008082428110156104ec5760405162461bcd60e51b81526004016104e390613425565b60405180910390fd5b60006104f98c8c8c6109f3565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561054f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105739190613454565b61057c57600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec9190613471565b9150915060006105fc8f8f610afb565b509050806001600160a01b03168f6001600160a01b03161461061f578183610622565b82825b90975095508a8710156106475760405162461bcd60e51b81526004016104e390613495565b898610156106675760405162461bcd60e51b81526004016104e3906134d8565b50505050509850989650505050505050565b6060814281101561069c5760405162461bcd60e51b81526004016104e390613425565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106b357905050905087816000815181106106f6576106f661351b565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061072e5761072e61351b565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107665761076661351b565b60209081029190910101519015156040909101526107848a8261138f565b92508883600185516107969190613547565b815181106107a6576107a661351b565b602002602001015110156107cc5760405162461bcd60e51b81526004016104e39061355e565b610874816000815181106107e2576107e261351b565b60200260200101516000015133610854846000815181106108055761080561351b565b602002602001015160000151856000815181106108245761082461351b565b602002602001015160200151866000815181106108435761084361351b565b6020026020010151604001516109f3565b866000815181106108675761086761351b565b60200260200101516122b3565b61087f8382876123ab565b5050979650505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b81526004016108e1939291906135a6565b602060405180830381865afa1580156108fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092291906135ca565b90506001600160a01b03811661093f5760008092509250506109ea565b60008061094d898989611175565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b591906135e7565b9050806109c28489613600565b6109cc919061361f565b9550806109d98389613600565b6109e3919061361f565b9450505050505b94509492505050565b6000806000610a028686610afb565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610ad9939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b03161415610b6a5760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016104e3565b826001600160a01b0316846001600160a01b031610610b8a578284610b8d565b83835b90925090506001600160a01b038216610be85760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016104e3565b9250929050565b60008060008342811015610c155760405162461bcd60e51b81526004016104e390613425565b610c448b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d612600565b90945092506000610c768c7f00000000000000000000000000000000000000000000000000000000000000008d6109f3565b9050610c848c3383886122b3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b815260040160206040518083038185885af1158015610ce4573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d0991906135e7565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190613454565b610da957610da9612b43565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1591906135e7565b925083341115610e3257610e3233610e2d8634613547565b61281e565b50509750975097945050505050565b60008060008342811015610e675760405162461bcd60e51b81526004016104e390613425565b610e768d8d8d8d8d8d8d612600565b90945092506000610e888e8e8e6109f3565b9050610e968e3383886122b3565b610ea28d3383876122b3565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e91906135e7565b9250505099509950999650505050505050565b6000806000610f32858560016109f3565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc69190613454565b1561103f576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c91906135e7565b91505b61104b878760006109f3565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156110b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110da9190613454565b15611153576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115091906135e7565b90505b80821161116257806000611166565b8160015b94509450505050935093915050565b60008060006111848686610afb565b5090506000806111958888886109f3565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190613658565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b03161461122d578082611230565b81815b90999098509650505050505050565b606081428110156112625760405162461bcd60e51b81526004016104e390613425565b611324868660008181106112785761127861351b565b61128e92602060609092020190810191506133b2565b33611311898960008181106112a5576112a561351b565b6112bb92602060609092020190810191506133b2565b8a8a60008181106112ce576112ce61351b565b90506060020160200160208101906112e691906133b2565b8b8b60008181106112f9576112f961351b565b9050606002016040016020810190610214919061369d565b8a6000815181106108675761086761351b565b611381878787808060200260200160405190810160405280939291908181526020016000905b8282101561137657611367606083028601368190038101906136ba565b8152602001906001019061134a565b5050505050866123ab565b8691505b5095945050505050565b60606001825110156113b35760405162461bcd60e51b81526004016104e3906136d6565b81516113c090600161370d565b67ffffffffffffffff8111156113d8576113d8612ec4565b604051908082528060200260200182016040528015611401578160200160208202803683370190505b50905082816000815181106114185761141861351b565b60200260200101818152505060005b825181101561160a5760006114838483815181106114475761144761351b565b6020026020010151600001518584815181106114655761146561351b565b6020026020010151602001518685815181106108435761084361351b565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190613454565b156115f757806001600160a01b031663f140a35a8484815181106115385761153861351b565b60200260200101518685815181106115525761155261351b565b6020026020010151600001516040518363ffffffff1660e01b815260040161158d9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce91906135e7565b836115da84600161370d565b815181106115ea576115ea61351b565b6020026020010181815250505b508061160281613725565b915050611427565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611667939291906135a6565b602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a891906135ca565b9050600080806001600160a01b0384161561173257836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171f91906135e7565b905061172c8c8c8c611175565b90935091505b8215801561173e575081155b1561176f578896508795506103e861175e611759888a613600565b6128ec565b6117689190613547565b9450611802565b600061177c8a858561295c565b90508881116117c4578997509550856117bd84611799848b613600565b6117a3919061361f565b846117ae858b613600565b6117b8919061361f565b612a3c565b9550611800565b60006117d18a858761295c565b98508997508890506117fc856117e78584613600565b6117f1919061361f565b856117ae868c613600565b9650505b505b50505050955095509592505050565b60008060006118218f8f8f6109f3565b9050600087611830578c611834565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061186f903390309086908f908e908e908e90600401613740565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050506118b28f8f8f8f8f8f8f8f6104bf565b8093508194505050509c509c9a5050505050505050505050565b606081428110156118ef5760405162461bcd60e51b81526004016104e390613425565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686611926600182613547565b8181106119355761193561351b565b905060600201602001602081019061194d91906133b2565b6001600160a01b0316146119735760405162461bcd60e51b81526004016104e3906136d6565b6119cf888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576119b6606083028601368190038101906136ba565b81526020019060010190611999565b505050505061138f565b91508682600184516119e19190613547565b815181106119f1576119f161351b565b60200260200101511015611a175760405162461bcd60e51b81526004016104e39061355e565b611a6d86866000818110611a2d57611a2d61351b565b611a4392602060609092020190810191506133b2565b33611a5a898960008181106112a5576112a561351b565b856000815181106108675761086761351b565b611aca828787808060200260200160405190810160405280939291908181526020016000905b82821015611abf57611ab0606083028601368190038101906136ba565b81526020019060010190611a93565b5050505050306123ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551611b089190613547565b81518110611b1857611b1861351b565b60200260200101516040518263ffffffff1660e01b8152600401611b3e91815260200190565b6020604051808303816000875af1158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906135e7565b50611bb2848360018551611b959190613547565b81518110611ba557611ba561351b565b602002602001015161281e565b509695505050505050565b6000808242811015611be15760405162461bcd60e51b81526004016104e390613425565b611c118a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6104bf565b9093509150611c218a8685612a54565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024016020604051808303816000875af1158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac91906135e7565b50611cb7858361281e565b5097509795505050505050565b6000806000611cf48e7f00000000000000000000000000000000000000000000000000000000000000008f6109f3565b9050600087611d03578c611d07565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d42903390309086908f908e908e908e90600401613740565b600060405180830381600087803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b50505050611d838f8f8f8f8f8f8f611bbd565b809450819550505050509b509b9950505050505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2c9190613454565b92915050565b60608142811015611e555760405162461bcd60e51b81526004016104e390613425565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611e9257611e9261351b565b611ea892602060609092020190810191506133b2565b6001600160a01b031614611ece5760405162461bcd60e51b81526004016104e3906136d6565b611f20348787808060200260200160405190810160405280939291908181526020016000905b828210156119c557611f11606083028601368190038101906136ba565b81526020019060010190611ef4565b9150868260018451611f329190613547565b81518110611f4257611f4261351b565b60200260200101511015611f685760405162461bcd60e51b81526004016104e39061355e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611faa57611faa61351b565b60200260200101516040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fe2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061200791906135e7565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120a18888600081811061204d5761204d61351b565b61206392602060609092020190810191506133b2565b898960008181106120765761207661351b565b905060600201602001602081019061208e91906133b2565b8a8a60008181106112f9576112f961351b565b846000815181106120b4576120b461351b565b60200260200101516040518363ffffffff1660e01b81526004016120ed9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561210c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121309190613454565b61213c5761213c612b43565b611385828787808060200260200160405190810160405280939291908181526020016000905b828210156113765761217f606083028601368190038101906136ba565b81526020019060010190612162565b606081428110156121b15760405162461bcd60e51b81526004016104e390613425565b612203888787808060200260200160405190810160405280939291908181526020016000905b828210156119c5576121f4606083028601368190038101906136ba565b815260200190600101906121d7565b91508682600184516122159190613547565b815181106122255761222561351b565b6020026020010151101561224b5760405162461bcd60e51b81526004016104e39061355e565b61226186866000818110611a2d57611a2d61351b565b611bb2828787808060200260200160405190810160405280939291908181526020016000905b82821015611376576122a4606083028601368190038101906136ba565b81526020019060010190612287565b6000846001600160a01b03163b116122ca57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161232e91906137ad565b6000604051808303816000865af19150503d806000811461236b576040519150601f19603f3d011682016040523d82523d6000602084013e612370565b606091505b509150915081801561239a57508051158061239a57508080602001905181019061239a9190613454565b6123a357600080fd5b505050505050565b60005b82518110156125fa5760006123fd8483815181106123ce576123ce61351b565b6020026020010151600001518584815181106123ec576123ec61351b565b602002602001015160200151610afb565b50905060008561240e84600161370d565b8151811061241e5761241e61351b565b60200260200101519050600080836001600160a01b03168786815181106124475761244761351b565b6020026020010151600001516001600160a01b0316146124695782600061246d565b6000835b915091506000600188516124819190613547565b861061248d5786612500565b6125008861249c88600161370d565b815181106124ac576124ac61351b565b602002602001015160000151898860016124c6919061370d565b815181106124d6576124d661351b565b6020026020010151602001518a8960016124f0919061370d565b815181106108435761084361351b565b90506125538887815181106125175761251761351b565b6020026020010151600001518988815181106125355761253561351b565b6020026020010151602001518a89815181106108435761084361351b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612590576020820181803683370190505b506040518563ffffffff1660e01b81526004016125b094939291906137c9565b600060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b50505050505050505080806125f290613725565b9150506123ae565b50505050565b6000808386101561261057600080fd5b8285101561261d57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090612670908d908d908d906004016135a6565b602060405180830381865afa15801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906135ca565b90506001600160a01b038116612757576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490612711908d908d908d906004016135a6565b6020604051808303816000875af1158015612730573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275491906135ca565b90505b6000806127658c8c8c611175565b91509150816000148015612777575080155b156127875788945087935061280f565b60006127948a848461295c565b90508881116127c857868110156127bd5760405162461bcd60e51b81526004016104e3906134d8565b89955093508361280d565b60006127d58a848661295c565b90508a8111156127e7576127e7612b43565b888110156128075760405162461bcd60e51b81526004016104e390613495565b95508894505b505b50505097509795505050505050565b604080516000808252602082019092526001600160a01b03841690839060405161284891906137ad565b60006040518083038185875af1925050503d8060008114612885576040519150601f19603f3d011682016040523d82523d6000602084013e61288a565b606091505b50509050806128e75760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104e3565b505050565b6000600382111561294d575080600061290660028361361f565b61291190600161370d565b90505b818110156129475790508060028161292c818661361f565b612936919061370d565b612940919061361f565b9050612914565b50919050565b8115612957575060015b919050565b60008084116129b75760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016104e3565b6000831180156129c75750600082115b612a1f5760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016104e3565b82612a2a8386613600565b612a34919061361f565b949350505050565b6000818310612a4b5781612a4d565b825b9392505050565b6000836001600160a01b03163b11612a6b57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612ac791906137ad565b6000604051808303816000865af19150503d8060008114612b04576040519150601f19603f3d011682016040523d82523d6000602084013e612b09565b606091505b5091509150818015612b33575080511580612b33575080806020019051810190612b339190613454565b612b3c57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612b6e57600080fd5b50565b803561295781612b59565b8015158114612b6e57600080fd5b600080600080600080600080610100898b031215612ba757600080fd5b8835612bb281612b59565b97506020890135612bc281612b59565b96506040890135612bd281612b7c565b9550606089013594506080890135935060a0890135925060c0890135612bf781612b59565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612c2a57600080fd5b87359650602088013595506040880135612c4381612b59565b94506060880135612c5381612b59565b93506080880135612c6381612b7c565b925060a0880135612c7381612b59565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612cc257835183529284019291840191600101612ca6565b50909695505050505050565b60008060008060808587031215612ce457600080fd5b8435612cef81612b59565b93506020850135612cff81612b59565b92506040850135612d0f81612b7c565b9396929550929360600135925050565b600080600060608486031215612d3457600080fd5b8335612d3f81612b59565b92506020840135612d4f81612b59565b91506040840135612d5f81612b7c565b809150509250925092565b60008060408385031215612d7d57600080fd5b8235612d8881612b59565b91506020830135612d9881612b59565b809150509250929050565b600080600080600080600060e0888a031215612dbe57600080fd5b8735612dc981612b59565b96506020880135612dd981612b7c565b955060408801359450606088013593506080880135925060a0880135612c7381612b59565b60008060008060008060008060006101208a8c031215612e1d57600080fd5b8935612e2881612b59565b985060208a0135612e3881612b59565b975060408a0135612e4881612b7c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612e7481612b59565b809250506101008a013590509295985092959850929598565b600080600060608486031215612ea257600080fd5b833592506020840135612eb481612b59565b91506040840135612d5f81612b59565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612f0357612f03612ec4565b604052919050565b600067ffffffffffffffff821115612f2557612f25612ec4565b5060051b60200190565b60008083601f840112612f4157600080fd5b50813567ffffffffffffffff811115612f5957600080fd5b602083019150836020606083028501011115610be857600080fd5b600080600080600060808688031215612f8c57600080fd5b853567ffffffffffffffff80821115612fa457600080fd5b818801915088601f830112612fb857600080fd5b81356020612fcd612fc883612f0b565b612eda565b82815260059290921b8401810191818101908c841115612fec57600080fd5b948201945b8386101561300a57853582529482019490820190612ff1565b9950508901359250508082111561302057600080fd5b5061302d88828901612f2f565b9095509350613040905060408701612b71565b949793965091946060013592915050565b60006060828403121561306357600080fd5b6040516060810181811067ffffffffffffffff8211171561308657613086612ec4565b604052905080823561309781612b59565b815260208301356130a781612b59565b602082015260408301356130ba81612b7c565b6040919091015292915050565b600080604083850312156130da57600080fd5b8235915060208084013567ffffffffffffffff8111156130f957600080fd5b8401601f8101861361310a57600080fd5b8035613118612fc882612f0b565b8181526060918202830184019184820191908984111561313757600080fd5b938501935b8385101561315d5761314e8a86613051565b8352938401939185019161313c565b5080955050505050509250929050565b600080600080600060a0868803121561318557600080fd5b853561319081612b59565b945060208601356131a081612b59565b935060408601356131b081612b7c565b94979396509394606081013594506080013592915050565b803560ff8116811461295757600080fd5b6000806000806000806000806000806000806101808d8f0312156131fc57600080fd5b8c3561320781612b59565b9b5060208d013561321781612b59565b9a5060408d013561322781612b7c565b995060608d0135985060808d0135975060a08d0135965060c08d013561324c81612b59565b955060e08d013594506101008d013561326481612b7c565b93506132736101208e016131c8565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060a087890312156132ae57600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156132d357600080fd5b6132df89828a01612f2f565b90955093505060608701356132f381612b59565b80925050608087013590509295509295509295565b60008060008060008060008060008060006101608c8e03121561332a57600080fd5b8b3561333581612b59565b9a5060208c013561334581612b7c565b995060408c0135985060608c0135975060808c0135965060a08c013561336a81612b59565b955060c08c0135945060e08c013561338181612b7c565b93506133906101008d016131c8565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000602082840312156133c457600080fd5b8135612a4d81612b59565b6000806000806000608086880312156133e757600080fd5b85359450602086013567ffffffffffffffff81111561340557600080fd5b61341188828901612f2f565b909550935050604086013561304081612b59565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561346657600080fd5b8151612a4d81612b7c565b6000806040838503121561348457600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561355957613559613531565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156135dc57600080fd5b8151612a4d81612b59565b6000602082840312156135f957600080fd5b5051919050565b600081600019048311821515161561361a5761361a613531565b500290565b60008261363c57634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b038116811461295757600080fd5b60008060006060848603121561366d57600080fd5b61367684613641565b925061368460208501613641565b9150604084015163ffffffff81168114612d5f57600080fd5b6000602082840312156136af57600080fd5b8135612a4d81612b7c565b6000606082840312156136cc57600080fd5b612a4d8383613051565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b6000821982111561372057613720613531565b500190565b600060001982141561373957613739613531565b5060010190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60005b8381101561379c578181015183820152602001613784565b838111156125fa5750506000910152565b600082516137bf818460208701613781565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526138028160a0850160208701613781565b601f01601f19169190910160a0019594505050505056fea2646970667358221220e6efa68269e8b49fe415e3d43f111437355d5066d7adbf8137894a015eaa750f64736f6c634300080b00330000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2800000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc2800000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x3faab499b519fdc5819e3d7ed0c26111904cbc28
Arg [1] : _wftm (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc28
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

2319:17320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2975:10;-1:-1:-1;;;;;2997:4:0;2975:27;;2968:35;;;;:::i;:::-;2319:17320;;;;;11823:832;;;;;;;;;;-1:-1:-1;11823:832:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;11823:832:0;;;;;;;;15540:786;;;;;;;;;;-1:-1:-1;15540:786:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7836:753::-;;;;;;;;;;-1:-1:-1;7836:753:0;;;;;:::i;:::-;;:::i;3505:415::-;;;;;;;;;;-1:-1:-1;3505:415:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4546:32:1;;;4528:51;;4516:2;4501:18;3505:415:0;4382:203:1;3074:339:0;;;;;;;;;;-1:-1:-1;3074:339:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5213:15:1;;;5195:34;;5265:15;;;;5260:2;5245:18;;5238:43;5130:18;3074:339:0;4983:304:1;10825:955:0;;;;;;:::i;:::-;;:::i;:::-;;;;6298:25:1;;;6354:2;6339:18;;6332:34;;;;6382:18;;;6375:34;6286:2;6271:18;10825:955:0;6096:319:1;10115:702:0;;;;;;;;;;-1:-1:-1;10115:702:0;;;;;:::i;:::-;;:::i;4873:680::-;;;;;;;;;;-1:-1:-1;4873:680:0;;;;;:::i;:::-;;:::i;:::-;;;;8064:25:1;;;8132:14;;8125:22;8120:2;8105:18;;8098:50;8037:18;4873:680:0;7896:258:1;4410:381:0;;;;;;;;;;-1:-1:-1;4410:381:0;;;;;:::i;:::-;;:::i;18332:404::-;;;;;;;;;;-1:-1:-1;18332:404:0;;;;;:::i;:::-;;:::i;5635:573::-;;;;;;;;;;-1:-1:-1;5635:573:0;;;;;:::i;:::-;;:::i;6345:1483::-;;;;;;;;;;-1:-1:-1;6345:1483:0;;;;;:::i;:::-;;:::i;13344:707::-;;;;;;;;;;-1:-1:-1;13344:707:0;;;;;:::i;:::-;;:::i;2447:32::-;;;;;;;;;;;;;;;17557:767;;;;;;;;;;-1:-1:-1;17557:767:0;;;;;:::i;:::-;;:::i;12663:673::-;;;;;;;;;;-1:-1:-1;12663:673:0;;;;;:::i;:::-;;:::i;14059:676::-;;;;;;;;;;-1:-1:-1;14059:676:0;;;;;:::i;:::-;;:::i;6216:121::-;;;;;;;;;;-1:-1:-1;6216:121:0;;;;;:::i;:::-;;:::i;:::-;;;16861:14:1;;16854:22;16836:41;;16824:2;16809:18;6216:121:0;16696:187:1;16925:624:0;;;;;;:::i;:::-;;:::i;16334:583::-;;;;;;;;;;-1:-1:-1;16334:583:0;;;;;:::i;:::-;;:::i;2486:27::-;;;;;;;;;;;;;;;11823:832;12082:12;12096;12063:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;;;;;;;;;12121:12:::1;12136:31;12144:6;12152;12160;12136:7;:31::i;:::-;12186:59;::::0;-1:-1:-1;;;12186:59:0;;12217:10:::1;12186:59;::::0;::::1;18451:34:1::0;-1:-1:-1;;;;;12186:30:0;::::1;18501:18:1::0;;;18494:43;;;18553:18;;;18546:34;;;12121:46:0;;-1:-1:-1;12186:30:0::1;::::0;18386:18:1;;12186:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12178:68;;;::::0;::::1;;12314:26;::::0;-1:-1:-1;;;12314:26:0;;-1:-1:-1;;;;;4546:32:1;;;12314:26:0::1;::::0;::::1;4528:51:1::0;12284:12:0::1;::::0;;;12314:22;::::1;::::0;::::1;::::0;4501:18:1;;12314:26:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12283:57;;;;12352:14;12371:26;12382:6;12390;12371:10;:26::i;:::-;12351:46;;;12439:6;-1:-1:-1::0;;;;;12429:16:0::1;:6;-1:-1:-1::0;;;;;12429:16:0::1;;:58;;12470:7;12479;12429:58;;;12449:7;12458;12429:58;12408:79:::0;;-1:-1:-1;12408:79:0;-1:-1:-1;12506:21:0;;::::1;;12498:69;;;;-1:-1:-1::0;;;12498:69:0::1;;;;;;;:::i;:::-;12597:10;12586:7;:21;;12578:69;;;;-1:-1:-1::0;;;12578:69:0::1;;;;;;;:::i;:::-;12110:545;;;;11823:832:::0;;;;;;;;;;;;:::o;15540:786::-;15795:21;15776:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;15853:14:::1;::::0;;15865:1:::1;15853:14:::0;;;;;::::1;::::0;;;15829:21:::1;::::0;15853:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;15853:14:0;;-1:-1:-1;;15853:14:0;;;;::::1;::::0;::::1;;;;;15829:38;;15895:9;15878:6;15885:1;15878:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;15878:26:0::1;;;-1:-1:-1::0;;;;;15878:26:0::1;;;::::0;::::1;15930:7;15915:6;15922:1;15915:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;15915:22:0::1;;;-1:-1:-1::0;;;;;15915:22:0::1;;;::::0;::::1;15967:6;15948;15955:1;15948:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;15994:31:::1;16008:8:::0;16018:6;15994:13:::1;:31::i;:::-;15984:41;;16075:12;16044:7;16069:1;16052:7;:14;:18;;;;:::i;:::-;16044:27;;;;;;;;:::i;:::-;;;;;;;:43;;16036:96;;;;-1:-1:-1::0;;;16036:96:0::1;;;;;;;:::i;:::-;16143:138;16175:6;16182:1;16175:9;;;;;;;;:::i;:::-;;;;;;;:14;;;16191:10;16203:55;16211:6;16218:1;16211:9;;;;;;;;:::i;:::-;;;;;;;:14;;;16227:6;16234:1;16227:9;;;;;;;;:::i;:::-;;;;;;;:12;;;16241:6;16248:1;16241:9;;;;;;;;:::i;:::-;;;;;;;:16;;;16203:7;:55::i;:::-;16260:7;16268:1;16260:10;;;;;;;;:::i;:::-;;;;;;;16143:17;:138::i;:::-;16292:26;16298:7;16307:6;16315:2;16292:5;:26::i;:::-;15818:508;15540:786:::0;;;;;;;;;;:::o;7836:753::-;7993:12;8007;8084:13;8115:7;-1:-1:-1;;;;;8100:31:0;;8132:6;8140;8148;8100:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8084:71;-1:-1:-1;;;;;;8172:19:0;;8168:64;;8216:1;8218;8208:12;;;;;;;8168:64;8245:13;8260;8277:35;8289:6;8297;8305;8277:11;:35::i;:::-;8244:68;;;;8323:17;8349:5;-1:-1:-1;;;;;8343:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8323:46;-1:-1:-1;8323:46:0;8392:20;8404:8;8392:9;:20;:::i;:::-;:35;;;;:::i;:::-;8382:45;-1:-1:-1;8519:12:0;8496:20;8508:8;8496:9;:20;:::i;:::-;:35;;;;:::i;:::-;8486:45;;8021:568;;;;7836:753;;;;;;;;:::o;3505:415::-;3588:12;3614:14;3630;3648:26;3659:6;3667;3648:10;:26::i;:::-;3811:40;;-1:-1:-1;;22181:2:1;22177:15;;;22173:24;;3811:40:0;;;22161:37:1;22232:15;;;22228:24;22214:12;;;22207:46;22299:14;;22292:22;22287:3;22283:32;22269:12;;;22262:54;3613:61:0;;-1:-1:-1;3613:61:0;-1:-1:-1;3779:7:0;;22332:12:1;;3811:40:0;;;;;;;;;;;;3801:51;;;;;;3867:12;3726:182;;;;;;;;;-1:-1:-1;;;;;;22641:26:1;;22704:2;22700:15;;;;-1:-1:-1;;22696:53:1;22692:1;22683:11;;22676:74;22775:2;22766:12;;22759:28;;;;22812:2;22803:12;;22796:28;22849:2;22840:12;;22355:503;3726:182:0;;;;-1:-1:-1;;3726:182:0;;;;;;;;;3716:193;;3726:182;3716:193;;;;;3505:415;-1:-1:-1;;;;;;3505:415:0:o;3074:339::-;3147:14;3163;3208:6;-1:-1:-1;;;;;3198:16:0;:6;-1:-1:-1;;;;;3198:16:0;;;3190:62;;;;-1:-1:-1;;;3190:62:0;;23065:2:1;3190:62:0;;;23047:21:1;23104:2;23084:18;;;23077:30;23143:34;23123:18;;;23116:62;-1:-1:-1;;;23194:18:1;;;23187:31;23235:19;;3190:62:0;22863:397:1;3190:62:0;3291:6;-1:-1:-1;;;;;3282:15:0;:6;-1:-1:-1;;;;;3282:15:0;;:53;;3320:6;3328;3282:53;;;3301:6;3309;3282:53;3263:72;;-1:-1:-1;3263:72:0;-1:-1:-1;;;;;;3354:20:0;;3346:59;;;;-1:-1:-1;;;3346:59:0;;23467:2:1;3346:59:0;;;23449:21:1;23506:2;23486:18;;;23479:30;23545:28;23525:18;;;23518:56;23591:18;;3346:59:0;23265:350:1;3346:59:0;3074:339;;;;;:::o;10825:955::-;11083:16;11101:14;11117;11064:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;11171:206:::1;11199:5;11227:4;11247:6;11268:18;11301:9;11325:14;11354:12;11171:13;:206::i;:::-;11144:233:::0;;-1:-1:-1;11144:233:0;-1:-1:-1;11388:12:0::1;11403:37;11411:5:::0;11426:4:::1;11433:6:::0;11403:7:::1;:37::i;:::-;11388:52;;11451:55;11469:5;11476:10;11488:4;11494:11;11451:17;:55::i;:::-;11517:4;-1:-1:-1::0;;;;;11517:12:0::1;;11537:9;11517:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;11567:30:0::1;::::0;-1:-1:-1;;;11567:30:0;;-1:-1:-1;;;;;23812:32:1;;;11567:30:0::1;::::0;::::1;23794:51:1::0;23861:18;;;23854:34;;;11567:4:0::1;:13;::::0;::::1;::::0;23767:18:1;;11567:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11560:38;;;;:::i;:::-;11621:26;::::0;-1:-1:-1;;;11621:26:0;;-1:-1:-1;;;;;4546:32:1;;;11621:26:0::1;::::0;::::1;4528:51:1::0;11621:22:0;::::1;::::0;::::1;::::0;4501:18:1;;11621:26:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11609:38;;11710:9;11698;:21;11694:78;;;11721:51;11738:10;11750:21;11762:9:::0;11750::::1;:21;:::i;:::-;11721:16;:51::i;:::-;11133:647;10825:955:::0;;;;;;;;;;;;:::o;10115:702::-;10408:12;10422;10436:14;10389:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;10484:93:::1;10498:6;10506;10514;10522:14;10538;10554:10;10566;10484:13;:93::i;:::-;10463:114:::0;;-1:-1:-1;10463:114:0;-1:-1:-1;10588:12:0::1;10603:31;10611:6:::0;10619;10627;10603:7:::1;:31::i;:::-;10588:46;;10645:52;10663:6;10671:10;10683:4;10689:7;10645:17;:52::i;:::-;10708;10726:6;10734:10;10746:4;10752:7;10708:17;:52::i;:::-;10783:26;::::0;-1:-1:-1;;;10783:26:0;;-1:-1:-1;;;;;4546:32:1;;;10783:26:0::1;::::0;::::1;4528:51:1::0;10783:22:0;::::1;::::0;::::1;::::0;4501:18:1;;10783:26:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10771:38;;10452:365;10115:702:::0;;;;;;;;;;;;;;:::o;4873:680::-;4968:11;4981;5005:12;5020:32;5028:7;5037:8;5047:4;5020:7;:32::i;:::-;5125:36;;-1:-1:-1;;;5125:36:0;;-1:-1:-1;;;;;4546:32:1;;;5125:36:0;;;4528:51:1;4546:32;;-1:-1:-1;;;;;5140:7:0;5125:30;;;;;;4501:18:1;;5125:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5121:133;;;5193:49;;-1:-1:-1;;;5193:49:0;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;;;24114:18;;;24107:60;5193:30:0;;;;;24046:18:1;;5193:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5178:64;;5121:133;5271:33;5279:7;5288:8;5298:5;5271:7;:33::i;:::-;5319:36;;-1:-1:-1;;;5319:36:0;;-1:-1:-1;;;;;4546:32:1;;;5319:36:0;;;4528:51:1;5264:40:0;;-1:-1:-1;5334:7:0;5319:30;;;;;;4501:18:1;;5319:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5315:135;;;5389:49;;-1:-1:-1;;;5389:49:0;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;;;24114:18;;;24107:60;5389:30:0;;;;;24046:18:1;;5389:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5372:66;;5315:135;5482:14;5467:12;:29;:78;;5523:14;5539:5;5467:78;;;5500:12;5514:4;5467:78;5460:85;;;;;;;4873:680;;;;;;:::o;4410:381::-;4497:13;4512;4539:14;4558:26;4569:6;4577;4558:10;:26::i;:::-;4538:46;;;4596:13;4611;4641:31;4649:6;4657;4665;4641:7;:31::i;:::-;-1:-1:-1;;;;;4629:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4595:92;-1:-1:-1;;;;;4595:92:0;;;-1:-1:-1;;;;;4595:92:0;;;4731:6;-1:-1:-1;;;;;4721:16:0;:6;-1:-1:-1;;;;;4721:16:0;;:62;;4764:8;4774;4721:62;;;4741:8;4751;4721:62;4698:85;;;;-1:-1:-1;4410:381:0;-1:-1:-1;;;;;;;4410:381:0:o;18332:404::-;18526:13;18507:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;18552:114:::1;18570:6;;18577:1;18570:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18570:14:0::1;:::i;:::-;18586:10;18598:55;18606:6;;18613:1;18606:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18606:14:0::1;:::i;:::-;18622:6;;18629:1;18622:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;18636:6;;18643:1;18636:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;18598:55::-;18655:7;18663:1;18655:10;;;;;;;;:::i;18552:114::-;18677:26;18683:7;18692:6;;18677:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;18700:2;18677:5;:26::i;:::-;18721:7;18714:14;;2728:1;18332:404:::0;;;;;;;;:::o;5635:573::-;5717:21;5776:1;5759:6;:13;:18;;5751:57;;;;-1:-1:-1;;;5751:57:0;;;;;;;:::i;:::-;5840:13;;:15;;5854:1;5840:15;:::i;:::-;5829:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5829:27:0;;5819:37;;5880:8;5867:7;5875:1;5867:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;5904:6;5899:302;5920:6;:13;5916:1;:17;5899:302;;;5955:12;5970:55;5978:6;5985:1;5978:9;;;;;;;;:::i;:::-;;;;;;;:14;;;5994:6;6001:1;5994:9;;;;;;;;:::i;:::-;;;;;;;:12;;;6008:6;6015:1;6008:9;;;;;;;;:::i;5970:55::-;6044:36;;-1:-1:-1;;;6044:36:0;;-1:-1:-1;;;;;4546:32:1;;;6044:36:0;;;4528:51:1;5955:70:0;;-1:-1:-1;6059:7:0;6044:30;;;;;;4501:18:1;;6044:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6040:150;;;6128:4;-1:-1:-1;;;;;6116:30:0;;6147:7;6155:1;6147:10;;;;;;;;:::i;:::-;;;;;;;6159:6;6166:1;6159:9;;;;;;;;:::i;:::-;;;;;;;:14;;;6116:58;;;;;;;;;;;;;;;24073:25:1;;;-1:-1:-1;;;;;24134:32:1;24129:2;24114:18;;24107:60;24061:2;24046:18;;23899:274;6116:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6101:7;6109:3;:1;6111;6109:3;:::i;:::-;6101:12;;;;;;;;:::i;:::-;;;;;;:73;;;;;6040:150;-1:-1:-1;5935:3:0;;;;:::i;:::-;;;;5899:302;;;;5635:573;;;;:::o;6345:1483::-;6534:12;6548;6562:14;6641:13;6672:7;-1:-1:-1;;;;;6657:31:0;;6689:6;6697;6705;6657:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6641:71;-1:-1:-1;6724:13:0;;;-1:-1:-1;;;;;6808:19:0;;;6804:166;;6865:5;-1:-1:-1;;;;;6859:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6844:41;;6923:35;6935:6;6943;6951;6923:11;:35::i;:::-;6900:58;;-1:-1:-1;6900:58:0;-1:-1:-1;6804:166:0;6984:13;;:30;;;;-1:-1:-1;7001:13:0;;6984:30;6980:841;;;7053:14;;-1:-1:-1;7069:14:0;;-1:-1:-1;2563:5:0;7111:28;7121:17;7069:14;7053;7121:17;:::i;:::-;7111:9;:28::i;:::-;:48;;;;:::i;:::-;7099:60;;6980:841;;;7194:19;7216:50;7231:14;7247:8;7257;7216:14;:50::i;:::-;7194:72;;7303:14;7285;:32;7281:529;;7360:14;;-1:-1:-1;7376:14:0;-1:-1:-1;7376:14:0;7422:78;7456:8;7431:22;7441:12;7360:14;7431:22;:::i;:::-;:33;;;;:::i;:::-;7491:8;7466:22;7476:12;7466:7;:22;:::i;:::-;:33;;;;:::i;:::-;7422:8;:78::i;:::-;7410:90;;7281:529;;;7541:19;7563:50;7578:14;7594:8;7604;7563:14;:50::i;:::-;7541:72;-1:-1:-1;7670:14:0;;-1:-1:-1;7541:72:0;;-1:-1:-1;7716:78:0;7750:8;7725:22;7735:12;7541:72;7725:22;:::i;:::-;:33;;;;:::i;:::-;7785:8;7760:22;7770:12;7760:7;:22;:::i;7716:78::-;7704:90;;7522:288;7281:529;7177:644;6980:841;6578:1250;;;;6345:1483;;;;;;;;;:::o;13344:707::-;13655:12;13669;13694;13709:31;13717:6;13725;13733;13709:7;:31::i;:::-;13694:46;;13766:10;13779;:39;;13809:9;13779:39;;;-1:-1:-1;;13779:39:0;13833:77;;-1:-1:-1;;;13833:77:0;;13766:52;;-1:-1:-1;;;;;;13833:24:0;;;;;:77;;13858:10;;13878:4;;13766:52;;13892:8;;13902:1;;13905;;13908;;13833:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13751:171;13955:88;13971:6;13979;13987;13995:9;14006:10;14018;14030:2;14034:8;13955:15;:88::i;:::-;13934:109;;;;;;;;13683:368;13344:707;;;;;;;;;;;;;;;:::o;17557:767::-;17724:21;17700:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17811:4:0::1;17771:45;:6:::0;;17778:17:::1;17794:1;17771:6:::0;17778:17:::1;:::i;:::-;17771:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17771:45:0::1;;17763:84;;;;-1:-1:-1::0;;;17763:84:0::1;;;;;;;:::i;:::-;17868:31;17882:8;17892:6;;17868:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;17858:41;;17949:12;17918:7;17943:1;17926:7;:14;:18;;;;:::i;:::-;17918:27;;;;;;;;:::i;:::-;;;;;;;:43;;17910:96;;;;-1:-1:-1::0;;;17910:96:0::1;;;;;;;:::i;:::-;18017:138;18049:6;;18056:1;18049:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18049:14:0::1;:::i;:::-;18065:10;18077:55;18085:6;;18092:1;18085:9;;;;;;;:::i;18077:55::-;18134:7;18142:1;18134:10;;;;;;;;:::i;18017:138::-;18166:37;18172:7;18181:6;;18166:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;18197:4;18166:5;:37::i;:::-;18214:4;-1:-1:-1::0;;;;;18214:13:0::1;;18228:7;18253:1;18236:7;:14;:18;;;;:::i;:::-;18228:27;;;;;;;;:::i;:::-;;;;;;;18214:42;;;;;;;;;;;;;26748:25:1::0;;26736:2;26721:18;;26602:177;18214:42:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18267:49;18284:2;18288:7;18313:1;18296:7;:14;:18;;;;:::i;:::-;18288:27;;;;;;;;:::i;:::-;;;;;;;18267:16;:49::i;:::-;17557:767:::0;;;;;;;;;:::o;12663:673::-;12905:16;12923:14;12886:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;12977:226:::1;13007:5;13035:4;13055:6;13076:9;13100:14;13129:12;13164:4;13184:8;12977:15;:226::i;:::-;12950:253:::0;;-1:-1:-1;12950:253:0;-1:-1:-1;13214:37:0::1;13228:5:::0;13235:2;12950:253;13214:13:::1;:37::i;:::-;13262:24;::::0;-1:-1:-1;;;13262:24:0;;::::1;::::0;::::1;26748:25:1::0;;;13262:4:0::1;-1:-1:-1::0;;;;;13262:13:0::1;::::0;::::1;::::0;26721:18:1;;13262:24:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13297:31;13314:2;13318:9;13297:16;:31::i;:::-;12663:673:::0;;;;;;;;;;;:::o;14059:676::-;14353:16;14371:14;14398:12;14413:37;14421:5;14436:4;14443:6;14413:7;:37::i;:::-;14398:52;;14461:10;14474;:39;;14504:9;14474:39;;;-1:-1:-1;;14474:39:0;14524:77;;-1:-1:-1;;;14524:77:0;;14461:52;;-1:-1:-1;;;;;;14524:24:0;;;;;:77;;14549:10;;14569:4;;14461:52;;14583:8;;14593:1;;14596;;14599;;14524:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14639:88;14658:5;14665:6;14673:9;14684:14;14700:12;14714:2;14718:8;14639:18;:88::i;:::-;14612:115;;;;;;;;14387:348;;14059:676;;;;;;;;;;;;;;:::o;6216:121::-;6293:36;;-1:-1:-1;;;6293:36:0;;-1:-1:-1;;;;;4546:32:1;;;6293:36:0;;;4528:51:1;6269:4:0;;6308:7;6293:30;;;;;;4501:18:1;;6293:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6286:43;6216:121;-1:-1:-1;;6216:121:0:o;16925:624::-;17090:21;17066:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;17163:4:::1;-1:-1:-1::0;;;;;17137:31:0::1;:6;;17144:1;17137:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;17137:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;17137:31:0::1;;17129:70;;;;-1:-1:-1::0;;;17129:70:0::1;;;;;;;:::i;:::-;17220:32;17234:9;17245:6;;17220:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;17210:42;;17302:12;17271:7;17296:1;17279:7;:14;:18;;;;:::i;:::-;17271:27;;;;;;;;:::i;:::-;;;;;;;:43;;17263:96;;;;-1:-1:-1::0;;;17263:96:0::1;;;;;;;:::i;:::-;17370:4;-1:-1:-1::0;;;;;17370:12:0::1;;17390:7;17398:1;17390:10;;;;;;;;:::i;:::-;;;;;;;17370:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17421:4;-1:-1:-1::0;;;;;17421:13:0::1;;17435:55;17443:6;;17450:1;17443:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;17443:14:0::1;:::i;:::-;17459:6;;17466:1;17459:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;17473:6;;17480:1;17473:9;;;;;;;:::i;17435:55::-;17492:7;17500:1;17492:10;;;;;;;;:::i;:::-;;;;;;;17421:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23812:32:1;;;;23794:51;;23876:2;23861:18;;23854:34;23782:2;23767:18;;23620:274;17421:82:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17414:90;;;;:::i;:::-;17515:26;17521:7;17530:6;;17515:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;16334:583:::0;16541:21;16522:8;2676:15;2664:8;:27;;2656:61;;;;-1:-1:-1;;;2656:61:0;;;;;;;:::i;:::-;16585:31:::1;16599:8;16609:6;;16585:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;16575:41;;16666:12;16635:7;16660:1;16643:7;:14;:18;;;;:::i;:::-;16635:27;;;;;;;;:::i;:::-;;;;;;;:43;;16627:96;;;;-1:-1:-1::0;;;16627:96:0::1;;;;;;;:::i;:::-;16734:138;16766:6;;16773:1;16766:9;;;;;;;:::i;16734:138::-;16883:26;16889:7;16898:6;;16883:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;19282:354:::0;19413:1;19393:5;-1:-1:-1;;;;;19393:17:0;;:21;19385:30;;;;;;19482:68;;;-1:-1:-1;;;;;18469:15:1;;;19482:68:0;;;18451:34:1;18521:15;;;18501:18;;;18494:43;18553:18;;;;18546:34;;;19482:68:0;;;;;;;;;;18386:18:1;;;;19482:68:0;;;;;;;-1:-1:-1;;;;;19482:68:0;-1:-1:-1;;;19482:68:0;;;19471:80;;-1:-1:-1;;;;19471:10:0;;;;:80;;19482:68;19471:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19426:125;;;;19570:7;:57;;;;-1:-1:-1;19582:11:0;;:16;;:44;;;19613:4;19602:24;;;;;;;;;;;;:::i;:::-;19562:66;;;;;;19374:262;;19282:354;;;;:::o;14846:686::-;14953:6;14948:577;14969:6;:13;14965:1;:17;14948:577;;;15005:14;15024:40;15035:6;15042:1;15035:9;;;;;;;;:::i;:::-;;;;;;;:14;;;15051:6;15058:1;15051:9;;;;;;;;:::i;:::-;;;;;;;:12;;;15024:10;:40::i;:::-;-1:-1:-1;15004:60:0;-1:-1:-1;15079:14:0;15096:7;15104:5;:1;15108;15104:5;:::i;:::-;15096:14;;;;;;;;:::i;:::-;;;;;;;15079:31;;15126:15;15143;15180:6;-1:-1:-1;;;;;15162:24:0;:6;15169:1;15162:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;15162:24:0;;:70;;15213:9;15229:1;15162:70;;;15195:1;15199:9;15162:70;15125:107;;;;15247:10;15280:1;15264:6;:13;:17;;;;:::i;:::-;15260:1;:21;:91;;15348:3;15260:91;;;15284:61;15292:6;15299:3;:1;15301;15299:3;:::i;:::-;15292:11;;;;;;;;:::i;:::-;;;;;;;:16;;;15310:6;15317:1;15319;15317:3;;;;:::i;:::-;15310:11;;;;;;;;:::i;:::-;;;;;;;:14;;;15326:6;15333:1;15335;15333:3;;;;:::i;:::-;15326:11;;;;;;;;:::i;15284:61::-;15247:104;;15378:55;15386:6;15393:1;15386:9;;;;;;;;:::i;:::-;;;;;;;:14;;;15402:6;15409:1;15402:9;;;;;;;;:::i;:::-;;;;;;;:12;;;15416:6;15423:1;15416:9;;;;;;;;:::i;15378:55::-;-1:-1:-1;;;;;15366:73:0;;15458:10;15470;15482:2;15496:1;15486:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15486:12:0;;15366:147;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14989:536;;;;;14984:3;;;;;:::i;:::-;;;;14948:577;;;;14846:686;;;:::o;8597:1510::-;8829:12;8843;8894:10;8876:14;:28;;8868:37;;;;;;8942:10;8924:14;:28;;8916:37;;;;;;9032:55;;-1:-1:-1;;;9032:55:0;;9016:13;;-1:-1:-1;;;;;9047:7:0;9032:31;;;;:55;;9064:6;;9072;;9080;;9032:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9016:71;-1:-1:-1;;;;;;9102:19:0;;9098:118;;9146:58;;-1:-1:-1;;;9146:58:0;;-1:-1:-1;;;;;9161:7:0;9146:34;;;;:58;;9181:6;;9189;;9197;;9146:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9138:66;;9098:118;9227:13;9242;9259:35;9271:6;9279;9287;9259:11;:35::i;:::-;9226:68;;;;9309:8;9321:1;9309:13;:30;;;;-1:-1:-1;9326:13:0;;9309:30;9305:795;;;9378:14;;-1:-1:-1;9394:14:0;;-1:-1:-1;9305:795:0;;;9442:19;9464:50;9479:14;9495:8;9505;9464:14;:50::i;:::-;9442:72;;9551:14;9533;:32;9529:560;;9612:10;9594:14;:28;;9586:76;;;;-1:-1:-1;;;9586:76:0;;;;;;;:::i;:::-;9703:14;;-1:-1:-1;9719:14:0;-1:-1:-1;9719:14:0;9529:560;;;9775:19;9797:50;9812:14;9828:8;9838;9797:14;:50::i;:::-;9775:72;;9891:14;9873;:32;;9866:40;;;;:::i;:::-;9951:10;9933:14;:28;;9925:76;;;;-1:-1:-1;;;9925:76:0;;;;;;;:::i;:::-;10042:14;-1:-1:-1;10058:14:0;;-1:-1:-1;9529:560:0;9427:673;9305:795;8857:1250;;;8597:1510;;;;;;;;;;:::o;18744:196::-;18853:12;;;18815;18853;;;;;;;;;-1:-1:-1;;;;;18832:7:0;;;18846:5;;18832:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18814:52;;;18885:7;18877:55;;;;-1:-1:-1;;;18877:55:0;;28157:2:1;18877:55:0;;;28139:21:1;28196:2;28176:18;;;28169:30;28235:34;28215:18;;;28208:62;-1:-1:-1;;;28286:18:1;;;28279:33;28329:19;;18877:55:0;27955:399:1;18877:55:0;18803:137;18744:196;;:::o;1802:303::-;1847:6;1874:1;1870;:5;1866:232;;;-1:-1:-1;1896:1:0;1912:6;1921:5;1925:1;1896;1921:5;:::i;:::-;:9;;1929:1;1921:9;:::i;:::-;1912:18;;1945:92;1956:1;1952;:5;1945:92;;;1982:1;-1:-1:-1;1982:1:0;2020;1982;2007:5;1982:1;2007;:5;:::i;:::-;:9;;;;:::i;:::-;2006:15;;;;:::i;:::-;2002:19;;1945:92;;;1877:171;1802:303;;;:::o;1866:232::-;2058:6;;2054:44;;-1:-1:-1;2085:1:0;2054:44;1802:303;;;:::o;4033:319::-;4124:12;4167:1;4157:7;:11;4149:57;;;;-1:-1:-1;;;4149:57:0;;28561:2:1;4149:57:0;;;28543:21:1;28600:2;28580:18;;;28573:30;28639:34;28619:18;;;28612:62;-1:-1:-1;;;28690:18:1;;;28683:31;28731:19;;4149:57:0;28359:397:1;4149:57:0;4236:1;4225:8;:12;:28;;;;;4252:1;4241:8;:12;4225:28;4217:77;;;;-1:-1:-1;;;4217:77:0;;28963:2:1;4217:77:0;;;28945:21:1;29002:2;28982:18;;;28975:30;29041:34;29021:18;;;29014:62;-1:-1:-1;;;29092:18:1;;;29085:34;29136:19;;4217:77:0;28761:400:1;4217:77:0;4336:8;4315:18;4325:8;4315:7;:18;:::i;:::-;:29;;;;:::i;:::-;4305:39;4033:319;-1:-1:-1;;;;4033:319:0:o;1699:97::-;1751:4;1779:1;1775;:5;:13;;1787:1;1775:13;;;1783:1;1775:13;1768:20;1699:97;-1:-1:-1;;;1699:97:0:o;18948:326::-;19061:1;19041:5;-1:-1:-1;;;;;19041:17:0;;:21;19033:30;;;;;;19130:58;;;-1:-1:-1;;;;;23812:32:1;;;19130:58:0;;;23794:51:1;23861:18;;;;23854:34;;;19130:58:0;;;;;;;;;;23767:18:1;;;;19130:58:0;;;;;;;-1:-1:-1;;;;;19130:58:0;-1:-1:-1;;;19130:58:0;;;19119:70;;-1:-1:-1;;;;19119:10:0;;;;:70;;19130:58;19119:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19074:115;;;;19208:7;:57;;;;-1:-1:-1;19220:11:0;;:16;;:44;;;19251:4;19240:24;;;;;;;;;;;;:::i;:::-;19200:66;;;;;;19022:252;;18948:326;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:592::-;3340:6;3348;3356;3364;3417:3;3405:9;3396:7;3392:23;3388:33;3385:53;;;3434:1;3431;3424:12;3385:53;3473:9;3460:23;3492:31;3517:5;3492:31;:::i;:::-;3542:5;-1:-1:-1;3599:2:1;3584:18;;3571:32;3612:33;3571:32;3612:33;:::i;:::-;3664:7;-1:-1:-1;3723:2:1;3708:18;;3695:32;3736:30;3695:32;3736:30;:::i;:::-;3257:592;;;;-1:-1:-1;3785:7:1;;3839:2;3824:18;3811:32;;-1:-1:-1;;3257:592:1:o;3854:523::-;3928:6;3936;3944;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4052:9;4039:23;4071:31;4096:5;4071:31;:::i;:::-;4121:5;-1:-1:-1;4178:2:1;4163:18;;4150:32;4191:33;4150:32;4191:33;:::i;:::-;4243:7;-1:-1:-1;4302:2:1;4287:18;;4274:32;4315:30;4274:32;4315:30;:::i;:::-;4364:7;4354:17;;;3854:523;;;;;:::o;4590:388::-;4658:6;4666;4719:2;4707:9;4698:7;4694:23;4690:32;4687:52;;;4735:1;4732;4725:12;4687:52;4774:9;4761:23;4793:31;4818:5;4793:31;:::i;:::-;4843:5;-1:-1:-1;4900:2:1;4885:18;;4872:32;4913:33;4872:32;4913:33;:::i;:::-;4965:7;4955:17;;;4590:388;;;;;:::o;5292:799::-;5402:6;5410;5418;5426;5434;5442;5450;5503:3;5491:9;5482:7;5478:23;5474:33;5471:53;;;5520:1;5517;5510:12;5471:53;5559:9;5546:23;5578:31;5603:5;5578:31;:::i;:::-;5628:5;-1:-1:-1;5685:2:1;5670:18;;5657:32;5698:30;5657:32;5698:30;:::i;:::-;5747:7;-1:-1:-1;5801:2:1;5786:18;;5773:32;;-1:-1:-1;5852:2:1;5837:18;;5824:32;;-1:-1:-1;5903:3:1;5888:19;;5875:33;;-1:-1:-1;5960:3:1;5945:19;;5932:33;5974;5932;5974;:::i;6420:1010::-;6548:6;6556;6564;6572;6580;6588;6596;6604;6612;6665:3;6653:9;6644:7;6640:23;6636:33;6633:53;;;6682:1;6679;6672:12;6633:53;6721:9;6708:23;6740:31;6765:5;6740:31;:::i;:::-;6790:5;-1:-1:-1;6847:2:1;6832:18;;6819:32;6860:33;6819:32;6860:33;:::i;:::-;6912:7;-1:-1:-1;6971:2:1;6956:18;;6943:32;6984:30;6943:32;6984:30;:::i;:::-;7033:7;-1:-1:-1;7087:2:1;7072:18;;7059:32;;-1:-1:-1;7138:3:1;7123:19;;7110:33;;-1:-1:-1;7190:3:1;7175:19;;7162:33;;-1:-1:-1;7242:3:1;7227:19;;7214:33;;-1:-1:-1;7299:3:1;7284:19;;7271:33;7313;7271;7313;:::i;:::-;7365:7;7355:17;;;7419:3;7408:9;7404:19;7391:33;7381:43;;6420:1010;;;;;;;;;;;:::o;7435:456::-;7512:6;7520;7528;7581:2;7569:9;7560:7;7556:23;7552:32;7549:52;;;7597:1;7594;7587:12;7549:52;7633:9;7620:23;7610:33;;7693:2;7682:9;7678:18;7665:32;7706:31;7731:5;7706:31;:::i;:::-;7756:5;-1:-1:-1;7813:2:1;7798:18;;7785:32;7826:33;7785:32;7826:33;:::i;8159:127::-;8220:10;8215:3;8211:20;8208:1;8201:31;8251:4;8248:1;8241:15;8275:4;8272:1;8265:15;8291:275;8362:2;8356:9;8427:2;8408:13;;-1:-1:-1;;8404:27:1;8392:40;;8462:18;8447:34;;8483:22;;;8444:62;8441:88;;;8509:18;;:::i;:::-;8545:2;8538:22;8291:275;;-1:-1:-1;8291:275:1:o;8571:183::-;8631:4;8664:18;8656:6;8653:30;8650:56;;;8686:18;;:::i;:::-;-1:-1:-1;8731:1:1;8727:14;8743:4;8723:25;;8571:183::o;8759:384::-;8836:8;8846:6;8900:3;8893:4;8885:6;8881:17;8877:27;8867:55;;8918:1;8915;8908:12;8867:55;-1:-1:-1;8941:20:1;;8984:18;8973:30;;8970:50;;;9016:1;9013;9006:12;8970:50;9053:4;9045:6;9041:17;9029:29;;9116:3;9109:4;9101;9093:6;9089:17;9081:6;9077:30;9073:41;9070:50;9067:70;;;9133:1;9130;9123:12;9148:1410;9310:6;9318;9326;9334;9342;9395:3;9383:9;9374:7;9370:23;9366:33;9363:53;;;9412:1;9409;9402:12;9363:53;9452:9;9439:23;9481:18;9522:2;9514:6;9511:14;9508:34;;;9538:1;9535;9528:12;9508:34;9576:6;9565:9;9561:22;9551:32;;9621:7;9614:4;9610:2;9606:13;9602:27;9592:55;;9643:1;9640;9633:12;9592:55;9679:2;9666:16;9701:4;9725:60;9741:43;9781:2;9741:43;:::i;:::-;9725:60;:::i;:::-;9819:15;;;9901:1;9897:10;;;;9889:19;;9885:28;;;9850:12;;;;9925:19;;;9922:39;;;9957:1;9954;9947:12;9922:39;9981:11;;;;10001:142;10017:6;10012:3;10009:15;10001:142;;;10083:17;;10071:30;;10034:12;;;;10121;;;;10001:142;;;10162:5;-1:-1:-1;;10205:18:1;;10192:32;;-1:-1:-1;;10236:16:1;;;10233:36;;;10265:1;10262;10255:12;10233:36;;10304:86;10382:7;10371:8;10360:9;10356:24;10304:86;:::i;:::-;10409:8;;-1:-1:-1;10278:112:1;-1:-1:-1;10463:38:1;;-1:-1:-1;10497:2:1;10482:18;;10463:38;:::i;:::-;9148:1410;;;;-1:-1:-1;9148:1410:1;;10548:2;10533:18;10520:32;;9148:1410;-1:-1:-1;;9148:1410:1:o;10563:752::-;10615:5;10663:4;10651:9;10646:3;10642:19;10638:30;10635:50;;;10681:1;10678;10671:12;10635:50;10714:2;10708:9;10756:4;10748:6;10744:17;10827:6;10815:10;10812:22;10791:18;10779:10;10776:34;10773:62;10770:88;;;10838:18;;:::i;:::-;10874:2;10867:22;10907:6;-1:-1:-1;10907:6:1;10937:23;;10969:33;10937:23;10969:33;:::i;:::-;11011:23;;11086:2;11071:18;;11058:32;11099:33;11058:32;11099:33;:::i;:::-;11160:2;11148:15;;11141:32;11225:2;11210:18;;11197:32;11238:30;11197:32;11238:30;:::i;:::-;11296:2;11284:15;;;;11277:32;10563:752;;-1:-1:-1;;10563:752:1:o;11320:1025::-;11435:6;11443;11496:2;11484:9;11475:7;11471:23;11467:32;11464:52;;;11512:1;11509;11502:12;11464:52;11548:9;11535:23;11525:33;;11577:2;11630;11619:9;11615:18;11602:32;11657:18;11649:6;11646:30;11643:50;;;11689:1;11686;11679:12;11643:50;11712:22;;11765:4;11757:13;;11753:27;-1:-1:-1;11743:55:1;;11794:1;11791;11784:12;11743:55;11830:2;11817:16;11853:60;11869:43;11909:2;11869:43;:::i;11853:60::-;11947:15;;;12009:4;12048:11;;;12040:20;;12036:29;;;11978:12;;;;11935:3;12077:19;;;12074:39;;;12109:1;12106;12099:12;12074:39;12133:11;;;;12153:162;12169:6;12164:3;12161:15;12153:162;;;12235:37;12264:7;12259:3;12235:37;:::i;:::-;12223:50;;12186:12;;;;12293;;;;12153:162;;;12157:3;12334:5;12324:15;;;;;;;11320:1025;;;;;:::o;12350:661::-;12442:6;12450;12458;12466;12474;12527:3;12515:9;12506:7;12502:23;12498:33;12495:53;;;12544:1;12541;12534:12;12495:53;12583:9;12570:23;12602:31;12627:5;12602:31;:::i;:::-;12652:5;-1:-1:-1;12709:2:1;12694:18;;12681:32;12722:33;12681:32;12722:33;:::i;:::-;12774:7;-1:-1:-1;12833:2:1;12818:18;;12805:32;12846:30;12805:32;12846:30;:::i;:::-;12350:661;;;;-1:-1:-1;12895:7:1;;12949:2;12934:18;;12921:32;;-1:-1:-1;13000:3:1;12985:19;12972:33;;12350:661;-1:-1:-1;;12350:661:1:o;13016:156::-;13082:20;;13142:4;13131:16;;13121:27;;13111:55;;13162:1;13159;13152:12;13177:1290;13327:6;13335;13343;13351;13359;13367;13375;13383;13391;13399;13407:7;13416;13470:3;13458:9;13449:7;13445:23;13441:33;13438:53;;;13487:1;13484;13477:12;13438:53;13526:9;13513:23;13545:31;13570:5;13545:31;:::i;:::-;13595:5;-1:-1:-1;13652:2:1;13637:18;;13624:32;13665:33;13624:32;13665:33;:::i;:::-;13717:7;-1:-1:-1;13776:2:1;13761:18;;13748:32;13789:30;13748:32;13789:30;:::i;:::-;13838:7;-1:-1:-1;13892:2:1;13877:18;;13864:32;;-1:-1:-1;13943:3:1;13928:19;;13915:33;;-1:-1:-1;13995:3:1;13980:19;;13967:33;;-1:-1:-1;14052:3:1;14037:19;;14024:33;14066;14024;14066;:::i;:::-;14118:7;-1:-1:-1;14172:3:1;14157:19;;14144:33;;-1:-1:-1;14229:3:1;14214:19;;14201:33;14243:30;14201:33;14243:30;:::i;:::-;14292:7;-1:-1:-1;14318:37:1;14350:3;14335:19;;14318:37;:::i;:::-;14308:47;;14403:3;14392:9;14388:19;14375:33;14364:44;;14456:3;14445:9;14441:19;14428:33;14417:44;;13177:1290;;;;;;;;;;;;;;:::o;14472:816::-;14618:6;14626;14634;14642;14650;14658;14711:3;14699:9;14690:7;14686:23;14682:33;14679:53;;;14728:1;14725;14718:12;14679:53;14764:9;14751:23;14741:33;;14821:2;14810:9;14806:18;14793:32;14783:42;;14876:2;14865:9;14861:18;14848:32;14903:18;14895:6;14892:30;14889:50;;;14935:1;14932;14925:12;14889:50;14974:84;15050:7;15041:6;15030:9;15026:22;14974:84;:::i;:::-;15077:8;;-1:-1:-1;14948:110:1;-1:-1:-1;;15162:2:1;15147:18;;15134:32;15175:31;15134:32;15175:31;:::i;:::-;15225:5;15215:15;;;15277:3;15266:9;15262:19;15249:33;15239:43;;14472:816;;;;;;;;:::o;15293:1146::-;15434:6;15442;15450;15458;15466;15474;15482;15490;15498;15506;15514:7;15568:3;15556:9;15547:7;15543:23;15539:33;15536:53;;;15585:1;15582;15575:12;15536:53;15624:9;15611:23;15643:31;15668:5;15643:31;:::i;:::-;15693:5;-1:-1:-1;15750:2:1;15735:18;;15722:32;15763:30;15722:32;15763:30;:::i;:::-;15812:7;-1:-1:-1;15866:2:1;15851:18;;15838:32;;-1:-1:-1;15917:2:1;15902:18;;15889:32;;-1:-1:-1;15968:3:1;15953:19;;15940:33;;-1:-1:-1;16025:3:1;16010:19;;15997:33;16039;15997;16039;:::i;:::-;16091:7;-1:-1:-1;16145:3:1;16130:19;;16117:33;;-1:-1:-1;16202:3:1;16187:19;;16174:33;16216:30;16174:33;16216:30;:::i;:::-;16265:7;-1:-1:-1;16291:37:1;16323:3;16308:19;;16291:37;:::i;:::-;16281:47;;16375:3;16364:9;16360:19;16347:33;16337:43;;16428:3;16417:9;16413:19;16400:33;16389:44;;15293:1146;;;;;;;;;;;;;;:::o;16444:247::-;16503:6;16556:2;16544:9;16535:7;16531:23;16527:32;16524:52;;;16572:1;16569;16562:12;16524:52;16611:9;16598:23;16630:31;16655:5;16630:31;:::i;16888:747::-;17025:6;17033;17041;17049;17057;17110:3;17098:9;17089:7;17085:23;17081:33;17078:53;;;17127:1;17124;17117:12;17078:53;17163:9;17150:23;17140:33;;17224:2;17213:9;17209:18;17196:32;17251:18;17243:6;17240:30;17237:50;;;17283:1;17280;17273:12;17237:50;17322:84;17398:7;17389:6;17378:9;17374:22;17322:84;:::i;:::-;17425:8;;-1:-1:-1;17296:110:1;-1:-1:-1;;17510:2:1;17495:18;;17482:32;17523:31;17482:32;17523:31;:::i;17861:345::-;18063:2;18045:21;;;18102:2;18082:18;;;18075:30;-1:-1:-1;;;18136:2:1;18121:18;;18114:51;18197:2;18182:18;;17861:345::o;18591:245::-;18658:6;18711:2;18699:9;18690:7;18686:23;18682:32;18679:52;;;18727:1;18724;18717:12;18679:52;18759:9;18753:16;18778:28;18800:5;18778:28;:::i;18841:245::-;18920:6;18928;18981:2;18969:9;18960:7;18956:23;18952:32;18949:52;;;18997:1;18994;18987:12;18949:52;-1:-1:-1;;19020:16:1;;19076:2;19061:18;;;19055:25;19020:16;;19055:25;;-1:-1:-1;18841:245:1:o;19091:399::-;19293:2;19275:21;;;19332:2;19312:18;;;19305:30;19371:34;19366:2;19351:18;;19344:62;-1:-1:-1;;;19437:2:1;19422:18;;19415:33;19480:3;19465:19;;19091:399::o;19495:::-;19697:2;19679:21;;;19736:2;19716:18;;;19709:30;19775:34;19770:2;19755:18;;19748:62;-1:-1:-1;;;19841:2:1;19826:18;;19819:33;19884:3;19869:19;;19495:399::o;19899:127::-;19960:10;19955:3;19951:20;19948:1;19941:31;19991:4;19988:1;19981:15;20015:4;20012:1;20005:15;20031:127;20092:10;20087:3;20083:20;20080:1;20073:31;20123:4;20120:1;20113:15;20147:4;20144:1;20137:15;20163:125;20203:4;20231:1;20228;20225:8;20222:34;;;20236:18;;:::i;:::-;-1:-1:-1;20273:9:1;;20163:125::o;20293:404::-;20495:2;20477:21;;;20534:2;20514:18;;;20507:30;20573:34;20568:2;20553:18;;20546:62;-1:-1:-1;;;20639:2:1;20624:18;;20617:38;20687:3;20672:19;;20293:404::o;20702:385::-;-1:-1:-1;;;;;20954:15:1;;;20936:34;;21006:15;;;;21001:2;20986:18;;20979:43;21065:14;;21058:22;21053:2;21038:18;;21031:50;20886:2;20871:18;;20702:385::o;21092:251::-;21162:6;21215:2;21203:9;21194:7;21190:23;21186:32;21183:52;;;21231:1;21228;21221:12;21183:52;21263:9;21257:16;21282:31;21307:5;21282:31;:::i;21348:184::-;21418:6;21471:2;21459:9;21450:7;21446:23;21442:32;21439:52;;;21487:1;21484;21477:12;21439:52;-1:-1:-1;21510:16:1;;21348:184;-1:-1:-1;21348:184:1:o;21537:168::-;21577:7;21643:1;21639;21635:6;21631:14;21628:1;21625:21;21620:1;21613:9;21606:17;21602:45;21599:71;;;21650:18;;:::i;:::-;-1:-1:-1;21690:9:1;;21537:168::o;21710:217::-;21750:1;21776;21766:132;;21820:10;21815:3;21811:20;21808:1;21801:31;21855:4;21852:1;21845:15;21883:4;21880:1;21873:15;21766:132;-1:-1:-1;21912:9:1;;21710:217::o;24178:188::-;24257:13;;-1:-1:-1;;;;;24299:42:1;;24289:53;;24279:81;;24356:1;24353;24346:12;24371:450;24458:6;24466;24474;24527:2;24515:9;24506:7;24502:23;24498:32;24495:52;;;24543:1;24540;24533:12;24495:52;24566:40;24596:9;24566:40;:::i;:::-;24556:50;;24625:49;24670:2;24659:9;24655:18;24625:49;:::i;:::-;24615:59;;24717:2;24706:9;24702:18;24696:25;24761:10;24754:5;24750:22;24743:5;24740:33;24730:61;;24787:1;24784;24777:12;24826:241;24882:6;24935:2;24923:9;24914:7;24910:23;24906:32;24903:52;;;24951:1;24948;24941:12;24903:52;24990:9;24977:23;25009:28;25031:5;25009:28;:::i;25072:222::-;25153:6;25206:2;25194:9;25185:7;25181:23;25177:32;25174:52;;;25222:1;25219;25212:12;25174:52;25245:43;25280:7;25269:9;25245:43;:::i;25299:350::-;25501:2;25483:21;;;25540:2;25520:18;;;25513:30;25579:28;25574:2;25559:18;;25552:56;25640:2;25625:18;;25299:350::o;25654:128::-;25694:3;25725:1;25721:6;25718:1;25715:13;25712:39;;;25731:18;;:::i;:::-;-1:-1:-1;25767:9:1;;25654:128::o;25787:135::-;25826:3;-1:-1:-1;;25847:17:1;;25844:43;;;25867:18;;:::i;:::-;-1:-1:-1;25914:1:1;25903:13;;25787:135::o;25927:670::-;-1:-1:-1;;;;;26294:15:1;;;26276:34;;26346:15;;;;26341:2;26326:18;;26319:43;26393:2;26378:18;;26371:34;;;;26436:2;26421:18;;26414:34;;;;26497:4;26485:17;26479:3;26464:19;;26457:46;26256:3;26519:19;;26512:35;26578:3;26563:19;;26556:35;;;;26225:3;26210:19;;25927:670::o;26784:258::-;26856:1;26866:113;26880:6;26877:1;26874:13;26866:113;;;26956:11;;;26950:18;26937:11;;;26930:39;26902:2;26895:10;26866:113;;;26997:6;26994:1;26991:13;26988:48;;;-1:-1:-1;;27032:1:1;27014:16;;27007:27;26784:258::o;27047:274::-;27176:3;27214:6;27208:13;27230:53;27276:6;27271:3;27264:4;27256:6;27252:17;27230:53;:::i;:::-;27299:16;;;;;27047:274;-1:-1:-1;;27047:274:1:o;27326:624::-;27557:6;27546:9;27539:25;27600:6;27595:2;27584:9;27580:18;27573:34;27672:1;27668;27663:3;27659:11;27655:19;27647:6;27643:32;27638:2;27627:9;27623:18;27616:60;27712:3;27707:2;27696:9;27692:18;27685:31;27520:4;27745:6;27739:13;27789:6;27783:3;27772:9;27768:19;27761:35;27805:67;27865:6;27859:3;27848:9;27844:19;27839:2;27831:6;27827:15;27805:67;:::i;:::-;27933:2;27912:15;-1:-1:-1;;27908:29:1;27893:45;;;;27940:3;27889:55;;27326:624;-1:-1:-1;;;;;27326:624:1:o

Swarm Source

ipfs://e6efa68269e8b49fe415e3d43f111437355d5066d7adbf8137894a015eaa750f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.