Contract 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd51247c826a3263b9b63b4c9e66193c4694a70f13160eda1cae9094d8d30cec4Swap BNB For Exa...81235812021-06-08 17:05:48138 days 4 hrs ago0x42a046b27191c3354f7260e2b81d218f5698d560 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.002073299799009 BNB0.001066055
0x8cda36a4068d78e867e547e1bd5777261dd285197de667c86f3103efc23c84b4Remove Liquidity...78417002021-05-29 21:32:33148 days ago0x1f606f8f1ab545b65795b2a09b8ae9343343edcd IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001802475
0x161a28ab2094ec3164a6695680014ddc5064b1d1b3f865806c16c0bf789adb04Swap Exact Token...78332672021-05-29 14:29:32148 days 7 hrs ago0x1f606f8f1ab545b65795b2a09b8ae9343343edcd IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00085712
0x04b14659b87dd5d502a03aacc5b4d087db211526062cdba45e16d4ed15e6a400Swap Exact Token...78331572021-05-29 14:24:02148 days 7 hrs ago0x1f606f8f1ab545b65795b2a09b8ae9343343edcd IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00085706
0x6985903db59b5058a8802492ce3b8c4bd91e22e8af91bcb91521d6db4ced45f1Swap Exact Token...78331332021-05-29 14:22:50148 days 7 hrs ago0x1f606f8f1ab545b65795b2a09b8ae9343343edcd IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00100706
0xaa4b77c1319e8e6439168468cd64bba8810c7be1abfd6be16ce825b579876482Swap Exact Token...77487452021-05-26 15:44:42151 days 5 hrs ago0x6ab765f6ab3ababf78d1552c7855376a0a8bd077 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001168885
0xd40fed78a2cb3de6946065bd533ebc8548582a8f0e30908e8b32224cd9e06d59Remove Liquidity...77487112021-05-26 15:43:00151 days 5 hrs ago0x6ab765f6ab3ababf78d1552c7855376a0a8bd077 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001693175
0xd522825c26b69f33eb1afce993be93e3c7581a35ce3f67a258c5a3900cb61c7dSwap Exact BNB F...74419652021-05-15 21:50:05161 days 23 hrs ago0x930235c472ba11f9945bd4016e00264e04f18e0d IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.005 BNB0.00095091
0x1e6737d52d587d5f17310e3c072a485f3d9e6dbd2e272fd8a7edc865109c6b72Swap Exact BNB F...73799112021-05-13 17:09:13164 days 4 hrs ago0x7b90ac8de4eb47645d4d0d6034ac6cdc36281046 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.0083 BNB0.00102597
0x60193d9701d99bf5a12888a12128b5b32dbc5ba3039e51f7b62c86434b6b551bSwap Exact Token...72961182021-05-10 11:47:04167 days 9 hrs ago0x03a089ccaad6ecfecb789a234d152b7b58d0869a IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001200052
0xc84dbe3a3f7d34a42fb11dc580a7d3dd25d141bcdf9d215025f2d29e5029088fSwap Exact Token...72408062021-05-08 11:17:53169 days 10 hrs ago0xeb8b8bc5f65ac509c61e0a864dad454ed751c235 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001356455
0x1669cbc0f40796fc88000adc28feb1e2417ac443d2062074b011bf11ce5fdd48Swap Exact Token...72407942021-05-08 11:17:17169 days 10 hrs ago0xeb8b8bc5f65ac509c61e0a864dad454ed751c235 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00084183
0x833e0c375a7e711f2eec3db72f92bafc291bd1859dfaab1501b39b0abd5b0580Add Liquidity BN...71268172021-05-04 10:19:02173 days 11 hrs ago0xe7902726f24e258c834d2779162ebe55b7b8c657 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.01 BNB0.00121361
0x95be1c35cb342abd037260d7a83be8fd0580955fe822a595795f2d963fabcf76Swap Exact Token...71261202021-05-04 9:44:07173 days 11 hrs ago0xe7902726f24e258c834d2779162ebe55b7b8c657 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00084377
0x1a25b7c4375f8e462c69b15111bae88fc3ec14ea5bd01481405f3de473ae3cc5Swap Exact BNB F...71259792021-05-04 9:37:04173 days 11 hrs ago0xe7902726f24e258c834d2779162ebe55b7b8c657 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.01 BNB0.00102591
0xa9964f91c23fa6c3fa0c5405863e712efab2e8df569ec0dd5d0e67c69fecd4ebSwap Exact Token...71215962021-05-04 5:57:19173 days 15 hrs ago0x50dc4ed2b4adcf0b253f9343e07a3e52cb2e8fe6 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00085706
0x75371ee755f6339f39584ced98ae3b0428f480ffd077c9459743ed955b297280Swap Exact Token...70745442021-05-02 14:12:21175 days 7 hrs ago0xeb8b8bc5f65ac509c61e0a864dad454ed751c235 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00087786
0xe6debecc5ceeeaa2a8be2025cb48ca8536c165b25843e1718d4299c1d9217a2bSwap Exact Token...70745132021-05-02 14:10:48175 days 7 hrs ago0xeb8b8bc5f65ac509c61e0a864dad454ed751c235 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.001392945
0x80fb116d275aacf73c5416cf79a563f0343346ede992651f75ba73fde09d2537Swap Exact Token...70744632021-05-02 14:08:17175 days 7 hrs ago0xeb8b8bc5f65ac509c61e0a864dad454ed751c235 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00205505
0xeef90c9b5b4c0dd177f3ef86951e25285ee2e58f161c1f6de155df55820251c5Swap Exact Token...70738512021-05-02 13:37:40175 days 7 hrs ago0xabae9f7e0be26125833941920894c8997ec3f42f IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00085718
0xcf05d54ff4b67c00393db58ef1a9fedf8bed037095e2f25fab1e44a9385b6554Swap Exact Token...70737702021-05-02 13:33:37175 days 7 hrs ago0xa5721ad0c3a3a58bfe094a6d3ed51f4aa74e83d5 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00085718
0x1e90509f6d525ad837ae5404a55fc15cfaeff09f2772bcecf32600a2ac746d31Swap Exact BNB F...70736692021-05-02 13:28:26175 days 8 hrs ago0xa5721ad0c3a3a58bfe094a6d3ed51f4aa74e83d5 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.01 BNB0.00102597
0xa969538964b6bd3d191079ae6b659a83284e9239fe9178cfe099f455b8ac53e5Swap Exact Token...70735362021-05-02 13:21:09175 days 8 hrs ago0x9d82663727ca4359e3dcb135d21add12648d7c30 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00093218
0x3ab46a1d6f764c5d8278e59f54464f891123d52ac88bb9ba2f0b0555c74195e6Remove Liquidity...70735232021-05-02 13:20:30175 days 8 hrs ago0x9d82663727ca4359e3dcb135d21add12648d7c30 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580 BNB0.00274211
0xb6684cef0776a2bf2ad6b07fdb9e922d1bd7b4e2515ddb0b57e63c05e633a981Add Liquidity BN...70733412021-05-02 13:11:24175 days 8 hrs ago0x9d82663727ca4359e3dcb135d21add12648d7c30 IN  0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.010905087978497 BNB0.000937915
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd51247c826a3263b9b63b4c9e66193c4694a70f13160eda1cae9094d8d30cec481235812021-06-08 17:05:48138 days 4 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x42a046b27191c3354f7260e2b81d218f5698d5600.000010314924373179 BNB
0xd51247c826a3263b9b63b4c9e66193c4694a70f13160eda1cae9094d8d30cec481235812021-06-08 17:05:48138 days 4 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958 Binance: WBNB Token0.002062984874635835 BNB
0x8cda36a4068d78e867e547e1bd5777261dd285197de667c86f3103efc23c84b478417002021-05-29 21:32:33148 days ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x1f606f8f1ab545b65795b2a09b8ae9343343edcd0.050867896336067484 BNB
0x8cda36a4068d78e867e547e1bd5777261dd285197de667c86f3103efc23c84b478417002021-05-29 21:32:33148 days ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.050867896336067484 BNB
0x161a28ab2094ec3164a6695680014ddc5064b1d1b3f865806c16c0bf789adb0478332672021-05-29 14:29:32148 days 7 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x1f606f8f1ab545b65795b2a09b8ae9343343edcd0.021600307333387299 BNB
0x161a28ab2094ec3164a6695680014ddc5064b1d1b3f865806c16c0bf789adb0478332672021-05-29 14:29:32148 days 7 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.021600307333387299 BNB
0x04b14659b87dd5d502a03aacc5b4d087db211526062cdba45e16d4ed15e6a40078331572021-05-29 14:24:02148 days 7 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x1f606f8f1ab545b65795b2a09b8ae9343343edcd0.024693727587230723 BNB
0x04b14659b87dd5d502a03aacc5b4d087db211526062cdba45e16d4ed15e6a40078331572021-05-29 14:24:02148 days 7 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.024693727587230723 BNB
0x6985903db59b5058a8802492ce3b8c4bd91e22e8af91bcb91521d6db4ced45f178331332021-05-29 14:22:50148 days 7 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x1f606f8f1ab545b65795b2a09b8ae9343343edcd0.048934111585015976 BNB
0x6985903db59b5058a8802492ce3b8c4bd91e22e8af91bcb91521d6db4ced45f178331332021-05-29 14:22:50148 days 7 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.048934111585015976 BNB
0xaa4b77c1319e8e6439168468cd64bba8810c7be1abfd6be16ce825b57987648277487452021-05-26 15:44:42151 days 5 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x6ab765f6ab3ababf78d1552c7855376a0a8bd0770.002445152887368404 BNB
0xaa4b77c1319e8e6439168468cd64bba8810c7be1abfd6be16ce825b57987648277487452021-05-26 15:44:42151 days 5 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.002445152887368404 BNB
0xd40fed78a2cb3de6946065bd533ebc8548582a8f0e30908e8b32224cd9e06d5977487112021-05-26 15:43:00151 days 5 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x6ab765f6ab3ababf78d1552c7855376a0a8bd0770.002075698494930101 BNB
0xd40fed78a2cb3de6946065bd533ebc8548582a8f0e30908e8b32224cd9e06d5977487112021-05-26 15:43:00151 days 5 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.002075698494930101 BNB
0xd522825c26b69f33eb1afce993be93e3c7581a35ce3f67a258c5a3900cb61c7d74419652021-05-15 21:50:05161 days 23 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958 Binance: WBNB Token0.005 BNB
0x1e6737d52d587d5f17310e3c072a485f3d9e6dbd2e272fd8a7edc865109c6b7273799112021-05-13 17:09:13164 days 4 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958 Binance: WBNB Token0.0083 BNB
0x60193d9701d99bf5a12888a12128b5b32dbc5ba3039e51f7b62c86434b6b551b72961182021-05-10 11:47:04167 days 9 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x03a089ccaad6ecfecb789a234d152b7b58d0869a0.003726126072291284 BNB
0x60193d9701d99bf5a12888a12128b5b32dbc5ba3039e51f7b62c86434b6b551b72961182021-05-10 11:47:04167 days 9 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.003726126072291284 BNB
0x833e0c375a7e711f2eec3db72f92bafc291bd1859dfaab1501b39b0abd5b058071268172021-05-04 10:19:02173 days 11 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580xe7902726f24e258c834d2779162ebe55b7b8c6571 wei
0x833e0c375a7e711f2eec3db72f92bafc291bd1859dfaab1501b39b0abd5b058071268172021-05-04 10:19:02173 days 11 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958 Binance: WBNB Token0.009999999999999999 BNB
0x1a25b7c4375f8e462c69b15111bae88fc3ec14ea5bd01481405f3de473ae3cc571259792021-05-04 9:37:04173 days 11 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba72958 Binance: WBNB Token0.01 BNB
0xa9964f91c23fa6c3fa0c5405863e712efab2e8df569ec0dd5d0e67c69fecd4eb71215962021-05-04 5:57:19173 days 15 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580x50dc4ed2b4adcf0b253f9343e07a3e52cb2e8fe60.012441263234398503 BNB
0xa9964f91c23fa6c3fa0c5405863e712efab2e8df569ec0dd5d0e67c69fecd4eb71215962021-05-04 5:57:19173 days 15 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.012441263234398503 BNB
0xeef90c9b5b4c0dd177f3ef86951e25285ee2e58f161c1f6de155df55820251c570738512021-05-02 13:37:40175 days 7 hrs ago 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580xabae9f7e0be26125833941920894c8997ec3f42f0.011736518927054048 BNB
0xeef90c9b5b4c0dd177f3ef86951e25285ee2e58f161c1f6de155df55820251c570738512021-05-02 13:37:40175 days 7 hrs ago Binance: WBNB Token 0xd8d0cbf059c5b39d4cb1c7592ce09d714ba729580.011736518927054048 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProximaV3Router

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 10: ProximaV3Router.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

import "./UniswapV2Library.sol";
import "./SafeMath.sol";
import "./TransferHelper.sol";
import "./IUniswapV2Router.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Pair.sol";
import "./IWETH.sol";

interface IProximaLiquidityRewardVault {
    function lockShares(address[] memory pair, address user)
        external
        returns (bool);

    function getCurrentDistribution() external view returns (uint256);
}

contract ProximaV3Router is IUniswapV2Router {
    using SafeMathUniswap for uint256;

    address public immutable override factory;
    address public immutable override WBNB;
    address public override rewardVault;
    address public override governor;
    address public pxa;
    bool public override pairGovernance;

    mapping(address => mapping(address => uint256)) public kLastLiquidator;
    mapping(address => mapping(uint256 => uint256)) public kLastTransactor;
    mapping(address => bool) private nisin;
    mapping(address => uint256) public previousRewards;

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "ProximaV3Router: EXPIRED");
        _;
    }

    constructor(
        address _factory,
        address _WETH,
        address _pxa,
        address _rewardVault
    ) public {
        pxa = _pxa;
        factory = _factory;
        WBNB = _WETH;
        rewardVault = _rewardVault;
        governor = msg.sender;
        pairGovernance = true;
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(
                tokenA,
                tokenB,
                msg.sender,
                pairGovernance
            );
        }
        (uint256 reserveA, uint256 reserveB) =
            UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal =
                UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "ProximaV3Router: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal =
                    UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "ProximaV3Router: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

        if (kLastLiquidator[pair][to] != 0) {
            uint256 currentSupply = IUniswapV2Pair(pair).totalSupply();
            uint256 rewardAmount =
                calculateDistribution(
                    pair,
                    to,
                    currentSupply.sub(IUniswapV2Pair(pair).balanceOf(to)),
                    currentSupply
                );
            previousRewards[msg.sender] = previousRewards[msg.sender].add(
                rewardAmount
            );
        }

        kLastLiquidator[pair][to] = block.number;
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WBNB,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WBNB);

        if (IUniswapV2Pair(pair).balanceOf(to) != 0) {
            uint256 currentSupply = IUniswapV2Pair(pair).totalSupply();
            uint256 rewardAmount =
                calculateDistribution(
                    pair,
                    to,
                    currentSupply.sub(IUniswapV2Pair(pair).balanceOf(to)),
                    currentSupply
                );
            previousRewards[msg.sender] = previousRewards[msg.sender].add(
                rewardAmount
            );
        }
        kLastLiquidator[pair][to] = block.number;
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WBNB).deposit{value: amountETH}();
        assert(IWETH(WBNB).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH)
            TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function _removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) internal ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0, ) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(
            amountA >= amountAMin,
            "ProximaV3Router: INSUFFICIENT_A_AMOUNT"
        );
        require(
            amountB >= amountBMin,
            "ProximaV3Router: INSUFFICIENT_B_AMOUNT"
        );
        require(nisin[msg.sender] == false, "ProximaV3Router : failed");
    }

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint256 amountA, uint256 amountB)
    {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint256 oldLpSupply = IUniswapV2Pair(pair).totalSupply();

        (amountA, amountB) = _removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            address(this),
            deadline
        );

        TransferHelper.safeTransfer(tokenA, to, amountA);
        TransferHelper.safeTransfer(tokenB, to, amountB);
        distributePxaLpRewards(pair, to, oldLpSupply);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IUniswapV2Pair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountA, amountB) = removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            to,
            deadline
        );
    }

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountETH)
    {
        address pair = UniswapV2Library.pairFor(factory, token, WBNB);
        uint256 oldLpSupply = IUniswapV2Pair(pair).totalSupply();
        (amountToken, amountETH) = _removeLiquidity(
            token,
            WBNB,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WBNB).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
        distributePxaLpRewards(pair, to, oldLpSupply);
    }

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
        virtual
        override
        returns (uint256 amountToken, uint256 amountETH)
    {
        address pair = UniswapV2Library.pairFor(factory, token, WBNB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IUniswapV2Pair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountToken, amountETH) = removeLiquidityBNB(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    function distributePxaLpRewards(
        address pair,
        address to,
        uint256 oldLpSupply
    ) internal {
        uint256 newLpSupply = IUniswapV2Pair(pair).totalSupply();
        uint256 pxaBalance = IUniswapV2Pair(pxa).balanceOf(address(this));

        if (pxaBalance > 0) {
            if (kLastLiquidator[pair][to] != 0) {
                uint256 optimalAmount =
                    calculateDistribution(
                        pair,
                        to,
                        oldLpSupply,
                        (oldLpSupply.sub(newLpSupply))
                    );
                optimalAmount = optimalAmount.add(previousRewards[to]);
                if (optimalAmount < pxaBalance) {
                    safePxaTransfer(to, optimalAmount);
                } else {
                    safePxaTransfer(to, pxaBalance);
                }
            }
        }
        if (IUniswapV2Pair(pair).balanceOf(to) == 0) {
            kLastLiquidator[pair][to] = 0;
        } else {
            kLastLiquidator[pair][to] = block.number;
        }

        if (IUniswapV2Pair(pxa).balanceOf(address(this)) > 0) {
            safePxaTransfer(pair, IUniswapV2Pair(pxa).balanceOf(address(this)));
            IUniswapV2Pair(pair).sync();
        }
        previousRewards[to] = 0;
    }

    function calculateDistribution(
        address pair,
        address to,
        uint256 oldLpSupply,
        uint256 diffLpSupply
    ) internal view returns (uint256 optimalAmount) {
        uint256 maxReward = 0;
        optimalAmount = 0;
        if (kLastLiquidator[pair][to] > 1) {
            uint256 currentDistribution =
                IProximaLiquidityRewardVault(rewardVault)
                    .getCurrentDistribution();
            for (
                uint256 i = kLastLiquidator[pair][to];
                i <= block.number;
                i++
            ) {
                maxReward = maxReward.add(
                    kLastTransactor[pair][i].mul(currentDistribution)
                );
            }
            uint256 percentChange = ((diffLpSupply).mul(100)).div(oldLpSupply);
            if (maxReward > 0) {
                optimalAmount = (maxReward.mul(percentChange)).div(100);
            }
        }
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to,
        address _toReward
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = UniswapV2Library.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) =
                input == token0
                    ? (uint256(0), amountOut)
                    : (amountOut, uint256(0));
            address to =
                i < path.length - 2
                    ? UniswapV2Library.pairFor(factory, output, path[i + 2])
                    : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output))
                .swap(amount0Out, amount1Out, to, new bytes(0));
        }
        require(nisin[msg.sender] == false, "ProximaV3Router : failed");
        bool rRes =
            IProximaLiquidityRewardVault(rewardVault).lockShares(
                path,
                _toReward
            );
        require(rRes == true, "ProximaV3Router : REWARD_LOCK_FAILED");
        markReward(path);
    }

    function markReward(address[] memory path) internal {
        for (uint256 i; i < path.length - 1; i++) {
            address pair =
                UniswapV2Library.pairFor(factory, path[i], path[i + 1]);
            kLastTransactor[pair][block.number] = kLastTransactor[pair][
                block.number
            ]
                .add(1);
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "ProximaV3Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "ProximaV3Router: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to, to);
    }

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WBNB, "ProximaV3Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "ProximaV3Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWETH(WBNB).deposit{value: amounts[0]}();
        assert(
            IWETH(WBNB).transfer(
                UniswapV2Library.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to, to);
    }

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WBNB, "ProximaV3Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "ProximaV3Router: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this), to);
        IWETH(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WBNB, "ProximaV3Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "ProximaV3Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this), to);
        IWETH(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WBNB, "ProximaV3Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= msg.value,
            "ProximaV3Router: EXCESSIVE_INPUT_AMOUNT"
        );
        IWETH(WBNB).deposit{value: amounts[0]}();
        assert(
            IWETH(WBNB).transfer(
                UniswapV2Library.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to, to);
        // refund dust eth, if any
        if (msg.value > amounts[0])
            TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function setPairGovernanceState(bool _newState) external override {
        require(msg.sender == governor, "UniswapV2: FORBIDDEN");
        pairGovernance = _newState;
    }

    function reannounceGovernor(address _governor) external override {
        require(msg.sender == governor, "UniswapV2: FORBIDDEN");
        governor = _governor;
    }

    function updateNisin(address _nisin, bool _state) external {
        require(msg.sender == governor, "UniswapV2: FORBIDDEN");
        nisin[_nisin] = _state;
    }

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

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

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

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

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

    function getOptimalAmount(
        address tokenA,
        address tokenB,
        uint256 amountADesired
    ) public view virtual override returns (uint256 amountA, uint256 amountB) {
        (uint256 reserveA, uint256 reserveB) =
            UniswapV2Library.getReserves(factory, tokenA, tokenB);
        require(
            reserveA != 0 && reserveB != 0,
            "ProximaV3Router: NOT_INITIALIZED"
        );
        uint256 amountBOptimal =
            UniswapV2Library.quote(amountADesired, reserveA, reserveB);
        (amountA, amountB) = (amountADesired, amountBOptimal);
    }

    function safePxaTransfer(address _to, uint256 _amount) internal {
        if (_amount > 0) {
            uint256 rBal = IUniswapV2Pair(pxa).balanceOf(address(this));
            if (_amount > rBal) {
                TransferHelper.safeTransfer(pxa, _to, rBal);
            } else {
                TransferHelper.safeTransfer(pxa, _to, _amount);
            }
        }
    }
}

File 2 of 10: IUniswapV2Factory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function proximaToken() external view returns (address);

    function rewardVault() external view returns (address);

    function pairGovernor() external view returns (address);

    function router() external view returns (address);

    function migrator() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setRouter(address) external;

    function setPairGovernor(address) external;

    function setMigrator(address) external;
}

File 3 of 10: IUniswapV2Pair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

File 4 of 10: IUniswapV2Router.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

interface IUniswapV2Router {
    function factory() external pure returns (address);

    function WBNB() external pure returns (address);

    function governor() external pure returns (address);

    function pairGovernance() external pure returns (bool);

    function rewardVault() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function setPairGovernanceState(bool) external;

    function reannounceGovernor(address) external;

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getOptimalAmount(
        address tokenA,
        address tokenB,
        uint256 amountADesired
    ) external view returns (uint256 amountA, uint256 amountB);
}

File 5 of 10: IWETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

File 6 of 10: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 7 of 10: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 8 of 10: SafeMathUniswap.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

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

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

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

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

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y > 0, "ds-math-div-by-zero");
        return x / y;
    }
}

File 9 of 10: TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.0;

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

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

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

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

File 10 of 10: UniswapV2Library.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import "./IUniswapV2Pair.sol";

import "./SafeMathUniswap.sol";

library UniswapV2Library {
    using SafeMathUniswap for uint256;

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

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

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) =
            IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_pxa","type":"address"},{"internalType":"address","name":"_rewardVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WBNB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"}],"name":"getOptimalAmount","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"kLastLiquidator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"kLastTransactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairGovernance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"previousRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pxa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"reannounceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityBNBWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setPairGovernanceState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapBNBForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactBNBForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForBNB","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactBNB","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nisin","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"updateNisin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051620049a9380380620049a98339818101604052608081101561003557600080fd5b50805160208201516040830151606093840151600280546001600160601b031995871b86166080529390951b90931660a052600080546001600160a01b039485166001600160a01b0319918216179091556001805482163317905560ff60a01b199390911691161716600160a01b17905560805160601c60a05160601c614802620001a7600039806101e15280610ec1528061121b52806113ad5280611547528061168a528061171252806119a95280611a8b5280611bd15280611c595280611fd95280612197528061222c52806122675280612606528061265c5280612827528061289b525080610cba5280610cf35280610dee5280610e9f5280610ff452806110cb52806112a952806115da528061174452806118f95280611b1e5280611c8b5280611de05280611eb75280611eef528061206752806121755280612369528061263a528061317d52806131c052806136925280613e195280613f155280613f9552806143fe52506148026000f3fe6080604052600436106101d15760003560e01c80638803dbee116100f7578063ce509f8d11610095578063d748fc2811610064578063d748fc2814610b43578063e058848814610b76578063e8e3370014610bc9578063eaaed44214610c495761020a565b8063ce509f8d146109b7578063d06ca61f146109cc578063d3436dc214610a81578063d67b571e14610aad5761020a565b80639cf68911116100d15780639cf689111461088b578063ad615dec1461090f578063baa2abde14610945578063c45a0155146109a25761020a565b80638803dbee146107ad5780638dd95002146108435780639bfa0208146108585761020a565b80633a2c67771161016f578063671248331161013e578063671248331461067f5780636f7582d1146106ba5780638332a963146106f357806385f8c259146107775761020a565b80633a2c6777146105705780633af69c9314610585578063493468f5146105c05780635d616c5b146105e95761020a565b80632195995c116101ab5780632195995c1461038d5780632adf764c1461042457806334a0772d1461046757806338ed1739146104da5761020a565b8063054d50d41461020f5780630c340a24146102575780631f00ca74146102885761020a565b3661020a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020857fe5b005b600080fd5b34801561021b57600080fd5b506102456004803603606081101561023257600080fd5b5080359060208101359060400135610c8f565b60408051918252519081900360200190f35b34801561026357600080fd5b5061026c610ca4565b604080516001600160a01b039092168252519081900360200190f35b34801561029457600080fd5b5061033d600480360360408110156102ab57600080fd5b81359190810190604081016020820135600160201b8111156102cc57600080fd5b8201836020820111156102de57600080fd5b803590602001918460208302840111600160201b831117156102ff57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610cb3945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610379578181015183820152602001610361565b505050509050019250505060405180910390f35b34801561039957600080fd5b5061040b60048036036101608110156103b157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135610ce9565b6040805192835260208301919091528051918290030190f35b34801561043057600080fd5b5061040b6004803603606081101561044757600080fd5b506001600160a01b03813581169160208101359091169060400135610de3565b34801561047357600080fd5b5061040b600480360361014081101561048b57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610e95565b3480156104e657600080fd5b5061033d600480360360a08110156104fd57600080fd5b813591602081013591810190606081016040820135600160201b81111561052357600080fd5b82018360208201111561053557600080fd5b803590602001918460208302840111600160201b8311171561055657600080fd5b91935091506001600160a01b038135169060200135610fa9565b34801561057c57600080fd5b5061026c61118f565b34801561059157600080fd5b50610245600480360360408110156105a857600080fd5b506001600160a01b038135811691602001351661119e565b3480156105cc57600080fd5b506105d56111bb565b604080519115158252519081900360200190f35b3480156105f557600080fd5b5061033d600480360360a081101561060c57600080fd5b813591602081013591810190606081016040820135600160201b81111561063257600080fd5b82018360208201111561064457600080fd5b803590602001918460208302840111600160201b8311171561066557600080fd5b91935091506001600160a01b0381351690602001356111cb565b34801561068b57600080fd5b50610208600480360360408110156106a257600080fd5b506001600160a01b0381351690602001351515611461565b3480156106c657600080fd5b50610245600480360360408110156106dd57600080fd5b506001600160a01b0381351690602001356114e2565b61033d6004803603608081101561070957600080fd5b81359190810190604081016020820135600160201b81111561072a57600080fd5b82018360208201111561073c57600080fd5b803590602001918460208302840111600160201b8311171561075d57600080fd5b91935091506001600160a01b0381351690602001356114ff565b34801561078357600080fd5b506102456004803603606081101561079a57600080fd5b50803590602081013590604001356118a1565b3480156107b957600080fd5b5061033d600480360360a08110156107d057600080fd5b813591602081013591810190606081016040820135600160201b8111156107f657600080fd5b82018360208201111561080857600080fd5b803590602001918460208302840111600160201b8311171561082957600080fd5b91935091506001600160a01b0381351690602001356118ae565b34801561084f57600080fd5b5061026c6119a7565b34801561086457600080fd5b506102086004803603602081101561087b57600080fd5b50356001600160a01b03166119cb565b61033d600480360360808110156108a157600080fd5b81359190810190604081016020820135600160201b8111156108c257600080fd5b8201836020820111156108d457600080fd5b803590602001918460208302840111600160201b831117156108f557600080fd5b91935091506001600160a01b038135169060200135611a43565b34801561091b57600080fd5b506102456004803603606081101561093257600080fd5b5080359060208101359060400135611d85565b34801561095157600080fd5b5061040b600480360360e081101561096857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611d92565b3480156109ae57600080fd5b5061026c611eb5565b3480156109c357600080fd5b5061026c611ed9565b3480156109d857600080fd5b5061033d600480360360408110156109ef57600080fd5b81359190810190604081016020820135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460208302840111600160201b83111715610a4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ee8945050505050565b348015610a8d57600080fd5b5061020860048036036020811015610aa457600080fd5b50351515611f15565b348015610ab957600080fd5b5061033d600480360360a0811015610ad057600080fd5b813591602081013591810190606081016040820135600160201b811115610af657600080fd5b820183602082011115610b0857600080fd5b803590602001918460208302840111600160201b83111715610b2957600080fd5b91935091506001600160a01b038135169060200135611f89565b348015610b4f57600080fd5b5061024560048036036020811015610b6657600080fd5b50356001600160a01b0316612115565b348015610b8257600080fd5b5061040b600480360360c0811015610b9957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612127565b348015610bd557600080fd5b50610c2b6004803603610100811015610bed57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612306565b60408051938452602084019290925282820152519081900360600190f35b610c2b600480360360c0811015610c5f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356125b7565b6000610c9c8484846129e1565b949350505050565b6001546001600160a01b031681565b6060610ce07f00000000000000000000000000000000000000000000000000000000000000008484612ab9565b90505b92915050565b6000806000610d197f00000000000000000000000000000000000000000000000000000000000000008f8f612c06565b9050600087610d28578c610d2c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610da257600080fd5b505af1158015610db6573d6000803e3d6000fd5b50505050610dc98f8f8f8f8f8f8f611d92565b809450819550505050509b509b9950505050505050505050565b600080600080610e147f00000000000000000000000000000000000000000000000000000000000000008888612cc6565b9150915081600014158015610e2857508015155b610e79576040805162461bcd60e51b815260206004820181905260248201527f50726f78696d615633526f757465723a204e4f545f494e495449414c495a4544604482015290519081900360640190fd5b6000610e86868484612d94565b95989597509495505050505050565b6000806000610ee57f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612c06565b9050600087610ef4578c610ef8565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015610f6e57600080fd5b505af1158015610f82573d6000803e3d6000fd5b50505050610f948e8e8e8e8e8e612127565b909f909e509c50505050505050505050505050565b60608142811015610fef576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b61104d7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e3a92505050565b9150868260018451038151811061106057fe5b602002602001015110156110a55760405162461bcd60e51b815260040180806020018281038252602b8152602001806146be602b913960400191505060405180910390fd5b611143868660008181106110b557fe5b905060200201356001600160a01b0316336111297f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106110f757fe5b905060200201356001600160a01b03168b8b600181811061111457fe5b905060200201356001600160a01b0316612c06565b8560008151811061113657fe5b6020026020010151612f71565b611184828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992508291506130ce9050565b509695505050505050565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205481565b600254600160a01b900460ff1681565b60608142811015611211576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061124b57fe5b905060200201356001600160a01b03166001600160a01b0316146112a4576040805162461bcd60e51b815260206004820152601d602482015260008051602061460b833981519152604482015290519081900360640190fd5b6113027f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e3a92505050565b9150868260018451038151811061131557fe5b6020026020010151101561135a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806146be602b913960400191505060405180910390fd5b61136a868660008181106110b557fe5b6113ab828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092508991506130ce9050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106113ea57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b50505050611184848360018551038151811061145457fe5b6020026020010151613474565b6001546001600160a01b031633146114b7576040805162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b604482015290519081900360640190fd5b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b600460209081526000928352604080842090915290825290205481565b60608142811015611545576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061157c57fe5b905060200201356001600160a01b03166001600160a01b0316146115d5576040805162461bcd60e51b815260206004820152601d602482015260008051602061460b833981519152604482015290519081900360640190fd5b6116337f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ab992505050565b9150348260008151811061164357fe5b602002602001015111156116885760405162461bcd60e51b81526004018080602001828103825260278152602001806147576027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106116c457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116f757600080fd5b505af115801561170b573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61178d7f00000000000000000000000000000000000000000000000000000000000000008989600081811061177057fe5b905060200201356001600160a01b03168a8a600181811061111457fe5b8460008151811061179a57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156117e857600080fd5b505af11580156117fc573d6000803e3d6000fd5b505050506040513d602081101561181257600080fd5b505161181a57fe5b61185b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992508291506130ce9050565b8160008151811061186857fe5b602002602001015134111561189757611897338360008151811061188857fe5b60200260200101513403613474565b5095945050505050565b6000610c9c84848461356c565b606081428110156118f4576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b6119527f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ab992505050565b9150868260008151811061196257fe5b602002602001015111156110a55760405162461bcd60e51b81526004018080602001828103825260278152602001806147576027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314611a21576040805162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60608142811015611a89576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ac057fe5b905060200201356001600160a01b03166001600160a01b031614611b19576040805162461bcd60e51b815260206004820152601d602482015260008051602061460b833981519152604482015290519081900360640190fd5b611b777f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e3a92505050565b91508682600184510381518110611b8a57fe5b60200260200101511015611bcf5760405162461bcd60e51b815260040180806020018281038252602b8152602001806146be602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611c0b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c3e57600080fd5b505af1158015611c52573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611cb77f00000000000000000000000000000000000000000000000000000000000000008989600081811061177057fe5b84600081518110611cc457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d1257600080fd5b505af1158015611d26573d6000803e3d6000fd5b505050506040513d6020811015611d3c57600080fd5b5051611d4457fe5b611897828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992508291506130ce9050565b6000610c9c848484612d94565b6000808242811015611dd9576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b6000611e067f00000000000000000000000000000000000000000000000000000000000000008c8c612c06565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4357600080fd5b505afa158015611e57573d6000803e3d6000fd5b505050506040513d6020811015611e6d57600080fd5b50519050611e808c8c8c8c8c308c613644565b9095509350611e908c88876138e8565b611e9b8b88866138e8565b611ea6828883613a4b565b50505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002546001600160a01b031681565b6060610ce07f00000000000000000000000000000000000000000000000000000000000000008484612e3a565b6001546001600160a01b03163314611f6b576040805162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b604482015290519081900360640190fd5b60028054911515600160a01b0260ff60a01b19909216919091179055565b60608142811015611fcf576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061200957fe5b905060200201356001600160a01b03166001600160a01b031614612062576040805162461bcd60e51b815260206004820152601d602482015260008051602061460b833981519152604482015290519081900360640190fd5b6120c07f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ab992505050565b915086826000815181106120d057fe5b6020026020010151111561135a5760405162461bcd60e51b81526004018080602001828103825260278152602001806147576027913960400191505060405180910390fd5b60066020526000908152604090205481565b600080824281101561216e576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b60006121bb7f00000000000000000000000000000000000000000000000000000000000000008b7f0000000000000000000000000000000000000000000000000000000000000000612c06565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121f857600080fd5b505afa15801561220c573d6000803e3d6000fd5b505050506040513d602081101561222257600080fd5b505190506122558b7f00000000000000000000000000000000000000000000000000000000000000008c8c8c308c613644565b90955093506122658b88876138e8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156122cb57600080fd5b505af11580156122df573d6000803e3d6000fd5b505050506122ed8785613474565b6122f8828883613a4b565b505050965096945050505050565b6000806000834281101561234f576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b61235d8c8c8c8c8c8c613e09565b9094509250600061238f7f00000000000000000000000000000000000000000000000000000000000000008e8e612c06565b6001600160a01b038082166000908152600360209081526040808320938c1683529290522054909150156124e7576000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f857600080fd5b505afa15801561240c573d6000803e3d6000fd5b505050506040513d602081101561242257600080fd5b5051604080516370a0823160e01b81526001600160a01b03808c16600483015291519293506000926124b79286928d926124b1928516916370a08231916024808301926020929190829003018186803b15801561247e57600080fd5b505afa158015612492573d6000803e3d6000fd5b505050506040513d60208110156124a857600080fd5b505186906140a9565b856140f9565b336000908152600660205260409020549091506124d49082614258565b3360009081526006602052604090205550505b6001600160a01b038082166000908152600360209081526040808320938b1683529290522043905561251b8d338388612f71565b6125278c338387612f71565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b505050506040513d60208110156125a057600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612600576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b61262e8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613e09565b909450925060006126807f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612c06565b9050806001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126cf57600080fd5b505afa1580156126e3573d6000803e3d6000fd5b505050506040513d60208110156126f957600080fd5b5051156127f1576000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b5051604080516370a0823160e01b81526001600160a01b03808c16600483015291519293506000926127c19286928d926124b1928516916370a08231916024808301926020929190829003018186803b15801561247e57600080fd5b336000908152600660205260409020549091506127de9082614258565b3360009081526006602052604090205550505b6001600160a01b038082166000908152600360209081526040808320938b168352929052204390556128258b338388612f71565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561288057600080fd5b505af1158015612894573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561291057600080fd5b505af1158015612924573d6000803e3d6000fd5b505050506040513d602081101561293a57600080fd5b505161294257fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561299157600080fd5b505af11580156129a5573d6000803e3d6000fd5b505050506040513d60208110156129bb57600080fd5b50519250348410156129d3576129d333853403613474565b505096509650969350505050565b6000808411612a215760405162461bcd60e51b815260040180806020018281038252602b8152602001806147a2602b913960400191505060405180910390fd5b600083118015612a315750600082115b612a6c5760405162461bcd60e51b81526004018080602001828103825260288152602001806146766028913960400191505060405180910390fd5b6000612a7a856103e56142a7565b90506000612a8882856142a7565b90506000612aa283612a9c886103e86142a7565b90614258565b9050808281612aad57fe5b04979650505050505050565b6060600282511015612b12576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612b2a57600080fd5b50604051908082528060200260200182016040528015612b54578160200160208202803683370190505b5090508281600183510381518110612b6857fe5b60209081029190910101528151600019015b8015612bfe57600080612bb787866001860381518110612b9657fe5b6020026020010151878681518110612baa57fe5b6020026020010151612cc6565b91509150612bd9848481518110612bca57fe5b6020026020010151838361356c565b846001850381518110612be857fe5b6020908102919091010152505060001901612b7a565b509392505050565b6000806000612c15858561430a565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f404b0ead6e097c0ac9bb4b1ecd0de807903af223a6798cd20b5d716d3b55bef3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6000806000612cd5858561430a565b509050600080612ce6888888612c06565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612d1e57600080fd5b505afa158015612d32573d6000803e3d6000fd5b505050506040513d6060811015612d4857600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614612d82578082612d85565b81815b90999098509650505050505050565b6000808411612dd45760405162461bcd60e51b815260040180806020018281038252602581526020018061470f6025913960400191505060405180910390fd5b600083118015612de45750600082115b612e1f5760405162461bcd60e51b81526004018080602001828103825260288152602001806146766028913960400191505060405180910390fd5b82612e2a85846142a7565b81612e3157fe5b04949350505050565b6060600282511015612e93576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612eab57600080fd5b50604051908082528060200260200182016040528015612ed5578160200160208202803683370190505b5090508281600081518110612ee657fe5b60200260200101818152505060005b6001835103811015612bfe57600080612f2b87868581518110612f1457fe5b6020026020010151878660010181518110612baa57fe5b91509150612f4d848481518110612f3e57fe5b602002602001015183836129e1565b848460010181518110612f5c57fe5b60209081029190910101525050600101612ef5565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310612ff65780518252601f199092019160209182019101612fd7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613058576040519150601f19603f3d011682016040523d82523d6000602084013e61305d565b606091505b509150915081801561308b57508051158061308b575080806020019051602081101561308857600080fd5b50515b6130c65760405162461bcd60e51b815260040180806020018281038252602481526020018061477e6024913960400191505060405180910390fd5b505050505050565b60005b6001845103811015613305576000808583815181106130ec57fe5b602002602001015186846001018151811061310357fe5b602002602001015191509150600061311b838361430a565b509050600088856001018151811061312f57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461315d57826000613161565b6000835b91509150600060028b5103881061317857896131b9565b6131b97f0000000000000000000000000000000000000000000000000000000000000000878d8b600201815181106131ac57fe5b6020026020010151612c06565b90506131e67f00000000000000000000000000000000000000000000000000000000000000008888612c06565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613223576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561328b578181015183820152602001613273565b50505050905090810190601f1680156132b85780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156132da57600080fd5b505af11580156132ee573d6000803e3d6000fd5b5050600190990198506130d1975050505050505050565b503360009081526005602052604090205460ff1615613366576040805162461bcd60e51b8152602060048201526018602482015277141c9bde1a5b58558cd49bdd5d195c880e8819985a5b195960421b604482015290519081900360640190fd5b60008054604080516316719e9360e21b81526001600160a01b038581166024830152600482019283528751604483015287519316926359c67a4c9288928792829160640190602080870191028083838c5b838110156133cf5781810151838201526020016133b7565b505050509050019350505050602060405180830381600087803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505050506040513d602081101561341f57600080fd5b505190506001811515146134645760405162461bcd60e51b81526004018080602001828103825260248152602001806145bb6024913960400191505060405180910390fd5b61346d846143e8565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134c05780518252601f1990920191602091820191016134a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613522576040519150601f19603f3d011682016040523d82523d6000602084013e613527565b606091505b50509050806135675760405162461bcd60e51b81526004018080602001828103825260238152602001806147346023913960400191505060405180910390fd5b505050565b60008084116135ac5760405162461bcd60e51b815260040180806020018281038252602c8152602001806145df602c913960400191505060405180910390fd5b6000831180156135bc5750600082115b6135f75760405162461bcd60e51b81526004018080602001828103825260288152602001806146766028913960400191505060405180910390fd5b600061360f6103e861360986886142a7565b906142a7565b905060006136236103e561360986896140a9565b905061363a600182848161363357fe5b0490614258565b9695505050505050565b600080824281101561368b576040805162461bcd60e51b8152602060048201526018602482015260008051602061469e833981519152604482015290519081900360640190fd5b60006136b87f00000000000000000000000000000000000000000000000000000000000000008c8c612c06565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561371357600080fd5b505af1158015613727573d6000803e3d6000fd5b505050506040513d602081101561373d57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561378a57600080fd5b505af115801561379e573d6000803e3d6000fd5b505050506040513d60408110156137b457600080fd5b508051602090910151909250905060006137ce8e8e61430a565b509050806001600160a01b03168e6001600160a01b0316146137f15781836137f4565b82825b90975095508a8710156138385760405162461bcd60e51b81526004018080602001828103825260268152602001806146e96026913960400191505060405180910390fd5b898610156138775760405162461bcd60e51b81526004018080602001828103825260268152602001806146506026913960400191505060405180910390fd5b3360009081526005602052604090205460ff16156138d7576040805162461bcd60e51b8152602060048201526018602482015277141c9bde1a5b58558cd49bdd5d195c880e8819985a5b195960421b604482015290519081900360640190fd5b505050505097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106139655780518252601f199092019160209182019101613946565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146139c7576040519150601f19603f3d011682016040523d82523d6000602084013e6139cc565b606091505b50915091508180156139fa5750805115806139fa57508080602001905160208110156139f757600080fd5b50515b61346d576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b6000836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a8657600080fd5b505afa158015613a9a573d6000803e3d6000fd5b505050506040513d6020811015613ab057600080fd5b5051600254604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613b0357600080fd5b505afa158015613b17573d6000803e3d6000fd5b505050506040513d6020811015613b2d57600080fd5b505190508015613bc5576001600160a01b0380861660009081526003602090815260408083209388168352929052205415613bc5576000613b79868686613b7481886140a9565b6140f9565b6001600160a01b038616600090815260066020526040902054909150613ba0908290614258565b905081811015613bb957613bb485826144a3565b613bc3565b613bc385836144a3565b505b846001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613c1257600080fd5b505afa158015613c26573d6000803e3d6000fd5b505050506040513d6020811015613c3c57600080fd5b5051613c6f576001600160a01b038086166000908152600360209081526040808320938816835292905290812055613c98565b6001600160a01b0380861660009081526003602090815260408083209388168352929052204390555b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613ce357600080fd5b505afa158015613cf7573d6000803e3d6000fd5b505050506040513d6020811015613d0d57600080fd5b50511115613deb57600254604080516370a0823160e01b81523060048201529051613d979288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015613d6657600080fd5b505afa158015613d7a573d6000803e3d6000fd5b505050506040513d6020811015613d9057600080fd5b50516144a3565b846001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b505050505b5050506001600160a01b031660009081526006602052604081205550565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613e9557600080fd5b505afa158015613ea9573d6000803e3d6000fd5b505050506040513d6020811015613ebf57600080fd5b50516001600160a01b03161415613f8d5760025460408051631ce09aed60e11b81526001600160a01b038b811660048301528a81166024830152336044830152600160a01b90930460ff161515606482015290517f0000000000000000000000000000000000000000000000000000000000000000909216916339c135da916084808201926020929091908290030181600087803b158015613f6057600080fd5b505af1158015613f74573d6000803e3d6000fd5b505050506040513d6020811015613f8a57600080fd5b50505b600080613fbb7f00000000000000000000000000000000000000000000000000000000000000008b8b612cc6565b91509150816000148015613fcd575080155b15613fdd5787935086925061409c565b6000613fea898484612d94565b905087811161403d57858110156140325760405162461bcd60e51b81526004018080602001828103825260268152602001806146506026913960400191505060405180910390fd5b8894509250826122f8565b600061404a898486612d94565b90508981111561405657fe5b878110156140955760405162461bcd60e51b81526004018080602001828103825260268152602001806146e96026913960400191505060405180910390fd5b9450879350505b5050965096945050505050565b80820382811115610ce3576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6001600160a01b03808516600090815260036020908152604080832093871683529290529081205481906001101561424f5760008060009054906101000a90046001600160a01b03166001600160a01b0316636821dfe86040518163ffffffff1660e01b815260040160206040518083038186803b15801561417a57600080fd5b505afa15801561418e573d6000803e3d6000fd5b505050506040513d60208110156141a457600080fd5b50516001600160a01b038089166000908152600360209081526040808320938b16835292905220549091505b43811161421a576001600160a01b03881660009081526004602090815260408083208484529091529020546142109061420990846142a7565b8490614258565b92506001016141d0565b5060006142328661422c8760646142a7565b9061455d565b9050821561424c57614249606461422c85846142a7565b93505b50505b50949350505050565b80820182811015610ce3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008115806142c2575050808202828282816142bf57fe5b04145b610ce3576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b600080826001600160a01b0316846001600160a01b0316141561435e5760405162461bcd60e51b815260040180806020018281038252602581526020018061462b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061437e578284614381565b83835b90925090506001600160a01b0382166143e1576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60005b600182510381101561449f5760006144407f000000000000000000000000000000000000000000000000000000000000000084848151811061442957fe5b60200260200101518585600101815181106131ac57fe5b6001600160a01b0381166000908152600460209081526040808320438452909152902054909150614472906001614258565b6001600160a01b0390911660009081526004602090815260408083204384529091529020556001016143eb565b5050565b801561449f57600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156144f457600080fd5b505afa158015614508573d6000803e3d6000fd5b505050506040513d602081101561451e57600080fd5b505190508082111561454657600254614541906001600160a01b031684836138e8565b613567565b600254613567906001600160a01b031684846138e8565b60008082116145a9576040805162461bcd60e51b815260206004820152601360248201527264732d6d6174682d6469762d62792d7a65726f60681b604482015290519081900360640190fd5b8183816145b257fe5b04939250505056fe50726f78696d615633526f75746572203a205245574152445f4c4f434b5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5450726f78696d615633526f757465723a20494e56414c49445f50415448000000556e697377617056324c6962726172793a204944454e544943414c5f41444452455353455350726f78696d615633526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c495155494449545950726f78696d615633526f757465723a2045585049524544000000000000000050726f78696d615633526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e5450726f78696d615633526f757465723a20494e53554646494349454e545f415f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454450726f78696d615633526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220c897f01ff153a1452ced464446d23aa4f33b3ac66e0e21f7c9c71646634c2cc564736f6c634300060c0033000000000000000000000000642e7fb78a719133f15a73e14ac5801048ad79bc000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000086b098699a219903f5a7df526ba2874f1637f30000000000000000000000000b761cdeb75746345c398b394a3e88443d368cc6c

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

000000000000000000000000642e7fb78a719133f15a73e14ac5801048ad79bc000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000086b098699a219903f5a7df526ba2874f1637f30000000000000000000000000b761cdeb75746345c398b394a3e88443d368cc6c

-----Decoded View---------------
Arg [0] : _factory (address): 0x642e7fb78a719133f15a73e14ac5801048ad79bc
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [2] : _pxa (address): 0x086b098699a219903f5a7df526ba2874f1637f30
Arg [3] : _rewardVault (address): 0xb761cdeb75746345c398b394a3e88443d368cc6c

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000642e7fb78a719133f15a73e14ac5801048ad79bc
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [2] : 000000000000000000000000086b098699a219903f5a7df526ba2874f1637f30
Arg [3] : 000000000000000000000000b761cdeb75746345c398b394a3e88443d368cc6c


Deployed ByteCode Sourcemap

491:22621:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1554:10;-1:-1:-1;;;;;1568:4:5;1554:18;;1547:26;;;;491:22621;;;;;21108:252;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21108:252:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;714:32;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;714:32:5;;;;;;;;;;;;;;21880:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21880:251:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21880:251:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21880:251:5;;-1:-1:-1;21880:251:5;;-1:-1:-1;;;;;21880:251:5:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8408:899;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8408:899:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22137:592;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22137:592:5;;;;;;;;;;;;;;;;;:::i;10227:916::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10227:916:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15108:745::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15108:745:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15108:745:5;;;;;;;;;;;;-1:-1:-1;15108:745:5;-1:-1:-1;;;;;;15108:745:5;;;;;;;;:::i;673:35::-;;;;;;;;;;;;;:::i;818:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;818:70:5;;;;;;;;;;:::i;776:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18380:966;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18380:966:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18380:966:5;;;;;;;;;;;;-1:-1:-1;18380:966:5;-1:-1:-1;;;;;;18380:966:5;;;;;;;;:::i;20670:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20670:163:5;;;;;;;;;;:::i;894:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;894:70:5;;;;;;;;:::i;19352:959::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19352:959:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19352:959:5;;;;;;;;;;;;-1:-1:-1;19352:959:5;-1:-1:-1;;;;;;19352:959:5;;;;;;;;:::i;21366:251::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21366:251:5;;;;;;;;;;;;:::i;15859:723::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15859:723:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15859:723:5;;;;;;;;;;;;-1:-1:-1;15859:723:5;-1:-1:-1;;;;;;15859:723:5;;;;;;;;:::i;629:38::-;;;;;;;;;;;;;:::i;20497:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20497:167:5;-1:-1:-1;;;;;20497:167:5;;:::i;16588:836::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16588:836:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16588:836:5;;;;;;;;;;;;-1:-1:-1;16588:836:5;-1:-1:-1;;;;;;16588:836:5;;;;;;;;:::i;20874:228::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20874:228:5;;;;;;;;;;;;:::i;7529:873::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7529:873:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;582:41::-;;;;;;;;;;;;;:::i;752:18::-;;;;;;;;;;;;;:::i;21623:251::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21623:251:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21623:251:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21623:251:5;;-1:-1:-1;21623:251:5;;-1:-1:-1;;;;;21623:251:5:i;20317:174::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20317:174:5;;;;:::i;17430:944::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17430:944:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17430:944:5;;;;;;;;;;;;-1:-1:-1;17430:944:5;-1:-1:-1;;;;;;17430:944:5;;;;;;;;:::i;1014:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1014:50:5;-1:-1:-1;;;;;1014:50:5;;:::i;9313:908::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9313:908:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3341:1470::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3341:1470:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:1641;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4817:1641:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21108:252::-;21255:17;21291:62;21321:8;21331:9;21342:10;21291:29;:62::i;:::-;21284:69;21108:252;-1:-1:-1;;;;21108:252:5:o;714:32::-;;;-1:-1:-1;;;;;714:32:5;;:::o;21880:251::-;22022:24;22069:55;22099:7;22108:9;22119:4;22069:29;:55::i;:::-;22062:62;;21880:251;;;;;:::o;8408:899::-;8741:15;8758;8785:12;8800:49;8825:7;8834:6;8842;8800:24;:49::i;:::-;8785:64;;8859:13;8875:10;:36;;8902:9;8875:36;;;-1:-1:-1;;8875:36:5;8921:174;;;-1:-1:-1;;;8921:174:5;;8962:10;8921:174;;;;8994:4;8921:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8859:52;;-1:-1:-1;;;;;;8921:27:5;;;;;:174;;;;;-1:-1:-1;;8921:174:5;;;;;;;;-1:-1:-1;8921:27:5;:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9126;9155:6;9175;9195:9;9218:10;9242;9266:2;9282:8;9126:15;:174::i;:::-;9105:195;;;;;;;;8408:899;;;;;;;;;;;;;;;;:::o;22137:592::-;22287:15;22304;22332:16;22350;22382:53;22411:7;22420:6;22428;22382:28;:53::i;:::-;22331:104;;;;22466:8;22478:1;22466:13;;:30;;;;-1:-1:-1;22483:13:5;;;22466:30;22445:109;;;;;-1:-1:-1;;;22445:109:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22564:22;22601:58;22624:14;22640:8;22650;22601:22;:58::i;:::-;22691:14;;22564:95;;-1:-1:-1;22137:592:5;;-1:-1:-1;;;;;;22137:592:5:o;10227:916::-;10576:19;10597:17;10630:12;10645:46;10670:7;10679:5;10686:4;10645:24;:46::i;:::-;10630:61;;10701:13;10717:10;:36;;10744:9;10717:36;;;-1:-1:-1;;10717:36:5;10763:174;;;-1:-1:-1;;;10763:174:5;;10804:10;10763:174;;;;10836:4;10763:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10701:52;;-1:-1:-1;;;;;;10763:27:5;;;;;:174;;;;;-1:-1:-1;;10763:174:5;;;;;;;;-1:-1:-1;10763:27:5;:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10974:162;11006:5;11025:9;11048:14;11076:12;11102:2;11118:8;10974:18;:162::i;:::-;10947:189;;;;-1:-1:-1;10227:916:5;-1:-1:-1;;;;;;;;;;;;;10227:916:5:o;15108:745::-;15375:24;15348:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;15425:55:::1;15456:7;15465:8;15475:4;;15425:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15425:30:5::1;::::0;-1:-1:-1;;;15425:55:5:i:1;:::-;15415:65;;15542:12;15511:7;15536:1;15519:7;:14;:18;15511:27;;;;;;;;;;;;;;:43;;15490:133;;;;-1:-1:-1::0;;;15490:133:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15633:175;15678:4;;15683:1;15678:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15678:7:5::1;15699:10;15723:51;15748:7;15757:4;;15762:1;15757:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15757:7:5::1;15766:4;;15771:1;15766:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15766:7:5::1;15723:24;:51::i;:::-;15788:7;15796:1;15788:10;;;;;;;;;;;;;;15633:31;:175::i;:::-;15818:28;15824:7;15833:4;;15818:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15839:2:5;;-1:-1:-1;15839:2:5;;-1:-1:-1;15818:5:5::1;::::0;-1:-1:-1;15818:28:5:i:1;:::-;15108:745:::0;;;;;;;;;:::o;673:35::-;;;-1:-1:-1;;;;;673:35:5;;:::o;818:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;776:35::-;;;-1:-1:-1;;;776:35:5;;;;;:::o;18380:966::-;18644:24;18617:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;18717:4:5::1;18692:29;:4:::0;;-1:-1:-1;;18697:15:5;;18692:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;18692:21:5::1;-1:-1:-1::0;;;;;18692:29:5::1;;18684:71;;;::::0;;-1:-1:-1;;;18684:71:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;18684:71:5;;;;;;;;;;;;;::::1;;18775:55;18806:7;18815:8;18825:4;;18775:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;18775:30:5::1;::::0;-1:-1:-1;;;18775:55:5:i:1;:::-;18765:65;;18892:12;18861:7;18886:1;18869:7;:14;:18;18861:27;;;;;;;;;;;;;;:43;;18840:133;;;;-1:-1:-1::0;;;18840:133:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18983:175;19028:4;;19033:1;19028:7;;;;;;18983:175;19168:39;19174:7;19183:4;;19168:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;19197:4:5::1;::::0;-1:-1:-1;19204:2:5;;-1:-1:-1;19168:5:5::1;::::0;-1:-1:-1;19168:39:5:i:1;:::-;19223:4;-1:-1:-1::0;;;;;19217:20:5::1;;19238:7;19263:1;19246:7;:14;:18;19238:27;;;;;;;;;;;;;;19217:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19276:63;19307:2;19311:7;19336:1;19319:7;:14;:18;19311:27;;;;;;;;;;;;;;19276:30;:63::i;20670:163::-:0;20761:8;;-1:-1:-1;;;;;20761:8:5;20747:10;:22;20739:55;;;;;-1:-1:-1;;;20739:55:5;;;;;;;;;;;;-1:-1:-1;;;20739:55:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;20804:13:5;;;;;;;;:5;:13;;;;;:22;;-1:-1:-1;;20804:22:5;;;;;;;;;;20670:163::o;894:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;19352:959::-;19603:24;19576:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;19662:4:::1;-1:-1:-1::0;;;;;19651:15:5::1;:4;;19656:1;19651:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;19651:7:5::1;-1:-1:-1::0;;;;;19651:15:5::1;;19643:57;;;::::0;;-1:-1:-1;;;19643:57:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;19643:57:5;;;;;;;;;;;;;::::1;;19720:55;19750:7;19759:9;19770:4;;19720:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;19720:29:5::1;::::0;-1:-1:-1;;;19720:55:5:i:1;:::-;19710:65;;19820:9;19806:7;19814:1;19806:10;;;;;;;;;;;;;;:23;;19785:109;;;;-1:-1:-1::0;;;19785:109:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19910:4;-1:-1:-1::0;;;;;19904:19:5::1;;19931:7;19939:1;19931:10;;;;;;;;;;;;;;19904:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;19980:4;-1:-1:-1::0;;;;;19974:20:5::1;;20012:51;20037:7;20046:4;;20051:1;20046:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;20046:7:5::1;20055:4;;20060:1;20055:7;;;;;;20012:51;20081:7;20089:1;20081:10;;;;;;;;;;;;;;19974:131;;;;;;;;;;;;;-1:-1:-1::0;;;;;19974:131:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19974:131:5;19954:161:::1;;;;20125:28;20131:7;20140:4;;20125:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;20146:2:5;;-1:-1:-1;20146:2:5;;-1:-1:-1;20125:5:5::1;::::0;-1:-1:-1;20125:28:5:i:1;:::-;20214:7;20222:1;20214:10;;;;;;;;;;;;;;20202:9;:22;20198:106;;;20238:66;20269:10;20293:7;20301:1;20293:10;;;;;;;;;;;;;;20281:9;:22;20238:30;:66::i;:::-;19352:959:::0;;;;;;;;:::o;21366:251::-;21513:16;21548:62;21577:9;21588;21599:10;21548:28;:62::i;15859:723::-;16126:24;16099:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;16176:55:::1;16206:7;16215:9;16226:4;;16176:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16176:29:5::1;::::0;-1:-1:-1;;;16176:55:5:i:1;:::-;16166:65;;16276:11;16262:7;16270:1;16262:10;;;;;;;;;;;;;;:25;;16241:111;;;;-1:-1:-1::0;;;16241:111:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;629:38:::0;;;:::o;20497:167::-;20594:8;;-1:-1:-1;;;;;20594:8:5;20580:10;:22;20572:55;;;;;-1:-1:-1;;;20572:55:5;;;;;;;;;;;;-1:-1:-1;;;20572:55:5;;;;;;;;;;;;;;;20637:8;:20;;-1:-1:-1;;;;;;20637:20:5;-1:-1:-1;;;;;20637:20:5;;;;;;;;;;20497:167::o;16588:836::-;16842:24;16815:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;16901:4:::1;-1:-1:-1::0;;;;;16890:15:5::1;:4;;16895:1;16890:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;16890:7:5::1;-1:-1:-1::0;;;;;16890:15:5::1;;16882:57;;;::::0;;-1:-1:-1;;;16882:57:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;16882:57:5;;;;;;;;;;;;;::::1;;16959:56;16990:7;16999:9;17010:4;;16959:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16959:30:5::1;::::0;-1:-1:-1;;;16959:56:5:i:1;:::-;16949:66;;17077:12;17046:7;17071:1;17054:7;:14;:18;17046:27;;;;;;;;;;;;;;:43;;17025:133;;;;-1:-1:-1::0;;;17025:133:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17174:4;-1:-1:-1::0;;;;;17168:19:5::1;;17195:7;17203:1;17195:10;;;;;;;;;;;;;;17168:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;17244:4;-1:-1:-1::0;;;;;17238:20:5::1;;17276:51;17301:7;17310:4;;17315:1;17310:7;;;;;;17276:51;17345:7;17353:1;17345:10;;;;;;;;;;;;;;17238:131;;;;;;;;;;;;;-1:-1:-1::0;;;;;17238:131:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17238:131:5;17218:161:::1;;;;17389:28;17395:7;17404:4;;17389:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17410:2:5;;-1:-1:-1;17410:2:5;;-1:-1:-1;17389:5:5::1;::::0;-1:-1:-1;17389:28:5:i:1;20874:228::-:0;21010:15;21044:51;21067:7;21076:8;21086;21044:22;:51::i;7529:873::-;7827:15;7844;7800:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;7875:12:::1;7890:49;7915:7;7924:6;7932;7890:24;:49::i;:::-;7875:64;;7949:19;7986:4;-1:-1:-1::0;;;;;7971:32:5::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7971:34:5;;-1:-1:-1;8037:186:5::1;8067:6:::0;8087;8107:9;8130:10;8154;8186:4:::1;8205:8:::0;8037:16:::1;:186::i;:::-;8016:207:::0;;-1:-1:-1;8016:207:5;-1:-1:-1;8234:48:5::1;8262:6:::0;8270:2;8016:207;8234:27:::1;:48::i;:::-;8292;8320:6;8328:2;8332:7;8292:27;:48::i;:::-;8350:45;8373:4;8379:2;8383:11;8350:22;:45::i;:::-;1189:1;;7529:873:::0;;;;;;;;;;;:::o;582:41::-;;;:::o;752:18::-;;;-1:-1:-1;;;;;752:18:5;;:::o;21623:251::-;21765:24;21812:55;21843:7;21852:8;21862:4;21812:30;:55::i;20317:174::-;20415:8;;-1:-1:-1;;;;;20415:8:5;20401:10;:22;20393:55;;;;;-1:-1:-1;;;20393:55:5;;;;;;;;;;;;-1:-1:-1;;;20393:55:5;;;;;;;;;;;;;;;20458:14;:26;;;;;-1:-1:-1;;;20458:26:5;-1:-1:-1;;;;20458:26:5;;;;;;;;;20317:174::o;17430:944::-;17694:24;17667:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;17767:4:5::1;17742:29;:4:::0;;-1:-1:-1;;17747:15:5;;17742:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;17742:21:5::1;-1:-1:-1::0;;;;;17742:29:5::1;;17734:71;;;::::0;;-1:-1:-1;;;17734:71:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;17734:71:5;;;;;;;;;;;;;::::1;;17825:55;17855:7;17864:9;17875:4;;17825:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17825:29:5::1;::::0;-1:-1:-1;;;17825:55:5:i:1;:::-;17815:65;;17925:11;17911:7;17919:1;17911:10;;;;;;;;;;;;;;:25;;17890:111;;;;-1:-1:-1::0;;;17890:111:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1014:50:::0;;;;;;;;;;;;;:::o;9313:908::-;9595:19;9616:17;9568:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;9649:12:::1;9664:46;9689:7;9698:5;9705:4;9664:24;:46::i;:::-;9649:61;;9720:19;9757:4;-1:-1:-1::0;;;;;9742:32:5::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;9742:34:5;;-1:-1:-1;9813:189:5::1;9843:5:::0;9862:4:::1;9880:9:::0;9903:14;9931:12;9965:4:::1;9984:8:::0;9813:16:::1;:189::i;:::-;9786:216:::0;;-1:-1:-1;9786:216:5;-1:-1:-1;10012:51:5::1;10040:5:::0;10047:2;9786:216;10012:27:::1;:51::i;:::-;10079:4;-1:-1:-1::0;;;;;10073:20:5::1;;10094:9;10073:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10114:45;10145:2;10149:9;10114:30;:45::i;:::-;10169;10192:4;10198:2;10202:11;10169:22;:45::i;:::-;1189:1;;9313:908:::0;;;;;;;;;;:::o;3341:1470::-;3688:15;3717;3746:17;3648:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;3809:167:::1;3836:6;3856;3876:14;3904;3932:10;3956;3809:13;:167::i;:::-;3788:188:::0;;-1:-1:-1;3788:188:5;-1:-1:-1;3986:12:5::1;4001:49;4026:7;4035:6:::0;4043;4001:24:::1;:49::i;:::-;-1:-1:-1::0;;;;;4065:21:5;;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:25;;::::1;::::0;;;;;;;3986:64;;-1:-1:-1;4065:30:5;4061:490:::1;;4111:21;4150:4;-1:-1:-1::0;;;;;4135:32:5::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4135:34:5;4333::::1;::::0;;-1:-1:-1;;;4333:34:5;;-1:-1:-1;;;;;4333:34:5;;::::1;;::::0;::::1;::::0;;;4135;;-1:-1:-1;4183:20:5::1;::::0;4222:199:::1;::::0;4265:4;;4291:2;;4315:53:::1;::::0;4333:30;::::1;::::0;::::1;::::0;:34;;;;;4135::::1;::::0;4333;;;;;;;:30;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4333:34:5;4315:13;;:17:::1;:53::i;:::-;4390:13;4222:21;:199::i;:::-;4481:10;4465:27;::::0;;;:15:::1;:27;::::0;;;;;4183:238;;-1:-1:-1;4465:75:5::1;::::0;4183:238;4465:31:::1;:75::i;:::-;4451:10;4435:27;::::0;;;:15:::1;:27;::::0;;;;:105;-1:-1:-1;;4061:490:5::1;-1:-1:-1::0;;;;;4561:21:5;;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:25;;::::1;::::0;;;;;;4589:12:::1;4561:40:::0;;4611:66:::1;4643:6:::0;4651:10:::1;4577:4:::0;4669:7;4611:31:::1;:66::i;:::-;4687;4719:6;4727:10;4739:4;4745:7;4687:31;:66::i;:::-;4790:4;-1:-1:-1::0;;;;;4775:25:5::1;;4801:2;4775:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;4775:29:5::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4775:29:5;3341:1470;;;;-1:-1:-1;4775:29:5;;-1:-1:-1;3341:1470:5;;-1:-1:-1;;;;;;;;;3341:1470:5:o;4817:1641::-;5136:19;5169:17;5200;5096:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;5269:169:::1;5296:5;5315:4;5333:18;5365:9;5388:14;5416:12;5269:13;:169::i;:::-;5242:196:::0;;-1:-1:-1;5242:196:5;-1:-1:-1;5448:12:5::1;5463:46;5488:7;5497:5:::0;5504:4:::1;5463:24;:46::i;:::-;5448:61;;5539:4;-1:-1:-1::0;;;;;5524:30:5::1;;5555:2;5524:34;;;;;;;;;;;;;-1:-1:-1::0;;;;;5524:34:5::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5524:34:5;:39;5520:499:::1;;5579:21;5618:4;-1:-1:-1::0;;;;;5603:32:5::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;5603:34:5;5801::::1;::::0;;-1:-1:-1;;;5801:34:5;;-1:-1:-1;;;;;5801:34:5;;::::1;;::::0;::::1;::::0;;;5603;;-1:-1:-1;5651:20:5::1;::::0;5690:199:::1;::::0;5733:4;;5759:2;;5783:53:::1;::::0;5801:30;::::1;::::0;::::1;::::0;:34;;;;;5603::::1;::::0;5801;;;;;;;:30;:34;::::1;;::::0;::::1;;;;::::0;::::1;5690:199;5949:10;5933:27;::::0;;;:15:::1;:27;::::0;;;;;5651:238;;-1:-1:-1;5933:75:5::1;::::0;5651:238;5933:31:::1;:75::i;:::-;5919:10;5903:27;::::0;;;:15:::1;:27;::::0;;;;:105;-1:-1:-1;;5520:499:5::1;-1:-1:-1::0;;;;;6028:21:5;;::::1;;::::0;;;:15:::1;:21;::::0;;;;;;;:25;;::::1;::::0;;;;;;6056:12:::1;6028:40:::0;;6078:69:::1;6110:5:::0;6117:10:::1;6044:4:::0;6135:11;6078:31:::1;:69::i;:::-;6163:4;-1:-1:-1::0;;;;;6157:19:5::1;;6184:9;6157:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;6219:4;-1:-1:-1::0;;;;;6213:20:5::1;;6234:4;6240:9;6213:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;6213:37:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;6213:37:5;6206:45:::1;;;;6288:4;-1:-1:-1::0;;;;;6273:25:5::1;;6299:2;6273:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;6273:29:5::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;6273:29:5;;-1:-1:-1;6351:9:5::1;:21:::0;-1:-1:-1;6347:104:5::1;;;6386:65;6417:10;6441:9;6429;:21;6386:30;:65::i;:::-;1189:1;4817:1641:::0;;;;;;;;;;;:::o;2562:595:9:-;2694:17;2742:1;2731:8;:12;2723:68;;;;-1:-1:-1;;;2723:68:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2834:1;2822:9;:13;:31;;;;;2852:1;2839:10;:14;2822:31;2801:118;;;;-1:-1:-1;;;2801:118:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2929:23;2955:17;:8;2968:3;2955:12;:17::i;:::-;2929:43;-1:-1:-1;2982:17:9;3002:31;2929:43;3022:10;3002:19;:31::i;:::-;2982:51;-1:-1:-1;3043:19:9;3065:40;3089:15;3065:19;:9;3079:4;3065:13;:19::i;:::-;:23;;:40::i;:::-;3043:62;;3139:11;3127:9;:23;;;;;;;2562:595;-1:-1:-1;;;;;;;2562:595:9:o;4547:588::-;4681:24;4740:1;4725:4;:11;:16;;4717:59;;;;;-1:-1:-1;;;4717:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4810:4;:11;4796:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4796:26:9;;4786:36;;4862:9;4832:7;4857:1;4840:7;:14;:18;4832:27;;;;;;;;;;;;;;;;;:39;4898:11;;-1:-1:-1;;4898:15:9;4881:248;4915:5;;4881:248;;4942:17;4961:18;4999:42;5011:7;5020:4;5029:1;5025;:5;5020:11;;;;;;;;;;;;;;5033:4;5038:1;5033:7;;;;;;;;;;;;;;4999:11;:42::i;:::-;4941:100;;;;5072:46;5084:7;5092:1;5084:10;;;;;;;;;;;;;;5096:9;5107:10;5072:11;:46::i;:::-;5055:7;5067:1;5063;:5;5055:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;4922:3:9;4881:248;;;;4547:588;;;;;:::o;785:633::-;904:12;929:14;945;963:26;974:6;982;963:10;:26::i;:::-;1201:32;;;-1:-1:-1;;1201:32:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1191:43;;;;;;-1:-1:-1;;;;;;1083:286:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1052:335;;;;;;;;;785:633;-1:-1:-1;;;;;785:633:9:o;1473:467::-;1596:16;1614;1643:14;1663:26;1674:6;1682;1663:10;:26::i;:::-;1642:47;;;1700:16;1718;1767:32;1775:7;1784:6;1792;1767:7;:32::i;:::-;-1:-1:-1;;;;;1752:60:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1752:62:9;;;;;;;1699:115;;;;;-1:-1:-1;1699:115:9;;-1:-1:-1;;;;;;1847:16:9;;;;;;;:86;;1914:8;1924;1847:86;;;1879:8;1889;1847:86;1824:109;;;;-1:-1:-1;1473:467:9;-1:-1:-1;;;;;;;1473:467:9:o;2050:393::-;2171:15;2216:1;2206:7;:11;2198:61;;;;-1:-1:-1;;;2198:61:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2301:1;2290:8;:12;:28;;;;;2317:1;2306:8;:12;2290:28;2269:115;;;;-1:-1:-1;;;2269:115:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2428:8;2404:21;:7;2416:8;2404:11;:21::i;:::-;:32;;;;;;;2050:393;-1:-1:-1;;;;2050:393:9:o;3902:567::-;4036:24;4095:1;4080:4;:11;:16;;4072:59;;;;;-1:-1:-1;;;4072:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4165:4;:11;4151:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4151:26:9;;4141:36;;4200:8;4187:7;4195:1;4187:10;;;;;;;;;;;;;:21;;;;;4223:9;4218:245;4252:1;4238:4;:11;:15;4234:1;:19;4218:245;;;4275:17;4294:18;4332:42;4344:7;4353:4;4358:1;4353:7;;;;;;;;;;;;;;4362:4;4367:1;4371;4367:5;4362:11;;;;;;;4332:42;4274:100;;;;4405:47;4418:7;4426:1;4418:10;;;;;;;;;;;;;;4430:9;4441:10;4405:12;:47::i;:::-;4388:7;4396:1;4400;4396:5;4388:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;4255:3:9;;4218:245;;926:398:8;1149:51;;;-1:-1:-1;;;;;1149:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1149:51:8;-1:-1:-1;;;1149:51:8;;;1138:63;;;;1103:12;;1117:17;;1138:10;;;;1149:51;1138:63;;;1149:51;1138:63;;1149:51;1138:63;;;;;;;;;;-1:-1:-1;;1138:63:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:99;;;;1219:7;:57;;;;-1:-1:-1;1231:11:8;;:16;;:44;;;1262:4;1251:24;;;;;;;;;;;;;;;-1:-1:-1;1251:24:8;1231:44;1211:106;;;;-1:-1:-1;;;1211:106:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;926:398;;;;;;:::o;13513:1221:5:-;13679:9;13674:735;13708:1;13694:4;:11;:15;13690:1;:19;13674:735;;;13731:13;13746:14;13765:4;13770:1;13765:7;;;;;;;;;;;;;;13774:4;13779:1;13783;13779:5;13774:11;;;;;;;;;;;;;;13730:56;;;;13801:14;13821:42;13849:5;13856:6;13821:27;:42::i;:::-;13800:63;;;13877:17;13897:7;13905:1;13909;13905:5;13897:14;;;;;;;;;;;;;;13877:34;;13926:18;13946;13993:6;-1:-1:-1;;;;;13984:15:5;:5;-1:-1:-1;;;;;13984:15:5;;:107;;14069:9;14088:1;13984:107;;;14031:1;14035:9;13984:107;13925:166;;;;14105:10;14152:1;14138:4;:11;:15;14134:1;:19;:122;;14253:3;14134:122;;;14176:54;14201:7;14210:6;14218:4;14223:1;14227;14223:5;14218:11;;;;;;;;;;;;;;14176:24;:54::i;:::-;14105:151;;14285:48;14310:7;14319:5;14326:6;14285:24;:48::i;:::-;-1:-1:-1;;;;;14270:86:5;;14357:10;14369;14381:2;14395:1;14385:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14385:12:5;;14270:128;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14270:128:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13711:3:5;;;;;-1:-1:-1;13674:735:5;;-1:-1:-1;;;;;;;;13674:735:5;;-1:-1:-1;14432:10:5;14426:17;;;;:5;:17;;;;;;;;:26;14418:63;;;;;-1:-1:-1;;;14418:63:5;;;;;;;;;;;;-1:-1:-1;;;14418:63:5;;;;;;;;;;;;;;;14491:9;14544:11;;14515:115;;;-1:-1:-1;;;14515:115:5;;-1:-1:-1;;;;;14515:115:5;;;;;;;;;;;;;;;;;;;;;14544:11;;;14515:52;;14585:4;;14607:9;;14515:115;;;;;;;;;;;;;;14491:9;14515:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14515:115:5;;-1:-1:-1;14656:4:5;14648:12;;;;14640:61;;;;-1:-1:-1;;;14640:61:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:16;14722:4;14711:10;:16::i;:::-;13513:1221;;;;;:::o;1330:192:8:-;1437:12;;;1399;1437;;;;;;;;;-1:-1:-1;;;;;1416:7:8;;;1430:5;;1416:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1416:34:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:52;;;1468:7;1460:55;;;;-1:-1:-1;;;1460:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1330:192;;;:::o;3275:548:9:-;3407:16;3455:1;3443:9;:13;3435:70;;;;-1:-1:-1;;;3435:70:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3548:1;3536:9;:13;:31;;;;;3566:1;3553:10;:14;3536:31;3515:118;;;;-1:-1:-1;;;3515:118:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3643:17;3663:34;3692:4;3663:24;:9;3677;3663:13;:24::i;:::-;:28;;:34::i;:::-;3643:54;-1:-1:-1;3707:19:9;3729:34;3759:3;3729:25;:10;3744:9;3729:14;:25::i;:34::-;3707:56;;3784:32;3814:1;3797:11;3785:9;:23;;;;;;;3784:29;:32::i;:::-;3773:43;3275:548;-1:-1:-1;;;;;;3275:548:9:o;6498:1025:5:-;6742:15;6759;6723:8;1135:15;1123:8;:27;;1115:64;;;;;-1:-1:-1;;;1115:64:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1115:64:5;;;;;;;;;;;;;;;6786:12:::1;6801:49;6826:7;6835:6;6843;6801:24;:49::i;:::-;6860:62;::::0;;-1:-1:-1;;;6860:62:5;;6894:10:::1;6860:62;::::0;::::1;::::0;-1:-1:-1;;;;;6860:33:5;::::1;:62:::0;;;;;;;;;;;;;;6786:64;;-1:-1:-1;6860:33:5;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;6860:33:5;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;6995:29:5::1;::::0;;-1:-1:-1;;;6995:29:5;;-1:-1:-1;;;;;6995:29:5;;::::1;;::::0;::::1;::::0;;;6959:15:::1;::::0;;;6995:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;6959:15;6995:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;6995:29:5;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;6995:29:5;-1:-1:-1;7035:14:5::1;7055:43;7083:6:::0;7091;7055:27:::1;:43::i;:::-;7034:64;;;7139:6;-1:-1:-1::0;;;;;7129:16:5::1;:6;-1:-1:-1::0;;;;;7129:16:5::1;;:82;;7194:7;7203;7129:82;;;7161:7;7170;7129:82;7108:103:::0;;-1:-1:-1;7108:103:5;-1:-1:-1;7242:21:5;;::::1;;7221:106;;;;-1:-1:-1::0;;;7221:106:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7369:10;7358:7;:21;;7337:106;;;;-1:-1:-1::0;;;7337:106:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7467:10;7461:17;::::0;;;:5:::1;:17;::::0;;;;;::::1;;:26;7453:63;;;::::0;;-1:-1:-1;;;7453:63:5;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7453:63:5;;;;;;;;;;;;;::::1;;1189:1;;;;6498:1025:::0;;;;;;;;;;;:::o;563:357:8:-;756:45;;;-1:-1:-1;;;;;756:45:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;756:45:8;-1:-1:-1;;;756:45:8;;;745:57;;;;710:12;;724:17;;745:10;;;;756:45;745:57;;;756:45;745:57;;756:45;745:57;;;;;;;;;;-1:-1:-1;;745:57:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;709:93;;;;820:7;:57;;;;-1:-1:-1;832:11:8;;:16;;:44;;;863:4;852:24;;;;;;;;;;;;;;;-1:-1:-1;852:24:8;832:44;812:101;;;;;-1:-1:-1;;;812:101:8;;;;;;;;;;;;;;;;;;;;;;;;;;;11149:1310:5;11277:19;11314:4;-1:-1:-1;;;;;11299:32:5;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11299:34:5;11379:3;;11364:44;;;-1:-1:-1;;;11364:44:5;;11402:4;11364:44;;;;;;11299:34;;-1:-1:-1;11343:18:5;;-1:-1:-1;;;;;11379:3:5;;;;11364:29;;:44;;;;;11299:34;;11364:44;;;;;;;;11379:3;11364:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11364:44:5;;-1:-1:-1;11423:14:5;;11419:625;;-1:-1:-1;;;;;11457:21:5;;;;;;;:15;:21;;;;;;;;:25;;;;;;;;;;:30;11453:581;;11507:21;11551:194;11598:4;11628:2;11656:11;11694:28;11656:11;11710;11694:15;:28::i;:::-;11551:21;:194::i;:::-;-1:-1:-1;;;;;11797:19:5;;;;;;:15;:19;;;;;;11507:238;;-1:-1:-1;11779:38:5;;11507:238;;11779:17;:38::i;:::-;11763:54;;11855:10;11839:13;:26;11835:185;;;11889:34;11905:2;11909:13;11889:15;:34::i;:::-;11835:185;;;11970:31;11986:2;11990:10;11970:15;:31::i;:::-;11453:581;;12072:4;-1:-1:-1;;;;;12057:30:5;;12088:2;12057:34;;;;;;;;;;;;;-1:-1:-1;;;;;12057:34:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12057:34:5;12053:170;;-1:-1:-1;;;;;12112:21:5;;;12140:1;12112:21;;;:15;:21;;;;;;;;:25;;;;;;;;;;;:29;12053:170;;;-1:-1:-1;;;;;12172:21:5;;;;;;;:15;:21;;;;;;;;:25;;;;;;;;;12200:12;12172:40;;12053:170;12252:3;;12237:44;;;-1:-1:-1;;;12237:44:5;;12275:4;12237:44;;;;;;12284:1;;-1:-1:-1;;;;;12252:3:5;;12237:29;;:44;;;;;;;;;;;;;;12252:3;12237:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12237:44:5;:48;12233:187;;;12338:3;;12323:44;;;-1:-1:-1;;;12323:44:5;;12361:4;12323:44;;;;;;12301:67;;12317:4;;-1:-1:-1;;;;;12338:3:5;;;;12323:29;;:44;;;;;;;;;;;;;;;12338:3;12323:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12323:44:5;12301:15;:67::i;:::-;12397:4;-1:-1:-1;;;;;12382:25:5;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12233:187;-1:-1:-1;;;;;;;;12429:19:5;12451:1;12429:19;;;:15;:19;;;;;:23;-1:-1:-1;11149:1310:5:o;1672:1663::-;1895:15;1912;2056:1;-1:-1:-1;;;;;1994:64:5;2012:7;-1:-1:-1;;;;;1994:34:5;;2029:6;2037;1994:50;;;;;;;;;;;;;-1:-1:-1;;;;;1994:50:5;;;;;;-1:-1:-1;;;;;1994:50:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1994:50:5;-1:-1:-1;;;;;1994:64:5;;1990:254;;;2205:14;;2074:159;;;-1:-1:-1;;;2074:159:5;;-1:-1:-1;;;;;2074:159:5;;;;;;;;;;;;;;2177:10;2074:159;;;;-1:-1:-1;;;2205:14:5;;;;;2074:159;;;;;;;;2092:7;2074:37;;;;;;:159;;;;;;;;;;;;;;;-1:-1:-1;2074:37:5;:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1990:254:5;2254:16;2272;2304:53;2333:7;2342:6;2350;2304:28;:53::i;:::-;2253:104;;;;2371:8;2383:1;2371:13;:30;;;;-1:-1:-1;2388:13:5;;2371:30;2367:962;;;2439:14;;-1:-1:-1;2455:14:5;;-1:-1:-1;2367:962:5;;;2501:22;2542:58;2565:14;2581:8;2591;2542:22;:58::i;:::-;2501:99;;2636:14;2618;:32;2614:705;;2717:10;2699:14;:28;;2670:137;;;;-1:-1:-1;;;2670:137:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2847:14;;-1:-1:-1;2863:14:5;-1:-1:-1;2863:14:5;2614:705;;;2917:22;2962:58;2985:14;3001:8;3011;2962:22;:58::i;:::-;2917:103;;3063:14;3045;:32;;3038:40;;;;3143:10;3125:14;:28;;3096:137;;;;-1:-1:-1;;;3096:137:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3273:14;-1:-1:-1;3289:14:5;;-1:-1:-1;2367:962:5;;1672:1663;;;;;;;;;;;:::o;331:127:7:-;414:5;;;409:16;;;;401:50;;;;;-1:-1:-1;;;401:50:7;;;;;;;;;;;;-1:-1:-1;;;401:50:7;;;;;;;;;;;;;;12465:941:5;-1:-1:-1;;;;;12721:21:5;;;12626;12721;;;:15;:21;;;;;;;;:25;;;;;;;;;;;;12626:21;;12749:1;-1:-1:-1;12717:683:5;;;12766:27;12841:11;;;;;;;;;-1:-1:-1;;;;;12841:11:5;-1:-1:-1;;;;;12812:85:5;;:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12812:87:5;-1:-1:-1;;;;;12947:21:5;;;12935:9;12947:21;;;:15;12812:87;12947:21;;;;;;;:25;;;;;;;;;;12812:87;;-1:-1:-1;12913:277:5;12995:12;12990:1;:17;12913:277;;-1:-1:-1;;;;;13108:21:5;;;;;;:15;:21;;;;;;;;:24;;;;;;;;;13073:102;;13108:49;;13137:19;13108:28;:49::i;:::-;13073:9;;:13;:102::i;:::-;13061:114;-1:-1:-1;13025:3:5;;12913:277;;;-1:-1:-1;13203:21:5;13227:42;13257:11;13228:23;13229:12;13247:3;13228:18;:23::i;:::-;13227:29;;:42::i;:::-;13203:66;-1:-1:-1;13287:13:5;;13283:107;;13336:39;13371:3;13337:28;:9;13351:13;13337;:28::i;13336:39::-;13320:55;;13283:107;12717:683;;;12465:941;;;;;;;:::o;199:126:7:-;282:5;;;277:16;;;;269:49;;;;;-1:-1:-1;;;269:49:7;;;;;;;;;;;;-1:-1:-1;;;269:49:7;;;;;;;;;;;;;;464:140;516:6;542;;;:30;;-1:-1:-1;;557:5:7;;;571:1;566;557:5;566:1;552:15;;;;;:20;542:30;534:63;;;;;-1:-1:-1;;;534:63:7;;;;;;;;;;;;-1:-1:-1;;;534:63:7;;;;;;;;;;;;;;299:397:9;398:14;414;462:6;-1:-1:-1;;;;;452:16:9;:6;-1:-1:-1;;;;;452:16:9;;;444:66;;;;-1:-1:-1;;;444:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;548:6;-1:-1:-1;;;;;539:15:9;:6;-1:-1:-1;;;;;539:15:9;;:77;;601:6;609;539:77;;;570:6;578;539:77;520:96;;-1:-1:-1;520:96:9;-1:-1:-1;;;;;;634:20:9;;626:63;;;;;-1:-1:-1;;;626:63:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;299:397;;;;;:::o;14740:362:5:-;14807:9;14802:294;14836:1;14822:4;:11;:15;14818:1;:19;14802:294;;;14858:12;14889:55;14914:7;14923:4;14928:1;14923:7;;;;;;;;;;;;;;14932:4;14937:1;14941;14937:5;14932:11;;;;;;;14889:55;-1:-1:-1;;;;;14996:21:5;;;;;;:15;:21;;;;;;;;15035:12;14996:65;;;;;;;;14858:86;;-1:-1:-1;14996:89:5;;15083:1;14996:86;:89::i;:::-;-1:-1:-1;;;;;14958:21:5;;;;;;;:15;:21;;;;;;;;14980:12;14958:35;;;;;;;:127;14839:3;;14802:294;;;;14740:362;:::o;22735:375::-;22813:11;;22809:295;;22870:3;;22855:44;;;-1:-1:-1;;;22855:44:5;;22893:4;22855:44;;;;;;22840:12;;-1:-1:-1;;;;;22870:3:5;;22855:29;;:44;;;;;;;;;;;;;;22870:3;22855:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22855:44:5;;-1:-1:-1;22917:14:5;;;22913:181;;;22979:3;;22951:43;;-1:-1:-1;;;;;22979:3:5;22984;22989:4;22951:27;:43::i;:::-;22913:181;;;23061:3;;23033:46;;-1:-1:-1;;;;;23061:3:5;23066;23071:7;23033:27;:46::i;610:143:7:-;668:7;699:1;695;:5;687:37;;;;;-1:-1:-1;;;687:37:7;;;;;;;;;;;;-1:-1:-1;;;687:37:7;;;;;;;;;;;;;;;745:1;741;:5;;;;;;;610:143;-1:-1:-1;;;610:143:7:o

Swarm Source

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