Contract 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24

Contract Overview

Balance:
0 BNB

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago0xaa651e92fcb7dec688a0811955364920b81f11f0 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.100142587253171 BNB0.00222345
0xcd3e16d8684ea95efb8cae9b7c771d3e451ccd4ff4966b5301298aac4e1f621398662852021-06-19 9:49:554 hrs 55 mins ago0xaa651e92fcb7dec688a0811955364920b81f11f0 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.1 BNB0.00171589
0xbef3de4adae82e599f90866ae0f92078eb3d87ea3dc1a6243c629061b803ba2d98577102021-06-19 2:41:1012 hrs 3 mins ago0xecf665545bcbefbad35a2c19f05ce93604894476 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.1 BNB0.00175748
0x3d92500653e17b6927a418afb4e4671ea8bc3c347293bf37d9a5ea8191fdc73798501452021-06-18 20:22:5518 hrs 22 mins ago0x02798aded1cf43e411dec5377023d80c3b4fc335 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.5 BNB0.00156589
0x6ca02c05e44a3e6f633eb556d41e7f23a8f80469c71f8a773f48c0b33f7d6cdd98467762021-06-18 17:34:2821 hrs 10 mins ago0x7daf7c4b04433c8d6c14fc31c8e6c25ab9342c68 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.3 BNB0.00245653
0xd17d253c01f0736f4cb776a91ece4eabbe3555c5c955847905e81e7c4e4d493a98415552021-06-18 13:13:251 day 1 hr ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b241.39 BNB0.00156589
0x81e1a0d477ab9c2364fb407cb7135b515efbb428e081f797a1798c3d6e7ba84d98415452021-06-18 13:12:551 day 1 hr ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.2 BNB0.00160748
0xa186a529fc1270de28b209e929ee220f3964d1b9ab19b028bdb9262a902bb90898415312021-06-18 13:12:131 day 1 hr ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.2 BNB0.00160748
0x6e5dc6e088f8403f67cd82be085ac057be6c4e2f93898a129f1e7184e9e8a1d798415232021-06-18 13:11:491 day 1 hr ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.2 BNB0.00175748
0x9e5e4a799036b72d30653416f3b13b9c01e639553120af5f2ac5c6b87e60ba9198366002021-06-18 9:05:401 day 5 hrs ago0xfe30e0d804b3a16be7dabce94026e5d4b86b45d3 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.1 BNB0.00160743
0x452034a26be2752f5f0d6275f5fd8436a3e1a6aa22fe9e4d546a630f0d6c971498365602021-06-18 9:03:401 day 5 hrs ago0xfe30e0d804b3a16be7dabce94026e5d4b86b45d3 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.1 BNB0.00220743
0x8b8c2028352e0f8d409a94867a88a4d4686d21c8468e3bef5ae2c5719129fda398354652021-06-18 8:08:551 day 6 hrs ago0xeb2ac19b0d72517b2642562578f439094b0db6b2 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b241 BNB0.02864673
0x05a888b8aeadca48de2a7a05110d15dccb0ed01b45aabb61decd3c028aae553798197602021-06-17 19:03:401 day 19 hrs ago0xdf99f915a421a3074dd8a3fec6fa842b24e310d6 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.536498767322597 BNB0.00171594
0xd7851b0658b0dca720533fb5ce08d3080044256b6dad56d3d0c20d002c30078a98172012021-06-17 16:55:431 day 21 hrs ago0x5fd648904bc7b8b4d2faac96ac1cf1c5ac1c7567 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.206764345791711 BNB0.00171594
0x95171d0b39248b687b440ebae2179b2315aac1a5007f6c77ec403e6f9ab140be98077232021-06-17 9:01:492 days 5 hrs ago0xeb2ac19b0d72517b2642562578f439094b0db6b2 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240 BNB0.0016093
0x602a47db17821174042ee4683567feecfcfa3c72b90910560cc08a20557cec4d98077082021-06-17 9:01:042 days 5 hrs ago0xeb2ac19b0d72517b2642562578f439094b0db6b2 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240 BNB0.00140918
0x65d268c602f863deb5388e6ac906aadddf414026a64cd4fc4ca23a02df9e8b9797833952021-06-16 12:45:253 days 1 hr ago0xbf0d29beb8485746c9a9a5df83da9af4d1c492ca IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.25 BNB0.00171589
0x915d2c8536760de2b09ca6fe0b39de97fd0dfa7332bd7f97d3964cb4197dfa4197750752021-06-16 5:49:113 days 8 hrs ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.99480714 BNB0.00156589
0xb5967273137abace5c21edb1dffe5b0306590a40a5219428f1345fba84525f8f97656912021-06-15 21:59:593 days 16 hrs ago0xe3177a2a1db9d75919182f828803db7151c86bed IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.5 BNB0.00171589
0x16d2c16ad7095ce0c4f2b191b772e078887f8fb56171e2f8ef4098328b1abe0397346972021-06-14 20:10:164 days 18 hrs ago0xe4b51132f34895c77ae087900df494809d4b4f81 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b241.9910058 BNB0.00171589
0x238ec7c60147f01c25190c08c19997f62b21296c9d39ba2f7afad7d02bc40e5b97324922021-06-14 18:20:014 days 20 hrs ago0x7daf7c4b04433c8d6c14fc31c8e6c25ab9342c68 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.5 BNB0.00156589
0xb00ddc5396779fc03571fd09558895a3104e9231efb065786f2b6c51eec4bdf697322502021-06-14 18:07:554 days 20 hrs ago0x7daf7c4b04433c8d6c14fc31c8e6c25ab9342c68 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.5 BNB0.00171589
0x7c8969a1a2bd50f05cd1144a09eb6142efd33caff7027e45f0d31eb8d8d08b5e97280952021-06-14 14:40:105 days 4 mins ago0x34cae6a1530eb2e07d190e123448b1b8a4f5b32b IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b244.192102905800797 BNB0.00246649
0x430aaf94306357b594d05a3f8eefca0107dc3d81cab5fcc2c0e429cd5a3d74b297280062021-06-14 14:35:435 days 9 mins ago0x34cae6a1530eb2e07d190e123448b1b8a4f5b32b IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b243.791512744199202 BNB0.00171594
0x4a0b5f39e34ab7b0648d18f52c60440f2dd8d77b7f9ea256ac2fce4264d8d21a97132782021-06-14 2:19:195 days 12 hrs ago0x44ee523f9daa446c7045797f04c978496f9d7592 IN  0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240.054223372991227 BNB0.00171584
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd2dd57f385e43dfa30ddafbc63d698b7d181baed179b85f98751bc768280fbb198663422021-06-19 9:52:464 hrs 52 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0xd2dd57f385e43dfa30ddafbc63d698b7d181baed179b85f98751bc768280fbb198663422021-06-19 9:52:464 hrs 52 mins ago 0x635f1b8c937e328a5715e7630521abd3192dbdb3 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x48f354365a5512d523d1ab6f8c9f851d24a5e2c20 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0.100142587253171902 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x5f20559235479f5b6abb40dfc6f55185b74e7b550 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0xbf2167ef297708dd3c3eaae4b28ff2f779672435476c797c4dc90fc6055edac298663222021-06-19 9:51:464 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xcc8b849f5f18bb79af3af5b29f91be38675e20a80 BNB
0xcd3e16d8684ea95efb8cae9b7c771d3e451ccd4ff4966b5301298aac4e1f621398662852021-06-19 9:49:554 hrs 55 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0xcd3e16d8684ea95efb8cae9b7c771d3e451ccd4ff4966b5301298aac4e1f621398662852021-06-19 9:49:554 hrs 55 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0 BNB
0xcd3e16d8684ea95efb8cae9b7c771d3e451ccd4ff4966b5301298aac4e1f621398662852021-06-19 9:49:554 hrs 55 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0.1 BNB
0xcd3e16d8684ea95efb8cae9b7c771d3e451ccd4ff4966b5301298aac4e1f621398662852021-06-19 9:49:554 hrs 55 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0xbef3de4adae82e599f90866ae0f92078eb3d87ea3dc1a6243c629061b803ba2d98577102021-06-19 2:41:1012 hrs 3 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x7496bfbdf1b26eff11b9311900ab5cc0fee4c16c0 BNB
0xbef3de4adae82e599f90866ae0f92078eb3d87ea3dc1a6243c629061b803ba2d98577102021-06-19 2:41:1012 hrs 3 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0 BNB
0xbef3de4adae82e599f90866ae0f92078eb3d87ea3dc1a6243c629061b803ba2d98577102021-06-19 2:41:1012 hrs 3 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0.1 BNB
0xbef3de4adae82e599f90866ae0f92078eb3d87ea3dc1a6243c629061b803ba2d98577102021-06-19 2:41:1012 hrs 3 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x7496bfbdf1b26eff11b9311900ab5cc0fee4c16c0 BNB
0x3d92500653e17b6927a418afb4e4671ea8bc3c347293bf37d9a5ea8191fdc73798501452021-06-18 20:22:5518 hrs 22 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0x3d92500653e17b6927a418afb4e4671ea8bc3c347293bf37d9a5ea8191fdc73798501452021-06-18 20:22:5518 hrs 22 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0 BNB
0x3d92500653e17b6927a418afb4e4671ea8bc3c347293bf37d9a5ea8191fdc73798501452021-06-18 20:22:5518 hrs 22 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0xa2ca18fc541b7b101c64e64bbc2834b05066248b0.5 BNB
0x3d92500653e17b6927a418afb4e4671ea8bc3c347293bf37d9a5ea8191fdc73798501452021-06-18 20:22:5518 hrs 22 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0x96ac7eca34ebeb12d2404ee4f273664c32d2663eb09aaec04e06eeb9ef35533898471152021-06-18 17:51:2520 hrs 53 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x016aaece9c13f09ad8fad1a104266795df97d3a70 BNB
0x96ac7eca34ebeb12d2404ee4f273664c32d2663eb09aaec04e06eeb9ef35533898471152021-06-18 17:51:2520 hrs 53 mins ago 0x635f1b8c937e328a5715e7630521abd3192dbdb3 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240 BNB
0x6ca02c05e44a3e6f633eb556d41e7f23a8f80469c71f8a773f48c0b33f7d6cdd98467762021-06-18 17:34:2821 hrs 10 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b24 0x48f354365a5512d523d1ab6f8c9f851d24a5e2c20 BNB
0x6ca02c05e44a3e6f633eb556d41e7f23a8f80469c71f8a773f48c0b33f7d6cdd98467762021-06-18 17:34:2821 hrs 10 mins ago 0x2c6cf65f3cd32a9be1822855abf2321f6f8f6b240x7daf7c4b04433c8d6c14fc31c8e6c25ab9342c681 wei
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NimbusRouter

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-09
*/

pragma solidity =0.8.0;

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

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

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

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

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

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 safeTransferBNB(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: BNB_TRANSFER_FAILED');
    }
}

interface INimbusRouter01 {
    function factory() external view returns (address);
    function NBU_WBNB() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountBNB, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityBNB(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountBNB);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityBNBWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountBNB);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactBNB(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForBNB(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapBNBForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

interface INimbusRouter is INimbusRouter01 {
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external returns (uint amountBNB);
    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountBNB);

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

library NimbusLibrary {
    // 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, 'NimbusLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'NimbusLibrary: ZERO_ADDRESS');
    }

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

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

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

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

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

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

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

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

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

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

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

interface ILPRewards {
    function recordAddLiquidity(address user, address pair, uint amountA, uint amountB, uint liquidity) external;
    function recordRemoveLiquidity(address user, address tokenA, address tokenB, uint amountA, uint amountB, uint liquidity) external;
}

contract NimbusRouter is INimbusRouter {
    address public immutable override factory;
    address public immutable override NBU_WBNB;
    ILPRewards public immutable lpRewards;

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

    constructor(address _factory, address _NBU_WBNB, address _lpRewards) {
        require(_factory != address(0) && _NBU_WBNB != address(0) && _lpRewards != address(0), "NimbusRouter: Zero address(es)");
        factory = _factory;
        NBU_WBNB = _NBU_WBNB;
        lpRewards = ILPRewards(_lpRewards);
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (INimbusFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            INimbusFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = NimbusLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = NimbusLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'NimbusRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = NimbusLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'NimbusRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = NimbusLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = INimbusPair(pair).mint(to);
        lpRewards.recordAddLiquidity(to, pair, amountA, amountB, liquidity);
    }
    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountBNB, uint liquidity) {
        (amountToken, amountBNB) = _addLiquidity(
            token,
            NBU_WBNB,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountBNBMin
        );
        address pair = NimbusLibrary.pairFor(factory, token, NBU_WBNB);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        INBU_WBNB(NBU_WBNB).deposit{value: amountBNB}();
        assert(INBU_WBNB(NBU_WBNB).transfer(pair, amountBNB));
        liquidity = INimbusPair(pair).mint(to);
        // refund dust bnb, if any
        if (msg.value > amountBNB) TransferHelper.safeTransferBNB(msg.sender, msg.value - amountBNB);
        lpRewards.recordAddLiquidity(to, pair, amountBNB, amountToken, liquidity);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        {
        address pair = NimbusLibrary.pairFor(factory, tokenA, tokenB);
        require(INimbusPair(pair).transferFrom(msg.sender, pair, liquidity), "NimbusRouter: Error on transfering"); // send liquidity to pair
        (uint amount0, uint amount1) = INimbusPair(pair).burn(to);
        (address token0,) = NimbusLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'NimbusRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'NimbusRouter: INSUFFICIENT_B_AMOUNT');
        }
        lpRewards.recordRemoveLiquidity(to, tokenA, tokenB, amountA, amountB, liquidity);
    }
    function removeLiquidityBNB(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountBNB) {
        (amountToken, amountBNB) = removeLiquidity(
            token,
            NBU_WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        INBU_WBNB(NBU_WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = NimbusLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? type(uint256).max : liquidity;
        INimbusPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityBNBWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountBNB) {
        address pair = NimbusLibrary.pairFor(factory, token, NBU_WBNB);
        uint value = approveMax ? type(uint256).max : liquidity;
        INimbusPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountBNB) = removeLiquidityBNB(token, liquidity, amountTokenMin, amountBNBMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountBNB) {
        (, amountBNB) = removeLiquidity(
            token,
            NBU_WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IBEP20(token).balanceOf(address(this)));
        INBU_WBNB(NBU_WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }
    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountBNBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountBNB) {
        address pair = NimbusLibrary.pairFor(factory, token, NBU_WBNB);
        uint value = approveMax ? type(uint256).max : liquidity;
        INimbusPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountBNB = removeLiquidityBNBSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountBNBMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = NimbusLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? NimbusLibrary.pairFor(factory, output, path[i + 2]) : _to;
            INimbusPair(NimbusLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = NimbusLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NimbusRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = NimbusLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'NimbusRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == NBU_WBNB, 'NimbusRouter: INVALID_PATH');
        amounts = NimbusLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NimbusRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        INBU_WBNB(NBU_WBNB).deposit{value: amounts[0]}();
        assert(INBU_WBNB(NBU_WBNB).transfer(NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactBNB(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == NBU_WBNB, 'NimbusRouter: INVALID_PATH');
        amounts = NimbusLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'NimbusRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        INBU_WBNB(NBU_WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForBNB(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == NBU_WBNB, 'NimbusRouter: INVALID_PATH');
        amounts = NimbusLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'NimbusRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        INBU_WBNB(NBU_WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }
    function swapBNBForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == NBU_WBNB, 'NimbusRouter: INVALID_PATH');
        amounts = NimbusLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'NimbusRouter: EXCESSIVE_INPUT_AMOUNT');
        INBU_WBNB(NBU_WBNB).deposit{value: amounts[0]}();
        assert(INBU_WBNB(NBU_WBNB).transfer(NimbusLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust bnb, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferBNB(msg.sender, msg.value - amounts[0]);
    }

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

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

    function pairFor(address tokenA, address tokenB) external view returns (address) {
        return NimbusLibrary.pairFor(factory, tokenA, tokenB);
    }

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_NBU_WBNB","type":"address"},{"internalType":"address","name":"_lpRewards","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NBU_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":"amountBNBMin","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":"amountBNB","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":[],"name":"lpRewards","outputs":[{"internalType":"contract ILPRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","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":"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":"amountBNBMin","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":"amountBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNBSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","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":"amountBNB","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":"amountBNBMin","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":"removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"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":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactBNBForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"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":"swapExactTokensForBNBSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"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"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162005e3e38038062005e3e8339810160408190526200003491620000d7565b6001600160a01b038316158015906200005557506001600160a01b03821615155b80156200006a57506001600160a01b03811615155b620000925760405162461bcd60e51b8152600401620000899062000120565b60405180910390fd5b6001600160601b0319606093841b811660805291831b821660a05290911b1660c05262000157565b80516001600160a01b0381168114620000d257600080fd5b919050565b600080600060608486031215620000ec578283fd5b620000f784620000ba565b92506200010760208501620000ba565b91506200011760408501620000ba565b90509250925092565b6020808252601e908201527f4e696d627573526f757465723a205a65726f2061646472657373286573290000604082015260600190565b60805160601c60a05160601c60c05160601c615b26620003186000396000818161056c0152818161273d0152818161301801526133d80152600081816101c20152818161070b01528181610b2b01528181610c0301528181610c840152818161135801528181611582015281816116d90152818161181f015281816119cd01528181611a8f01528181611e840152818161203e015281816121000152818161230b015281816124240152818161288001528181612a0001528181612afe01528181612bc301528181612da701528181612e1d015281816130dd0152818161313301528181613167015281816132200152613457015260008181610595015281816105cc015281816106e9015281816108610152818161099b01528181610cc3015281816110f101528181611422015281816116b7015281816118f501528181611ace01528181611d4201528181611e1f01528181611f5a0152818161213f015281816124da015281816127df0152818161280801528181612c8d01528181612ef40152818161311101528181613d2801528181613d9f01528181613f4401528181614167015281816146c3015281816147b8015261484b0152615b266000f3fe6080604052600436106101a55760003560e01c806396ed28f9116100e1578063d06ca61f1161008a578063e058848811610064578063e0588488146104de578063e8e33700146104fe578063eaaed4421461052d578063f93cce241461054057610218565b8063d06ca61f1461047e578063d46d2f831461049e578063d67b571e146104be57610218565b8063b7e65949116100bb578063b7e6594914610429578063baa2abde14610449578063c45a01551461046957610218565b806396ed28f9146103d65780639cf68911146103f6578063ad615dec1461040957610218565b806350e27df31161014e578063685a0a3411610128578063685a0a34146103635780638332a9631461038357806385f8c259146103965780638803dbee146103b657610218565b806350e27df3146103105780635c11d795146103235780635d616c5b1461034357610218565b80632195995c1161017f5780632195995c146102a257806334a0772d146102d057806338ed1739146102f057610218565b8063054d50d41461021d5780630c762141146102535780631f00ca741461027557610218565b36610218573373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610216577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b005b600080fd5b34801561022957600080fd5b5061023d610238366004615051565b610555565b60405161024a9190615877565b60405180910390f35b34801561025f57600080fd5b5061026861056a565b60405161024a9190615153565b34801561028157600080fd5b50610295610290366004614ef0565b61058e565b60405161024a91906152c4565b3480156102ae57600080fd5b506102c26102bd366004614bf3565b6105c2565b60405161024a929190615880565b3480156102dc57600080fd5b506102c26102eb366004614d74565b6106df565b3480156102fc57600080fd5b5061029561030b366004614fe0565b610816565b61021661031e366004614e8b565b610aee565b34801561032f57600080fd5b5061021661033e366004614fe0565b61105e565b34801561034f57600080fd5b5061029561035e366004614fe0565b611304565b34801561036f57600080fd5b5061023d61037e366004614d74565b6116af565b610295610391366004614e8b565b6117e0565b3480156103a257600080fd5b5061023d6103b1366004615051565b611cf3565b3480156103c257600080fd5b506102956103d1366004614fe0565b611d00565b3480156103e257600080fd5b506102686103f1366004614b4a565b611e18565b610295610404366004614e8b565b611e45565b34801561041557600080fd5b5061023d610424366004615051565b6122bb565b34801561043557600080fd5b5061023d610444366004614d17565b6122c8565b34801561045557600080fd5b506102c2610464366004614b82565b612495565b34801561047557600080fd5b506102686127dd565b34801561048a57600080fd5b50610295610499366004614ef0565b612801565b3480156104aa57600080fd5b506102166104b9366004614fe0565b61282e565b3480156104ca57600080fd5b506102956104d9366004614fe0565b612b6f565b3480156104ea57600080fd5b506102c26104f9366004614d17565b612d63565b34801561050a57600080fd5b5061051e610519366004614c9c565b612e9a565b60405161024a9392919061590a565b61051e61053b366004614d17565b613097565b34801561054c57600080fd5b50610268613455565b6000610562848484613479565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606105bb7f00000000000000000000000000000000000000000000000000000000000000008484613548565b9392505050565b60008060006105f27f00000000000000000000000000000000000000000000000000000000000000008f8f6137b2565b9050600087610601578c610623565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf90610684903390309086908f908e908e908e90600401615250565b600060405180830381600087803b15801561069e57600080fd5b505af11580156106b2573d6000803e3d6000fd5b505050506106c58f8f8f8f8f8f8f612495565b809450819550505050509b509b9950505050505050505050565b600080600061072f7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006137b2565b905060008761073e578c610760565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf906107c1903390309086908f908e908e908e90600401615250565b600060405180830381600087803b1580156107db57600080fd5b505af11580156107ef573d6000803e3d6000fd5b505050506108018e8e8e8e8e8e612d63565b909f909e509c50505050505050505050505050565b6060814281101561085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b60405180910390fd5b6108ba7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384092505050565b91508682600184516108cc91906159ae565b81518110610903577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511015610943576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061581a565b610aa486866000818110610980577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906109959190614b12565b33610a5d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106109f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610a099190614b12565b8b8b6001818110610a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610a589190614b12565b6137b2565b85600081518110610a97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613a8a565b610ae382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613bb6915050565b509695505050505050565b8042811015610b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1685856000818110610b9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610baf9190614b12565b73ffffffffffffffffffffffffffffffffffffffff1614610bfc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c6957600080fd5b505af1158015610c7d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d6b7f000000000000000000000000000000000000000000000000000000000000000089896000818110610d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610d319190614b12565b8a8a6001818110610a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b836040518363ffffffff1660e01b8152600401610d8992919061529e565b602060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb9190614e09565b610e0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008686610e1d6001826159ae565b818110610e53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610e689190614b12565b73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401610ea09190615153565b60206040518083038186803b158015610eb857600080fd5b505afa158015610ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef09190614e73565b9050610f30878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613e81915050565b87818888610f3f6001826159ae565b818110610f75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f8a9190614b12565b73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401610fc29190615153565b60206040518083038186803b158015610fda57600080fd5b505afa158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110129190614e73565b61101c91906159ae565b1015611054576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061581a565b5050505050505050565b8042811015611099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b611150858560008181106110d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906110eb9190614b12565b3361114a7f000000000000000000000000000000000000000000000000000000000000000089896000818110610d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8a613a8a565b6000858561115f6001826159ae565b818110611195577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906111aa9190614b12565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016111e29190615153565b60206040518083038186803b1580156111fa57600080fd5b505afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112329190614e73565b9050611272868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613e81915050565b868187876112816001826159ae565b8181106112b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906112cc9190614b12565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610fc29190615153565b60608142811015611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866113856001826159ae565b8181106113bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906113d09190614b12565b73ffffffffffffffffffffffffffffffffffffffff161461141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b61147b7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384092505050565b915086826001845161148d91906159ae565b815181106114c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511015611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061581a565b61154186866000818110610980577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61158082878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613bb6915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d83600185516115cb91906159ae565b81518110611602577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116269190615877565b600060405180830381600087803b15801561164057600080fd5b505af1158015611654573d6000803e3d6000fd5b50505050610ae384836001855161166b91906159ae565b815181106116a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161424e565b6000806116fd7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006137b2565b905060008661170c578b61172e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9061178f903390309086908e908d908d908d90600401615250565b600060405180830381600087803b1580156117a957600080fd5b505af11580156117bd573d6000803e3d6000fd5b505050506117cf8d8d8d8d8d8d6122c8565b9d9c50505050505050505050505050565b6060814281101561181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061188e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906118a39190614b12565b73ffffffffffffffffffffffffffffffffffffffff16146118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b61194e7f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354892505050565b9150348260008151811061198b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015111156119cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906154c4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a7457600080fd5b505af1158015611a88573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b277f000000000000000000000000000000000000000000000000000000000000000089896000818110610d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b84600081518110611b61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611b8692919061529e565b602060405180830381600087803b158015611ba057600080fd5b505af1158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd89190614e09565b611c0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b611c4a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613bb6915050565b81600081518110611c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151341115611ce957611ce93383600081518110611cd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015134611ce491906159ae565b61424e565b5095945050505050565b6000610562848484614302565b60608142811015611d3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b611d9b7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354892505050565b91508682600081518110611dd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511115610943576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906154c4565b60006105bb7f000000000000000000000000000000000000000000000000000000000000000084846137b2565b60608142811015611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110611ef3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f089190614b12565b73ffffffffffffffffffffffffffffffffffffffff1614611f55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b611fb37f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384092505050565b9150868260018451611fc591906159ae565b81518110611ffc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151101561203c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061581a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106120b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120e557600080fd5b505af11580156120f9573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6121987f000000000000000000000000000000000000000000000000000000000000000089896000818110610d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b846000815181106121d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016121f792919061529e565b602060405180830381600087803b15801561221157600080fd5b505af1158015612225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122499190614e09565b61227c577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b611ce982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613bb6915050565b60006105628484846143d6565b60008142811015612305576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b612334887f00000000000000000000000000000000000000000000000000000000000000008989893089612495565b6040517f70a082310000000000000000000000000000000000000000000000000000000081529093506123e791508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190612392903090600401615153565b60206040518083038186803b1580156123aa57600080fd5b505afa1580156123be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e29190614e73565b61446c565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612459908590600401615877565b600060405180830381600087803b15801561247357600080fd5b505af1158015612487573d6000803e3d6000fd5b50505050610ae3848361424e565b60008082428110156124d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b60006125007f00000000000000000000000000000000000000000000000000000000000000008c8c6137b2565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906323b872dd9061255990339085908e906004016151e1565b602060405180830381600087803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ab9190614e09565b6125e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615308565b6000808273ffffffffffffffffffffffffffffffffffffffff166389afcb44896040518263ffffffff1660e01b815260040161261d9190615153565b6040805180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e9190614fbd565b91509150600061267e8e8e614595565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146126bb5781836126be565b82825b90975095508a8710156126fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615703565b89861015612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615521565b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fd7271ae868c8c87878e6040518763ffffffff1660e01b815260040161279e9695949392919061519b565b600060405180830381600087803b1580156127b857600080fd5b505af11580156127cc573d6000803e3d6000fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606105bb7f00000000000000000000000000000000000000000000000000000000000000008484613840565b8042811015612869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856128ad6001826159ae565b8181106128e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906128f89190614b12565b73ffffffffffffffffffffffffffffffffffffffff1614612945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b612982858560008181106110d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6129c0858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613e81915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612a35903090600401615153565b60206040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a859190614e73565b905086811015612ac1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061581a565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612b33908490600401615877565b600060405180830381600087803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b50505050611054848261424e565b60608142811015612bac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168686612bf06001826159ae565b818110612c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190612c3b9190614b12565b73ffffffffffffffffffffffffffffffffffffffff1614612c88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061539c565b612ce67f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354892505050565b91508682600081518110612d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511115611504576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906154c4565b6000808242811015612da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b612dd0897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612495565b9093509150612de089868561446c565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90612e52908590600401615877565b600060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b50505050612e8e858361424e565b50965096945050505050565b60008060008342811015612eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b612ee88c8c8c8c8c8c614694565b90945092506000612f1a7f00000000000000000000000000000000000000000000000000000000000000008e8e6137b2565b9050612f288d338388613a8a565b612f348c338387613a8a565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290612f86908a90600401615153565b602060405180830381600087803b158015612fa057600080fd5b505af1158015612fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd89190614e73565b6040517f7700964e00000000000000000000000000000000000000000000000000000000815290935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637700964e90613055908a9085908a908a908a90600401615212565b600060405180830381600087803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050505050985098509895505050505050565b600080600083428110156130d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615612565b6131058a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614694565b909450925060006131577f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006137b2565b90506131658b338388613a8a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156131cd57600080fd5b505af11580156131e1573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925061325a91508490889060040161529e565b602060405180830381600087803b15801561327457600080fd5b505af1158015613288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ac9190614e09565b6132df577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290613331908a90600401615153565b602060405180830381600087803b15801561334b57600080fd5b505af115801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133839190614e73565b92508334111561339b5761339b33611ce486346159ae565b6040517f7700964e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637700964e90613415908a90859089908b908a90600401615212565b600060405180830381600087803b15801561342f57600080fd5b505af1158015613443573d6000803e3d6000fd5b50505050505096509650969350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008084116134b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615649565b6000831180156134c45750600082115b6134fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906153d3565b6000613508856103e5615971565b905060006135168483615971565b9050600082613527876103e8615971565b6135319190615920565b905061353d8183615938565b979650505050505050565b6060600282511015613586576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906155db565b815167ffffffffffffffff8111156135c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156135f0578160200160208202803683370190505b50905082816001835161360391906159ae565b8151811061363a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060006001835161365691906159ae565b90505b80156137aa576000806136f787866136726001876159ae565b815181106136a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518786815181106136ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151614983565b91509150613746848481518110613737577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518383614302565b846137526001866159ae565b81518110613789577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050505080806137a2906159f1565b915050613659565b509392505050565b60008060006137c18585614595565b915091508582826040516020016137d992919061507c565b604051602081830303815290604052805190602001206040516020016138009291906150d2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b606060028251101561387e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906155db565b815167ffffffffffffffff8111156138bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156138e8578160200160208202803683370190505b5090508281600081518110613926577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b6001835161394391906159ae565b8110156137aa576000806139d78786858151811061398a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151878660016139a09190615920565b815181106136ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91509150613a26848481518110613a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518383613479565b84613a32856001615920565b81518110613a69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505050508080613a8290615a26565b915050613935565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401613abe939291906151e1565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613b0c91906150b6565b6000604051808303816000865af19150503d8060008114613b49576040519150601f19603f3d011682016040523d82523d6000602084013e613b4e565b606091505b5091509150818015613b78575080511580613b78575080806020019051810190613b789190614e09565b613bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906157bd565b505050505050565b60005b60018351613bc791906159ae565b811015613e7b57600080848381518110613c0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185846001613c209190615920565b81518110613c57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151915091506000613c6f8383614595565b509050600087613c80866001615920565b81518110613cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613cff57826000613d03565b6000835b91509150600060028a51613d1791906159ae565b8810613d235788613d98565b613d987f0000000000000000000000000000000000000000000000000000000000000000878c613d548c6002615920565b81518110613d8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516137b2565b9050613dc57f000000000000000000000000000000000000000000000000000000000000000088886137b2565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e0f576020820181803683370190505b506040518563ffffffff1660e01b8152600401613e2f949392919061588e565b600060405180830381600087803b158015613e4957600080fd5b505af1158015613e5d573d6000803e3d6000fd5b50505050505050505050508080613e7390615a26565b915050613bb9565b50505050565b60005b60018351613e9291906159ae565b81101561424957600080848381518110613ed5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185846001613eeb9190615920565b81518110613f22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151915091506000613f3a8383614595565b5090506000613f6a7f000000000000000000000000000000000000000000000000000000000000000085856137b2565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613fb857600080fd5b505afa158015613fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff09190614e25565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614614052578284614055565b83835b91509150818a73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b81526004016140939190615153565b60206040518083038186803b1580156140ab57600080fd5b505afa1580156140bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e39190614e73565b6140ed91906159ae565b95506140fa868383613479565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461413e57826000614142565b6000835b91509150600060028c5161415691906159ae565b8a10614162578a614193565b6141937f0000000000000000000000000000000000000000000000000000000000000000898e613d548e6002615920565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906141fb908690869086906024810161588e565b600060405180830381600087803b15801561421557600080fd5b505af1158015614229573d6000803e3d6000fd5b50505050505050505050505050808061424190615a26565b915050613e84565b505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161428591906150b6565b60006040518083038185875af1925050503d80600081146142c2576040519150601f19603f3d011682016040523d82523d6000602084013e6142c7565b606091505b5050905080614249576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906156a6565b600080841161433d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061557e565b60008311801561434d5750600082115b614383576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906153d3565b600061438f8585615971565b61439b906103e8615971565b905060006143a986856159ae565b6143b5906103e5615971565b90506143c18183615938565b6143cc906001615920565b9695505050505050565b6000808411614411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615760565b6000831180156144215750600082115b614457576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610853906153d3565b826144628386615971565b6105629190615938565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161449e92919061529e565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516144ec91906150b6565b6000604051808303816000865af19150503d8060008114614529576040519150601f19603f3d011682016040523d82523d6000602084013e61452e565b606091505b50915091508180156145585750805115806145585750808060200190518101906145589190614e09565b61458e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615365565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156145fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615430565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061463857828461463b565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661468d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061548d565b9250929050565b6040517fe6a43905000000000000000000000000000000000000000000000000000000008152600090819081907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e6a439059061470f908c908c90600401615174565b60206040518083038186803b15801561472757600080fd5b505afa15801561473b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061475f9190614b2e565b73ffffffffffffffffffffffffffffffffffffffff161415614843576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906147ef908b908b90600401615174565b602060405180830381600087803b15801561480957600080fd5b505af115801561481d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148419190614b2e565b505b6000806148717f00000000000000000000000000000000000000000000000000000000000000008b8b614983565b91509150816000148015614883575080155b1561489357879350869250614976565b60006148a08984846143d6565b90508781116148ee57858110156148e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615521565b889450925082614974565b60006148fb8984866143d6565b905089811115614934577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b8781101561496e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390615703565b94508793505b505b5050965096945050505050565b60008060006149928585614595565b5090506000806149a38888886137b2565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156149e857600080fd5b505afa1580156149fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a209190614e25565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614a7f578082614a82565b81815b90999098509650505050505050565b8035614a9c81615abd565b919050565b60008083601f840112614ab2578081fd5b50813567ffffffffffffffff811115614ac9578182fd5b602083019150836020808302850101111561468d57600080fd5b80516dffffffffffffffffffffffffffff81168114614a9c57600080fd5b803560ff81168114614a9c57600080fd5b600060208284031215614b23578081fd5b81356105bb81615abd565b600060208284031215614b3f578081fd5b81516105bb81615abd565b60008060408385031215614b5c578081fd5b8235614b6781615abd565b91506020830135614b7781615abd565b809150509250929050565b600080600080600080600060e0888a031215614b9c578283fd5b8735614ba781615abd565b96506020880135614bb781615abd565b955060408801359450606088013593506080880135925060a0880135614bdc81615abd565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215614c14578384fd5b8b35614c1f81615abd565b9a5060208c0135614c2f81615abd565b995060408c0135985060608c0135975060808c0135965060a08c0135614c5481615abd565b955060c08c0135945060e08c0135614c6b81615ae2565b9350614c7a6101008d01614b01565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215614cb8578384fd5b8835614cc381615abd565b97506020890135614cd381615abd565b965060408901359550606089013594506080890135935060a0890135925060c0890135614cff81615abd565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215614d2f578384fd5b8635614d3a81615abd565b95506020870135945060408701359350606087013592506080870135614d5f81615abd565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215614d93578384fd5b8a35614d9e81615abd565b995060208b0135985060408b0135975060608b0135965060808b0135614dc381615abd565b955060a08b0135945060c08b0135614dda81615ae2565b9350614de860e08c01614b01565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614e1a578081fd5b81516105bb81615ae2565b600080600060608486031215614e39578081fd5b614e4284614ae3565b9250614e5060208501614ae3565b9150604084015163ffffffff81168114614e68578182fd5b809150509250925092565b600060208284031215614e84578081fd5b5051919050565b600080600080600060808688031215614ea2578283fd5b85359450602086013567ffffffffffffffff811115614ebf578384fd5b614ecb88828901614aa1565b9095509350506040860135614edf81615abd565b949793965091946060013592915050565b60008060408385031215614f02578182fd5b8235915060208084013567ffffffffffffffff80821115614f21578384fd5b818601915086601f830112614f34578384fd5b813581811115614f4657614f46615a8e565b83810260405185828201018181108582111715614f6557614f65615a8e565b604052828152858101935084860182860187018b1015614f83578788fd5b8795505b83861015614fac57614f9881614a91565b855260019590950194938601938601614f87565b508096505050505050509250929050565b60008060408385031215614fcf578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614ff8578384fd5b8635955060208701359450604087013567ffffffffffffffff81111561501c578485fd5b61502889828a01614aa1565b909550935050606087013561503c81615abd565b80925050608087013590509295509295509295565b600080600060608486031215615065578081fd5b505081359360208301359350604090920135919050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b600082516150c88184602087016159c5565b9190910192915050565b7fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fdb30e47fd6e77459fc13f8efdd91fc60b8c891af5954053614d1cc2ca3514ac1603582015260550190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff958616815293909416602084015260408301919091526060820152608081019190915260a00190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156152fc578351835292840192918401916001016152e0565b50909695505050505050565b60208082526022908201527f4e696d627573526f757465723a204572726f72206f6e207472616e736665726960408201527f6e67000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b6020808252601a908201527f4e696d627573526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b60208082526025908201527f4e696d6275734c6962726172793a20494e53554646494349454e545f4c49515560408201527f4944495459000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4e696d6275734c6962726172793a204944454e544943414c5f4144445245535360408201527f4553000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4e696d6275734c6962726172793a205a45524f5f414444524553530000000000604082015260600190565b60208082526024908201527f4e696d627573526f757465723a204558434553534956455f494e5055545f414d60408201527f4f554e5400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f4e696d627573526f757465723a20494e53554646494349454e545f425f414d4f60408201527f554e540000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4e696d6275734c6962726172793a20494e53554646494349454e545f4f55545060408201527f55545f414d4f554e540000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4e696d6275734c6962726172793a20494e56414c49445f504154480000000000604082015260600190565b60208082526015908201527f4e696d627573526f757465723a20455850495245440000000000000000000000604082015260600190565b60208082526028908201527f4e696d6275734c6962726172793a20494e53554646494349454e545f494e505560408201527f545f414d4f554e54000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a20424e425f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f4e696d627573526f757465723a20494e53554646494349454e545f415f414d4f60408201527f554e540000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4e696d6275734c6962726172793a20494e53554646494349454e545f414d4f5560408201527f4e54000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160408201527f494c454400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4e696d627573526f757465723a20494e53554646494349454e545f4f5554505560408201527f545f414d4f554e54000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff841660408301526080606083015282518060808401526158d58160a08501602087016159c5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b9283526020830191909152604082015260600190565b6000821982111561593357615933615a5f565b500190565b60008261596c577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156159a9576159a9615a5f565b500290565b6000828210156159c0576159c0615a5f565b500390565b60005b838110156159e05781810151838201526020016159c8565b83811115613e7b5750506000910152565b600081615a0057615a00615a5f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615a5857615a58615a5f565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114615adf57600080fd5b50565b8015158114615adf57600080fdfea2646970667358221220bab737da5d6c50a059c45284320340295803a6ea6ab077a355e80f146ad24ea364736f6c63430008000033000000000000000000000000cc8b849f5f18bb79af3af5b29f91be38675e20a8000000000000000000000000a2ca18fc541b7b101c64e64bbc2834b05066248b00000000000000000000000048f354365a5512d523d1ab6f8c9f851d24a5e2c2

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

000000000000000000000000cc8b849f5f18bb79af3af5b29f91be38675e20a8000000000000000000000000a2ca18fc541b7b101c64e64bbc2834b05066248b00000000000000000000000048f354365a5512d523d1ab6f8c9f851d24a5e2c2

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc8b849f5f18bb79af3af5b29f91be38675e20a8
Arg [1] : 000000000000000000000000a2ca18fc541b7b101c64e64bbc2834b05066248b
Arg [2] : 00000000000000000000000048f354365a5512d523d1ab6f8c9f851d24a5e2c2


Deployed ByteCode Sourcemap

14954:19214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15640:10;:22;15654:8;15640:22;;15633:30;;;;;;;;;;;;14954:19214;;;;;33124:259;;;;;;;;;;-1:-1:-1;33124:259:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15097:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33915:250::-;;;;;;;;;;-1:-1:-1;33915:250:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20784:680::-;;;;;;;;;;-1:-1:-1;20784:680:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21470:676::-;;;;;;;;;;-1:-1:-1;21470:676:0;;;;;:::i;:::-;;:::i;24508:619::-;;;;;;;;;;-1:-1:-1;24508:619:0;;;;;:::i;:::-;;:::i;31012:858::-;;;;;;:::i;:::-;;:::i;30301:705::-;;;;;;;;;;-1:-1:-1;30301:705:0;;;;;:::i;:::-;;:::i;27281:850::-;;;;;;;;;;-1:-1:-1;27281:850:0;;;;;:::i;:::-;;:::i;22943:725::-;;;;;;;;;;-1:-1:-1;22943:725:0;;;;;:::i;:::-;;:::i;28137:818::-;;;;;;:::i;:::-;;:::i;33391:258::-;;;;;;;;;;-1:-1:-1;33391:258:0;;;;;:::i;:::-;;:::i;25133:597::-;;;;;;;;;;-1:-1:-1;25133:597:0;;;;;:::i;:::-;;:::i;32963:153::-;;;;;;;;;;-1:-1:-1;32963:153:0;;;;;:::i;:::-;;:::i;25736:705::-;;;;;;:::i;:::-;;:::i;32770:185::-;;;;;;;;;;-1:-1:-1;32770:185:0;;;;;:::i;:::-;;:::i;22225:712::-;;;;;;;;;;-1:-1:-1;22225:712:0;;;;;:::i;:::-;;:::i;19080:1007::-;;;;;;;;;;-1:-1:-1;19080:1007:0;;;;;:::i;:::-;;:::i;15000:41::-;;;;;;;;;;;;;:::i;33657:250::-;;;;;;;;;;-1:-1:-1;33657:250:0;;;;;:::i;:::-;;:::i;31876:850::-;;;;;;;;;;-1:-1:-1;31876:850:0;;;;;:::i;:::-;;:::i;26447:828::-;;;;;;;;;;-1:-1:-1;26447:828:0;;;;;:::i;:::-;;:::i;20093:685::-;;;;;;;;;;-1:-1:-1;20093:685:0;;;;;:::i;:::-;;:::i;17145:810::-;;;;;;;;;;-1:-1:-1;17145:810:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;17961:1076::-;;;;;;:::i;:::-;;:::i;15048:42::-;;;;;;;;;;;;;:::i;33124:259::-;33277:14;33316:59;33343:8;33353:9;33364:10;33316:26;:59::i;:::-;33309:66;33124:259;-1:-1:-1;;;;33124:259:0:o;15097:37::-;;;:::o;33915:250::-;34059:21;34105:52;34132:7;34141:9;34152:4;34105:26;:52::i;:::-;34098:59;33915:250;-1:-1:-1;;;33915:250:0:o;20784:680::-;21090:12;21104;21129;21144:46;21166:7;21175:6;21183;21144:21;:46::i;:::-;21129:61;;21201:10;21214;:42;;21247:9;21214:42;;;21227:17;21214:42;21267:77;;;;;21201:55;;-1:-1:-1;21267:24:0;;;;;;:77;;21292:10;;21312:4;;21201:55;;21326:8;;21336:1;;21339;;21342;;21267:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:80;21392:6;21400;21408:9;21419:10;21431;21443:2;21447:8;21376:15;:80::i;:::-;21355:101;;;;;;;;20784:680;;;;;;;;;;;;;;;;:::o;21470:676::-;21759:16;21777:14;21804:12;21819:47;21841:7;21850:5;21857:8;21819:21;:47::i;:::-;21804:62;;21877:10;21890;:42;;21923:9;21890:42;;;21903:17;21890:42;21943:77;;;;;21877:55;;-1:-1:-1;21943:24:0;;;;;;:77;;21968:10;;21988:4;;21877:55;;22002:8;;22012:1;;22015;;22018;;21943:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22058:80;22077:5;22084:9;22095:14;22111:12;22125:2;22129:8;22058:18;:80::i;:::-;22031:107;;;;-1:-1:-1;21470:676:0;-1:-1:-1;;;;;;;;;;;;;21470:676:0:o;24508:619::-;24732:21;24713:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;24776:52:::1;24804:7;24813:8;24823:4;;24776:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24776:27:0::1;::::0;-1:-1:-1;;;24776:52:0:i:1;:::-;24766:62;;24878:12;24847:7;24872:1;24855:7;:14;:18;;;;:::i;:::-;24847:27;;;;;;;;;;;;;;;;;;;;;;:43;;24839:96;;;;;;;;;;;;:::i;:::-;24946:138;24992:4;;24997:1;24992:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25001:10;25013:48;25035:7;25044:4;;25049:1;25044:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25053:4;;25058:1;25053:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25013:21;:48::i;:::-;25063:7;25071:1;25063:10;;;;;;;;;;;;;;;;;;;;;;24946:31;:138::i;:::-;25095:24;25101:7;25110:4;;25095:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25116:2:0;;-1:-1:-1;25095:5:0::1;::::0;-1:-1:-1;;25095:24:0:i:1;:::-;24508:619:::0;;;;;;;;;:::o;31012:858::-;31272:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;31317:8:::1;31306:19;;:4;;31311:1;31306:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:19;;;31298:58;;;;;;;;;;;;:::i;:::-;31367:13;31383:9;31367:25;;31413:8;31403:27;;;31438:8;31403:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31477:8;31467:28;;;31496:48;31518:7;31527:4;;31532:1;31527:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31536:4;;31541:1;31536:7;;;;;;;;;;;;;;31496:48;31546:8;31467:88;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31460:96;;;;;;;;;;;;31567:18;31595:4:::0;;31600:15:::1;31614:1;31595:4:::0;31600:15:::1;:::i;:::-;31595:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31588:39;;;31628:2;31588:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31567:64;;31642:44;31677:4;;31642:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31683:2:0;;-1:-1:-1;31642:34:0::1;::::0;-1:-1:-1;;31642:44:0:i:1;:::-;31782:12:::0;31765:13;31726:4;;31731:15:::1;31745:1;31726:4:::0;31731:15:::1;:::i;:::-;31726:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31719:39;;;31759:2;31719:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;31697:165;;;;;;;;;;;;:::i;:::-;15257:1;;31012:858:::0;;;;;;:::o;30301:705::-;30535:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;30556:136:::1;30602:4;;30607:1;30602:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30611:10;30623:48;30645:7;30654:4;;30659:1;30654:7;;;;;;;;;;;;;;30623:48;30673:8;30556:31;:136::i;:::-;30703:18;30731:4:::0;;30736:15:::1;30750:1;30731:4:::0;30736:15:::1;:::i;:::-;30731:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30724:39;;;30764:2;30724:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30703:64;;30778:44;30813:4;;30778:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30819:2:0;;-1:-1:-1;30778:34:0::1;::::0;-1:-1:-1;;30778:44:0:i:1;:::-;30918:12:::0;30901:13;30862:4;;30867:15:::1;30881:1;30862:4:::0;30867:15:::1;:::i;:::-;30862:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30855:39;;;30895:2;30855:43;;;;;;;;;;;;;;;:::i;27281:850::-:0;27495:21;27467:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;27542:33:::1;27567:8;27542:33;:4:::0;;27547:15:::1;27561:1;27542:4:::0;27547:15:::1;:::i;:::-;27542:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;27534:72;;;;;;;;;;;;:::i;:::-;27627:52;27655:7;27664:8;27674:4;;27627:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27627:27:0::1;::::0;-1:-1:-1;;;27627:52:0:i:1;:::-;27617:62;;27729:12;27698:7;27723:1;27706:7;:14;:18;;;;:::i;:::-;27698:27;;;;;;;;;;;;;;;;;;;;;;:43;;27690:96;;;;;;;;;;;;:::i;:::-;27797:138;27843:4;;27848:1;27843:7;;;;;;;;;;;;;;27797:138;27946:35;27952:7;27961:4;;27946:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27975:4:0::1;::::0;-1:-1:-1;27946:5:0::1;::::0;-1:-1:-1;;27946:35:0:i:1;:::-;28002:8;27992:28;;;28021:7;28046:1;28029:7;:14;:18;;;;:::i;:::-;28021:27;;;;;;;;;;;;;;;;;;;;;;27992:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28060:63;28091:2;28095:7;28120:1;28103:7;:14;:18;;;;:::i;:::-;28095:27;;;;;;;;;;;;;;;;;;;;;;28060:30;:63::i;22943:725::-:0;23261:14;23288:12;23303:47;23325:7;23334:5;23341:8;23303:21;:47::i;:::-;23288:62;;23361:10;23374;:42;;23407:9;23374:42;;;23387:17;23374:42;23427:77;;;;;23361:55;;-1:-1:-1;23427:24:0;;;;;;:77;;23452:10;;23472:4;;23361:55;;23486:8;;23496:1;;23499;;23502;;23427:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23527:133;23589:5;23596:9;23607:14;23623:12;23637:2;23641:8;23527:47;:133::i;:::-;23515:145;22943:725;-1:-1:-1;;;;;;;;;;;;;22943:725:0:o;28137:818::-;28350:21;28322:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;28408:8:::1;28397:19;;:4;;28402:1;28397:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:19;;;28389:58;;;;;;;;;;;;:::i;:::-;28468:52;28495:7;28504:9;28515:4;;28468:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28468:26:0::1;::::0;-1:-1:-1;;;28468:52:0:i:1;:::-;28458:62;;28553:9;28539:7;28547:1;28539:10;;;;;;;;;;;;;;;;;;;;;;:23;;28531:72;;;;;;;;;;;;:::i;:::-;28624:8;28614:27;;;28649:7;28657:1;28649:10;;;;;;;;;;;;;;;;;;;;;;28614:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28690:8;28680:28;;;28709:48;28731:7;28740:4;;28745:1;28740:7;;;;;;;;;;;;;;28709:48;28759:7;28767:1;28759:10;;;;;;;;;;;;;;;;;;;;;;28680:90;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28673:98;;;;;;;;;;;;28782:24;28788:7;28797:4;;28782:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28803:2:0;;-1:-1:-1;28782:5:0::1;::::0;-1:-1:-1;;28782:24:0:i:1;:::-;28869:7;28877:1;28869:10;;;;;;;;;;;;;;;;;;;;;;28857:9;:22;28853:94;;;28881:66;28912:10;28936:7;28944:1;28936:10;;;;;;;;;;;;;;;;;;;;;;28924:9;:22;;;;:::i;:::-;28881:30;:66::i;:::-;28137:818:::0;;;;;;;;:::o;33391:258::-;33544:13;33582:59;33608:9;33619;33630:10;33582:25;:59::i;25133:597::-;25357:21;25338:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;25401:52:::1;25428:7;25437:9;25448:4;;25401:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25401:26:0::1;::::0;-1:-1:-1;;;25401:52:0:i:1;:::-;25391:62;;25486:11;25472:7;25480:1;25472:10;;;;;;;;;;;;;;;;;;;;;;:25;;25464:74;;;;;;;;;;;;:::i;32963:153::-:0;33035:7;33062:46;33084:7;33093:6;33101;33062:21;:46::i;25736:705::-;25952:21;25924:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;26010:8:::1;25999:19;;:4;;26004:1;25999:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:19;;;25991:58;;;;;;;;;;;;:::i;:::-;26070:53;26098:7;26107:9;26118:4;;26070:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26070:27:0::1;::::0;-1:-1:-1;;;26070:53:0:i:1;:::-;26060:63;;26173:12;26142:7;26167:1;26150:7;:14;:18;;;;:::i;:::-;26142:27;;;;;;;;;;;;;;;;;;;;;;:43;;26134:96;;;;;;;;;;;;:::i;:::-;26251:8;26241:27;;;26276:7;26284:1;26276:10;;;;;;;;;;;;;;;;;;;;;;26241:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26317:8;26307:28;;;26336:48;26358:7;26367:4;;26372:1;26367:7;;;;;;;;;;;;;;26336:48;26386:7;26394:1;26386:10;;;;;;;;;;;;;;;;;;;;;;26307:90;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26300:98;;;;;;;;;;;;26409:24;26415:7;26424:4;;26409:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26430:2:0;;-1:-1:-1;26409:5:0::1;::::0;-1:-1:-1;;26409:24:0:i:1;32770:185::-:0;32867:12;32899:48;32919:7;32928:8;32938;32899:19;:48::i;22225:712::-;22491:14;22472:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;22534:200:::1;22564:5;22584:8;22607:9;22631:14;22660:12;22695:4;22715:8;22534:15;:200::i;:::-;22784:38;::::0;;;;22518:216;;-1:-1:-1;22745:78:0::1;::::0;-1:-1:-1;22773:5:0;;22780:2;;22784:23:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;22816:4:::1;::::0;22784:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22745:27;:78::i;:::-;22834:39;::::0;;;;:28:::1;22844:8;22834:28;::::0;::::1;::::0;:39:::1;::::0;22863:9;;22834:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22884:45;22915:2;22919:9;22884:30;:45::i;19080:1007::-:0;19334:12;19348;19315:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;19384:12:::1;19399:46;19421:7;19430:6;19438;19399:21;:46::i;:::-;19464:59;::::0;;;;19384:61;;-1:-1:-1;19464:30:0::1;::::0;::::1;::::0;::::1;::::0;:59:::1;::::0;19495:10:::1;::::0;19384:61;;19513:9;;19464:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19456:106;;;;;;;;;;;;:::i;:::-;19600:12;19614::::0;19642:4:::1;19630:22;;;19653:2;19630:26;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19599:57;;;;19668:14;19687:40;19712:6;19720;19687:24;:40::i;:::-;19667:60;;;19769:6;19759:16;;:6;:16;;;:58;;19800:7;19809;19759:58;;;19779:7;19788;19759:58;19738:79:::0;;-1:-1:-1;19738:79:0;-1:-1:-1;19836:21:0;;::::1;;19828:69;;;;;;;;;;;;:::i;:::-;19927:10;19916:7;:21;;19908:69;;;;;;;;;;;;:::i;:::-;15257:1;;;;19999:9;:31;;;20031:2;20035:6;20043;20051:7;20060;20069:9;19999:80;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19080:1007:::0;;;;;;;;;;;:::o;15000:41::-;;;:::o;33657:250::-;33801:21;33847:52;33875:7;33884:8;33894:4;33847:27;:52::i;31876:850::-;32143:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;32177:33:::1;32202:8;32177:33;:4:::0;;32182:15:::1;32196:1;32177:4:::0;32182:15:::1;:::i;:::-;32177:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;32169:72;;;;;;;;;;;;:::i;:::-;32252:136;32298:4;;32303:1;32298:7;;;;;;;;;;;;;;32252:136;32399:55;32434:4;;32399:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32448:4:0::1;::::0;-1:-1:-1;32399:34:0::1;::::0;-1:-1:-1;;32399:55:0:i:1;:::-;32482:41;::::0;;;;32465:14:::1;::::0;32482:26:::1;32489:8;32482:26;::::0;::::1;::::0;:41:::1;::::0;32517:4:::1;::::0;32482:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32465:58;;32555:12;32542:9;:25;;32534:78;;;;;;;;;;;;:::i;:::-;32623:39;::::0;;;;:28:::1;32633:8;32623:28;::::0;::::1;::::0;:39:::1;::::0;32652:9;;32623:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32673:45;32704:2;32708:9;32673:30;:45::i;26447:828::-:0;26661:21;26633:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;26708:33:::1;26733:8;26708:33;:4:::0;;26713:15:::1;26727:1;26708:4:::0;26713:15:::1;:::i;:::-;26708:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;26700:72;;;;;;;;;;;;:::i;:::-;26793:52;26820:7;26829:9;26840:4;;26793:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26793:26:0::1;::::0;-1:-1:-1;;;26793:52:0:i:1;:::-;26783:62;;26878:11;26864:7;26872:1;26864:10;;;;;;;;;;;;;;;;;;;;;;:25;;26856:74;;;;;;;;;;;;:::i;20093:685::-:0;20330:16;20348:14;20311:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;20402:200:::1;20432:5;20452:8;20475:9;20499:14;20528:12;20563:4;20583:8;20402:15;:200::i;:::-;20375:227:::0;;-1:-1:-1;20375:227:0;-1:-1:-1;20613:51:0::1;20641:5:::0;20648:2;20375:227;20613:27:::1;:51::i;:::-;20675:39;::::0;;;;:28:::1;20685:8;20675:28;::::0;::::1;::::0;:39:::1;::::0;20704:9;;20675:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20725:45;20756:2;20760:9;20725:30;:45::i;:::-;20093:685:::0;;;;;;;;;;:::o;17145:810::-;17433:12;17447;17461:14;17414:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;17509:85:::1;17523:6;17531;17539:14;17555;17571:10;17583;17509:13;:85::i;:::-;17488:106:::0;;-1:-1:-1;17488:106:0;-1:-1:-1;17605:12:0::1;17620:46;17642:7;17651:6:::0;17659;17620:21:::1;:46::i;:::-;17605:61;;17677:66;17709:6;17717:10;17729:4;17735:7;17677:31;:66::i;:::-;17754;17786:6;17794:10;17806:4;17812:7;17754:31;:66::i;:::-;17843:26;::::0;;;;:22:::1;::::0;::::1;::::0;::::1;::::0;:26:::1;::::0;17866:2;;17843:26:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17880:67;::::0;;;;17831:38;;-1:-1:-1;17880:28:0::1;:9;:28;::::0;::::1;::::0;:67:::1;::::0;17909:2;;17913:4;;17919:7;;17928;;17831:38;;17880:67:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15257:1;17145:810:::0;;;;;;;;;;;;;:::o;17961:1076::-;18214:16;18232:14;18248;18195:8;15205:15;15193:8;:27;;15185:61;;;;;;;;;;;;:::i;:::-;18302:180:::1;18330:5;18350:8;18373:18;18406:9;18430:14;18459:12;18302:13;:180::i;:::-;18275:207:::0;;-1:-1:-1;18275:207:0;-1:-1:-1;18493:12:0::1;18508:47;18530:7;18539:5:::0;18546:8:::1;18508:21;:47::i;:::-;18493:62;;18566:69;18598:5;18605:10;18617:4;18623:11;18566:31;:69::i;:::-;18656:8;18646:27;;;18681:9;18646:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18711:45:0::1;::::0;;;;:28:::1;18721:8;18711:28;::::0;-1:-1:-1;18711:28:0::1;::::0;-1:-1:-1;18711:45:0::1;::::0;-1:-1:-1;18740:4:0;;18746:9;;18711:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18704:53;;;;;;;;;;;;18780:26;::::0;;;;:22:::1;::::0;::::1;::::0;::::1;::::0;:26:::1;::::0;18803:2;;18780:26:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18768:38;;18869:9;18857;:21;18853:92;;;18880:65;18911:10;18923:21;18935:9:::0;18923::::1;:21;:::i;18880:65::-;18956:73;::::0;;;;:28:::1;:9;:28;::::0;::::1;::::0;:73:::1;::::0;18985:2;;18989:4;;18995:9;;19006:11;;19019:9;;18956:73:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15257:1;17961:1076:::0;;;;;;;;;;;:::o;15048:42::-;;;:::o;11399:499::-;11492:14;11538:1;11527:8;:12;11519:65;;;;;;;;;;;;:::i;:::-;11615:1;11603:9;:13;:31;;;;;11633:1;11620:10;:14;11603:31;11595:81;;;;;;;;;;;;:::i;:::-;11687:20;11710:14;:8;11721:3;11710:14;:::i;:::-;11687:37;-1:-1:-1;11735:14:0;11752:28;11770:10;11687:37;11752:28;:::i;:::-;11735:45;-1:-1:-1;11791:16:0;11829:15;11810:16;:9;11822:4;11810:16;:::i;:::-;:34;;;;:::i;:::-;11791:53;-1:-1:-1;11867:23:0;11791:53;11867:9;:23;:::i;:::-;11855:35;11399:499;-1:-1:-1;;;;;;;11399:499:0:o;13143:529::-;13244:21;13301:1;13286:4;:11;:16;;13278:56;;;;;;;;;;;;:::i;:::-;13366:4;:11;13355:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13355:23:0;;13345:33;;13419:9;13389:7;13414:1;13397:7;:14;:18;;;;:::i;:::-;13389:27;;;;;;;;;;;;;;;;;;;;;:39;;;;;13444:6;13467:1;13453:4;:11;:15;;;;:::i;:::-;13444:24;;13439:226;13470:5;;13439:226;;13498:14;;13533:42;13545:7;13554:4;13559:5;13563:1;13559;:5;:::i;:::-;13554:11;;;;;;;;;;;;;;;;;;;;;;13567:4;13572:1;13567:7;;;;;;;;;;;;;;;;;;;;;;13533:11;:42::i;:::-;13497:78;;;;13607:46;13619:7;13627:1;13619:10;;;;;;;;;;;;;;;;;;;;;;13631:9;13642:10;13607:11;:46::i;:::-;13590:7;13598:5;13602:1;13598;:5;:::i;:::-;13590:14;;;;;;;;;;;;;;;;;;;;;:63;;;;;13439:226;;13477:3;;;;;:::i;:::-;;;;13439:226;;;;13143:529;;;;;:::o;9919:487::-;10008:12;10034:14;10050;10068:26;10079:6;10087;10068:10;:26::i;:::-;10033:61;;;;10204:7;10257:6;10265;10240:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10230:43;;;;;;10143:251;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;10133:262;;10143:251;10133:262;;;;;9919:487;-1:-1:-1;;;;;;9919:487:0:o;12554:508::-;12655:21;12712:1;12697:4;:11;:16;;12689:56;;;;;;;;;;;;:::i;:::-;12777:4;:11;12766:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12766:23:0;;12756:33;;12813:8;12800:7;12808:1;12800:10;;;;;;;;;;;;;;;;;;;;;:21;;;;;12837:6;12832:223;12863:1;12849:4;:11;:15;;;;:::i;:::-;12845:1;:19;12832:223;;;12887:14;12903:15;12922:42;12934:7;12943:4;12948:1;12943:7;;;;;;;;;;;;;;;;;;;;;;12952:4;12957:1;12961;12957:5;;;;:::i;:::-;12952:11;;;;;;;;;;;;;;;12922:42;12886:78;;;;12996:47;13009:7;13017:1;13009:10;;;;;;;;;;;;;;;;;;;;;;13021:9;13032:10;12996:12;:47::i;:::-;12979:7;12987:5;:1;12991;12987:5;:::i;:::-;12979:14;;;;;;;;;;;;;;;;;;;;;:64;;;;;12832:223;;12866:3;;;;;:::i;:::-;;;;12832:223;;1441:402;1620:12;1634:17;1655:5;:10;;1689;1701:4;1707:2;1711:5;1666:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1655:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1619:99;;;;1737:7;:57;;;;-1:-1:-1;1749:11:0;;:16;;:44;;;1780:4;1769:24;;;;;;;;;;;;:::i;:::-;1729:106;;;;;;;;;;;;:::i;:::-;1441:402;;;;;;:::o;23779:723::-;23886:6;23881:614;23912:1;23898:4;:11;:15;;;;:::i;:::-;23894:1;:19;23881:614;;;23936:13;23951:14;23970:4;23975:1;23970:7;;;;;;;;;;;;;;;;;;;;;;23979:4;23984:1;23988;23984:5;;;;:::i;:::-;23979:11;;;;;;;;;;;;;;;;;;;;;;23935:56;;;;24007:14;24026:39;24051:5;24058:6;24026:24;:39::i;:::-;-1:-1:-1;24006:59:0;-1:-1:-1;24080:14:0;24097:7;24105:5;:1;24109;24105:5;:::i;:::-;24097:14;;;;;;;;;;;;;;;;;;;;;;24080:31;;24127:15;24144;24172:6;24163:15;;:5;:15;;;:61;;24205:9;24221:1;24163:61;;;24187:1;24191:9;24163:61;24126:98;;;;24239:10;24270:1;24256:4;:11;:15;;;;:::i;:::-;24252:1;:19;:79;;24328:3;24252:79;;;24274:51;24296:7;24305:6;24313:4;24318:5;:1;24322;24318:5;:::i;:::-;24313:11;;;;;;;;;;;;;;;;;;;;;;24274:21;:51::i;:::-;24239:92;;24358:45;24380:7;24389:5;24396:6;24358:21;:45::i;:::-;24346:63;;;24428:10;24440;24452:2;24466:1;24456:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24456:12:0;;24346:137;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23881:614;;;;;;;23915:3;;;;;:::i;:::-;;;;23881:614;;;;23779:723;;;:::o;29102:1193::-;29215:6;29210:1078;29241:1;29227:4;:11;:15;;;;:::i;:::-;29223:1;:19;29210:1078;;;29265:13;29280:14;29299:4;29304:1;29299:7;;;;;;;;;;;;;;;;;;;;;;29308:4;29313:1;29317;29313:5;;;;:::i;:::-;29308:11;;;;;;;;;;;;;;;;;;;;;;29264:56;;;;29336:14;29355:39;29380:5;29387:6;29355:24;:39::i;:::-;29335:59;;;29409:16;29440:45;29462:7;29471:5;29478:6;29440:21;:45::i;:::-;29409:77;;29501:16;29532:17;29620:13;29635;29653:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29619:52;;;;;;;;;29687:17;29706:18;29737:6;29728:15;;:5;:15;;;:61;;29770:8;29780;29728:61;;;29747:8;29757;29728:61;29686:103;;;;29859:12;29825:5;29818:23;;;29850:4;29818:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;29804:67;;29901:68;29928:11;29941:12;29955:13;29901:26;:68::i;:::-;29886:83;;29210:1078;;;;30000:15;30017;30045:6;30036:15;;:5;:15;;;:67;;30081:12;30100:1;30036:67;;;30060:1;30064:12;30036:67;29999:104;;;;30118:10;30149:1;30135:4;:11;:15;;;;:::i;:::-;30131:1;:19;:79;;30207:3;30131:79;;;30153:51;30175:7;30184:6;30192:4;30197:5;:1;30201;30197:5;:::i;30153:51::-;30263:12;;;30273:1;30263:12;;;;;;;;;30225:51;;;;30118:92;;-1:-1:-1;30225:9:0;;;;;;:51;;30235:10;;30247;;30118:92;;30225:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29210:1078;;;;;;;;;29244:3;;;;;:::i;:::-;;;;29210:1078;;;;29102:1193;;:::o;1851:195::-;1959:12;;;1921;1959;;;;;;;;;1938:7;;;;1952:5;;1938:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1920:52;;;1991:7;1983:55;;;;;;;;;;;;:::i;12019:453::-;12112:13;12158:1;12146:9;:13;12138:67;;;;;;;;;;;;:::i;:::-;12236:1;12224:9;:13;:31;;;;;12254:1;12241:10;:14;12224:31;12216:81;;;;;;;;;;;;:::i;:::-;12308:14;12325:21;12337:9;12325;:21;:::i;:::-;:28;;12349:4;12325:28;:::i;:::-;12308:45;-1:-1:-1;12364:16:0;12384:22;12397:9;12384:10;:22;:::i;:::-;12383:30;;12410:3;12383:30;:::i;:::-;12364:49;-1:-1:-1;12436:23:0;12364:49;12436:9;:23;:::i;:::-;12435:29;;12463:1;12435:29;:::i;:::-;12424:40;12019:453;-1:-1:-1;;;;;;12019:453:0:o;10965:312::-;11047:12;11090:1;11080:7;:11;11072:58;;;;;;;;;;;;:::i;:::-;11160:1;11149:8;:12;:28;;;;;11176:1;11165:8;:12;11149:28;11141:78;;;;;;;;;;;;:::i;:::-;11261:8;11240:18;11250:8;11240:7;:18;:::i;:::-;:29;;;;:::i;1072:361::-;1221:12;1235:17;1256:5;:10;;1290;1302:2;1306:5;1267:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1256:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1220:93;;;;1332:7;:57;;;;-1:-1:-1;1344:11:0;;:16;;:44;;;1375:4;1364:24;;;;;;;;;;;;:::i;:::-;1324:101;;;;;;;;;;;;:::i;:::-;1072:361;;;;;:::o;9484:343::-;9559:14;9575;9620:6;9610:16;;:6;:16;;;;9602:63;;;;;;;;;;;;:::i;:::-;9704:6;9695:15;;:6;:15;;;:53;;9733:6;9741;9695:53;;;9714:6;9722;9695:53;9676:72;;-1:-1:-1;9676:72:0;-1:-1:-1;9767:20:0;;;9759:60;;;;;;;;;;;;:::i;:::-;9484:343;;;;;:::o;15770:1369::-;16083:47;;;;;15988:12;;;;;;16098:7;16083:61;:31;;;;:47;;16115:6;;16123;;16083:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;;16079:144;;;16161:50;;;;;:34;16176:7;16161:34;;;;:50;;16196:6;;16204;;16161:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16079:144;16234:13;16249;16266:50;16292:7;16301:6;16309;16266:25;:50::i;:::-;16233:83;;;;16331:8;16343:1;16331:13;:30;;;;-1:-1:-1;16348:13:0;;16331:30;16327:805;;;16400:14;;-1:-1:-1;16416:14:0;;-1:-1:-1;16327:805:0;;;16464:19;16486:55;16506:14;16522:8;16532;16486:19;:55::i;:::-;16464:77;;16578:14;16560;:32;16556:565;;16639:10;16621:14;:28;;16613:76;;;;;;;;;;;;:::i;:::-;16730:14;;-1:-1:-1;16746:14:0;-1:-1:-1;16746:14:0;16556:565;;;16802:19;16824:55;16844:14;16860:8;16870;16824:19;:55::i;:::-;16802:77;;16923:14;16905;:32;;16898:40;;;;;;;;;;;;16983:10;16965:14;:28;;16957:76;;;;;;;;;;;;:::i;:::-;17074:14;-1:-1:-1;17090:14:0;;-1:-1:-1;16556:565:0;16327:805;;15770:1369;;;;;;;;;;;:::o;10464:388::-;10557:13;10572;10599:14;10618:26;10629:6;10637;10618:10;:26::i;:::-;10598:46;;;10656:13;10671;10701:32;10709:7;10718:6;10726;10701:7;:32::i;:::-;10689:57;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10655:93;;;;;;;;;10792:6;10782:16;;:6;:16;;;:62;;10825:8;10835;10782:62;;;10802:8;10812;10782:62;10759:85;;;;-1:-1:-1;10464:388:0;-1:-1:-1;;;;;;;10464:388:0:o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;:::-;65:87;;;:::o;157:400::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;313:6;305;298:22;257:2;-1:-1:-1;341:20:1;;384:18;373:30;;370:2;;;423:8;413;406:26;370:2;467:4;459:6;455:17;443:29;;530:3;523:4;515;507:6;503:17;495:6;491:30;487:41;484:50;481:2;;;547:1;544;537:12;562:190;643:13;;696:30;685:42;;675:53;;665:2;;742:1;739;732:12;757:158;825:20;;885:4;874:16;;864:27;;854:2;;905:1;902;895:12;920:259;;1032:2;1020:9;1011:7;1007:23;1003:32;1000:2;;;1053:6;1045;1038:22;1000:2;1097:9;1084:23;1116:33;1143:5;1116:33;:::i;1184:263::-;;1307:2;1295:9;1286:7;1282:23;1278:32;1275:2;;;1328:6;1320;1313:22;1275:2;1365:9;1359:16;1384:33;1411:5;1384:33;:::i;1452:402::-;;;1581:2;1569:9;1560:7;1556:23;1552:32;1549:2;;;1602:6;1594;1587:22;1549:2;1646:9;1633:23;1665:33;1692:5;1665:33;:::i;:::-;1717:5;-1:-1:-1;1774:2:1;1759:18;;1746:32;1787:35;1746:32;1787:35;:::i;:::-;1841:7;1831:17;;;1539:315;;;;;:::o;1859:821::-;;;;;;;;2073:3;2061:9;2052:7;2048:23;2044:33;2041:2;;;2095:6;2087;2080:22;2041:2;2139:9;2126:23;2158:33;2185:5;2158:33;:::i;:::-;2210:5;-1:-1:-1;2267:2:1;2252:18;;2239:32;2280:35;2239:32;2280:35;:::i;:::-;2334:7;-1:-1:-1;2388:2:1;2373:18;;2360:32;;-1:-1:-1;2439:2:1;2424:18;;2411:32;;-1:-1:-1;2490:3:1;2475:19;;2462:33;;-1:-1:-1;2547:3:1;2532:19;;2519:33;2561:35;2519:33;2561:35;:::i;:::-;2615:7;2605:17;;;2669:3;2658:9;2654:19;2641:33;2631:43;;2031:649;;;;;;;;;;:::o;2685:1172::-;;;;;;;;;;;;2963:3;2951:9;2942:7;2938:23;2934:33;2931:2;;;2985:6;2977;2970:22;2931:2;3029:9;3016:23;3048:33;3075:5;3048:33;:::i;:::-;3100:5;-1:-1:-1;3157:2:1;3142:18;;3129:32;3170:35;3129:32;3170:35;:::i;:::-;3224:7;-1:-1:-1;3278:2:1;3263:18;;3250:32;;-1:-1:-1;3329:2:1;3314:18;;3301:32;;-1:-1:-1;3380:3:1;3365:19;;3352:33;;-1:-1:-1;3437:3:1;3422:19;;3409:33;3451:35;3409:33;3451:35;:::i;:::-;3505:7;-1:-1:-1;3559:3:1;3544:19;;3531:33;;-1:-1:-1;3616:3:1;3601:19;;3588:33;3630:32;3588:33;3630:32;:::i;:::-;3681:7;-1:-1:-1;3707:39:1;3741:3;3726:19;;3707:39;:::i;:::-;3697:49;;3793:3;3782:9;3778:19;3765:33;3755:43;;3846:3;3835:9;3831:19;3818:33;3807:44;;2921:936;;;;;;;;;;;;;;:::o;3862:890::-;;;;;;;;;4093:3;4081:9;4072:7;4068:23;4064:33;4061:2;;;4115:6;4107;4100:22;4061:2;4159:9;4146:23;4178:33;4205:5;4178:33;:::i;:::-;4230:5;-1:-1:-1;4287:2:1;4272:18;;4259:32;4300:35;4259:32;4300:35;:::i;:::-;4354:7;-1:-1:-1;4408:2:1;4393:18;;4380:32;;-1:-1:-1;4459:2:1;4444:18;;4431:32;;-1:-1:-1;4510:3:1;4495:19;;4482:33;;-1:-1:-1;4562:3:1;4547:19;;4534:33;;-1:-1:-1;4619:3:1;4604:19;;4591:33;4633:35;4591:33;4633:35;:::i;:::-;4687:7;4677:17;;;4741:3;4730:9;4726:19;4713:33;4703:43;;4051:701;;;;;;;;;;;:::o;4757:677::-;;;;;;;4954:3;4942:9;4933:7;4929:23;4925:33;4922:2;;;4976:6;4968;4961:22;4922:2;5020:9;5007:23;5039:33;5066:5;5039:33;:::i;:::-;5091:5;-1:-1:-1;5143:2:1;5128:18;;5115:32;;-1:-1:-1;5194:2:1;5179:18;;5166:32;;-1:-1:-1;5245:2:1;5230:18;;5217:32;;-1:-1:-1;5301:3:1;5286:19;;5273:33;5315:35;5273:33;5315:35;:::i;:::-;5369:7;5359:17;;;5423:3;5412:9;5408:19;5395:33;5385:43;;4912:522;;;;;;;;:::o;5439:1026::-;;;;;;;;;;;5699:3;5687:9;5678:7;5674:23;5670:33;5667:2;;;5721:6;5713;5706:22;5667:2;5765:9;5752:23;5784:33;5811:5;5784:33;:::i;:::-;5836:5;-1:-1:-1;5888:2:1;5873:18;;5860:32;;-1:-1:-1;5939:2:1;5924:18;;5911:32;;-1:-1:-1;5990:2:1;5975:18;;5962:32;;-1:-1:-1;6046:3:1;6031:19;;6018:33;6060:35;6018:33;6060:35;:::i;:::-;6114:7;-1:-1:-1;6168:3:1;6153:19;;6140:33;;-1:-1:-1;6225:3:1;6210:19;;6197:33;6239:32;6197:33;6239:32;:::i;:::-;6290:7;-1:-1:-1;6316:39:1;6350:3;6335:19;;6316:39;:::i;:::-;6306:49;;6402:3;6391:9;6387:19;6374:33;6364:43;;6454:3;6443:9;6439:19;6426:33;6416:43;;5657:808;;;;;;;;;;;;;:::o;6470:257::-;;6590:2;6578:9;6569:7;6565:23;6561:32;6558:2;;;6611:6;6603;6596:22;6558:2;6648:9;6642:16;6667:30;6691:5;6667:30;:::i;6732:474::-;;;;6888:2;6876:9;6867:7;6863:23;6859:32;6856:2;;;6909:6;6901;6894:22;6856:2;6937:42;6969:9;6937:42;:::i;:::-;6927:52;;6998:51;7045:2;7034:9;7030:18;6998:51;:::i;:::-;6988:61;;7092:2;7081:9;7077:18;7071:25;7136:10;7129:5;7125:22;7118:5;7115:33;7105:2;;7167:6;7159;7152:22;7105:2;7195:5;7185:15;;;6846:360;;;;;:::o;7211:194::-;;7334:2;7322:9;7313:7;7309:23;7305:32;7302:2;;;7355:6;7347;7340:22;7302:2;-1:-1:-1;7383:16:1;;7292:113;-1:-1:-1;7292:113:1:o;7410:737::-;;;;;;7608:3;7596:9;7587:7;7583:23;7579:33;7576:2;;;7630:6;7622;7615:22;7576:2;7671:9;7658:23;7648:33;;7732:2;7721:9;7717:18;7704:32;7759:18;7751:6;7748:30;7745:2;;;7796:6;7788;7781:22;7745:2;7840:76;7908:7;7899:6;7888:9;7884:22;7840:76;:::i;:::-;7935:8;;-1:-1:-1;7814:102:1;-1:-1:-1;;8020:2:1;8005:18;;7992:32;8033:33;7992:32;8033:33;:::i;:::-;7566:581;;;;-1:-1:-1;7566:581:1;;8137:2;8122:18;8109:32;;7566:581;-1:-1:-1;;7566:581:1:o;8152:1234::-;;;8306:2;8294:9;8285:7;8281:23;8277:32;8274:2;;;8327:6;8319;8312:22;8274:2;8368:9;8355:23;8345:33;;8397:2;8450;8439:9;8435:18;8422:32;8473:18;8514:2;8506:6;8503:14;8500:2;;;8535:6;8527;8520:22;8500:2;8578:6;8567:9;8563:22;8553:32;;8623:7;8616:4;8612:2;8608:13;8604:27;8594:2;;8650:6;8642;8635:22;8594:2;8691;8678:16;8713:2;8709;8706:10;8703:2;;;8719:18;;:::i;:::-;8766:2;8762;8758:11;8798:2;8792:9;8849:2;8844;8836:6;8832:15;8828:24;8902:6;8890:10;8887:22;8882:2;8870:10;8867:18;8864:46;8861:2;;;8913:18;;:::i;:::-;8949:2;8942:22;8999:18;;;9033:15;;;;-1:-1:-1;9068:11:1;;;9098;;;9094:20;;9091:33;-1:-1:-1;9088:2:1;;;9142:6;9134;9127:22;9088:2;9169:6;9160:15;;9184:171;9198:2;9195:1;9192:9;9184:171;;;9255:25;9276:3;9255:25;:::i;:::-;9243:38;;9216:1;9209:9;;;;;9301:12;;;;9333;;9184:171;;;9188:3;9374:6;9364:16;;;;;;;;8264:1122;;;;;:::o;9391:255::-;;;9531:2;9519:9;9510:7;9506:23;9502:32;9499:2;;;9552:6;9544;9537:22;9499:2;-1:-1:-1;;9580:16:1;;9636:2;9621:18;;;9615:25;9580:16;;9615:25;;-1:-1:-1;9489:157:1:o;9651:806::-;;;;;;;9866:3;9854:9;9845:7;9841:23;9837:33;9834:2;;;9888:6;9880;9873:22;9834:2;9929:9;9916:23;9906:33;;9986:2;9975:9;9971:18;9958:32;9948:42;;10041:2;10030:9;10026:18;10013:32;10068:18;10060:6;10057:30;10054:2;;;10105:6;10097;10090:22;10054:2;10149:76;10217:7;10208:6;10197:9;10193:22;10149:76;:::i;:::-;10244:8;;-1:-1:-1;10123:102:1;-1:-1:-1;;10329:2:1;10314:18;;10301:32;10342:33;10301:32;10342:33;:::i;:::-;10394:5;10384:15;;;10446:3;10435:9;10431:19;10418:33;10408:43;;9824:633;;;;;;;;:::o;10462:326::-;;;;10608:2;10596:9;10587:7;10583:23;10579:32;10576:2;;;10629:6;10621;10614:22;10576:2;-1:-1:-1;;10657:23:1;;;10727:2;10712:18;;10699:32;;-1:-1:-1;10778:2:1;10763:18;;;10750:32;;10566:222;-1:-1:-1;10566:222:1:o;10793:368::-;10960:66;11055:2;11051:15;;;11047:24;;11035:37;;11106:15;;;;11102:24;11097:2;11088:12;;11081:46;11152:2;11143:12;;10940:221::o;11166:274::-;;11333:6;11327:13;11349:53;11395:6;11390:3;11383:4;11375:6;11371:17;11349:53;:::i;:::-;11418:16;;;;;11303:137;-1:-1:-1;;11303:137:1:o;11445:724::-;11816:66;11804:79;;11920:2;11916:15;;;;11933:66;11912:88;11908:1;11899:11;;11892:109;12026:2;12017:12;;12010:28;12068:66;12063:2;12054:12;;12047:88;12160:2;12151:12;;11794:375::o;12174:226::-;12350:42;12338:55;;;;12320:74;;12308:2;12293:18;;12275:125::o;12405:327::-;12589:42;12658:15;;;12640:34;;12710:15;;12705:2;12690:18;;12683:43;12567:2;12552:18;;12534:198::o;12737:623::-;13034:42;13103:15;;;13085:34;;13155:15;;;13150:2;13135:18;;13128:43;13207:15;;;;13202:2;13187:18;;13180:43;13254:2;13239:18;;13232:34;13297:3;13282:19;;13275:35;;;;13341:3;13326:19;;13319:35;;;;13011:3;12996:19;;12978:382::o;13365:398::-;13577:42;13646:15;;;13628:34;;13698:15;;;;13693:2;13678:18;;13671:43;13745:2;13730:18;;13723:34;;;;13555:2;13540:18;;13522:241::o;13768:542::-;14037:42;14106:15;;;14088:34;;14158:15;;;;14153:2;14138:18;;14131:43;14205:2;14190:18;;14183:34;;;;14248:2;14233:18;;14226:34;14291:3;14276:19;;14269:35;;;;14014:3;13999:19;;13981:329::o;14315:693::-;14636:42;14705:15;;;14687:34;;14757:15;;;;14752:2;14737:18;;14730:43;14804:2;14789:18;;14782:34;;;;14847:2;14832:18;;14825:34;;;;14908:4;14896:17;14890:3;14875:19;;14868:46;14945:3;14930:19;;14923:35;14989:3;14974:19;;14967:35;;;;14613:3;14598:19;;14580:428::o;15013:297::-;15217:42;15205:55;;;;15187:74;;15292:2;15277:18;;15270:34;15175:2;15160:18;;15142:168::o;15315:635::-;15486:2;15538:21;;;15608:13;;15511:18;;;15630:22;;;15315:635;;15486:2;15709:15;;;;15683:2;15668:18;;;15315:635;15755:169;15769:6;15766:1;15763:13;15755:169;;;15830:13;;15818:26;;15899:15;;;;15864:12;;;;15791:1;15784:9;15755:169;;;-1:-1:-1;15941:3:1;;15466:484;-1:-1:-1;;;;;;15466:484:1:o;16205:398::-;16407:2;16389:21;;;16446:2;16426:18;;;16419:30;16485:34;16480:2;16465:18;;16458:62;16556:4;16551:2;16536:18;;16529:32;16593:3;16578:19;;16379:224::o;16608:355::-;16810:2;16792:21;;;16849:2;16829:18;;;16822:30;16888:33;16883:2;16868:18;;16861:61;16954:2;16939:18;;16782:181::o;16968:350::-;17170:2;17152:21;;;17209:2;17189:18;;;17182:30;17248:28;17243:2;17228:18;;17221:56;17309:2;17294:18;;17142:176::o;17323:401::-;17525:2;17507:21;;;17564:2;17544:18;;;17537:30;17603:34;17598:2;17583:18;;17576:62;17674:7;17669:2;17654:18;;17647:35;17714:3;17699:19;;17497:227::o;17729:398::-;17931:2;17913:21;;;17970:2;17950:18;;;17943:30;18009:34;18004:2;17989:18;;17982:62;18080:4;18075:2;18060:18;;18053:32;18117:3;18102:19;;17903:224::o;18132:351::-;18334:2;18316:21;;;18373:2;18353:18;;;18346:30;18412:29;18407:2;18392:18;;18385:57;18474:2;18459:18;;18306:177::o;18488:400::-;18690:2;18672:21;;;18729:2;18709:18;;;18702:30;18768:34;18763:2;18748:18;;18741:62;18839:6;18834:2;18819:18;;18812:34;18878:3;18863:19;;18662:226::o;18893:399::-;19095:2;19077:21;;;19134:2;19114:18;;;19107:30;19173:34;19168:2;19153:18;;19146:62;19244:5;19239:2;19224:18;;19217:33;19282:3;19267:19;;19067:225::o;19297:405::-;19499:2;19481:21;;;19538:2;19518:18;;;19511:30;19577:34;19572:2;19557:18;;19550:62;19648:11;19643:2;19628:18;;19621:39;19692:3;19677:19;;19471:231::o;19707:351::-;19909:2;19891:21;;;19948:2;19928:18;;;19921:30;19987:29;19982:2;19967:18;;19960:57;20049:2;20034:18;;19881:177::o;20063:345::-;20265:2;20247:21;;;20304:2;20284:18;;;20277:30;20343:23;20338:2;20323:18;;20316:51;20399:2;20384:18;;20237:171::o;20413:404::-;20615:2;20597:21;;;20654:2;20634:18;;;20627:30;20693:34;20688:2;20673:18;;20666:62;20764:10;20759:2;20744:18;;20737:38;20807:3;20792:19;;20587:230::o;20822:399::-;21024:2;21006:21;;;21063:2;21043:18;;;21036:30;21102:34;21097:2;21082:18;;21075:62;21173:5;21168:2;21153:18;;21146:33;21211:3;21196:19;;20996:225::o;21226:399::-;21428:2;21410:21;;;21467:2;21447:18;;;21440:30;21506:34;21501:2;21486:18;;21479:62;21577:5;21572:2;21557:18;;21550:33;21615:3;21600:19;;21400:225::o;21630:398::-;21832:2;21814:21;;;21871:2;21851:18;;;21844:30;21910:34;21905:2;21890:18;;21883:62;21981:4;21976:2;21961:18;;21954:32;22018:3;22003:19;;21804:224::o;22033:400::-;22235:2;22217:21;;;22274:2;22254:18;;;22247:30;22313:34;22308:2;22293:18;;22286:62;22384:6;22379:2;22364:18;;22357:34;22423:3;22408:19;;22207:226::o;22438:404::-;22640:2;22622:21;;;22679:2;22659:18;;;22652:30;22718:34;22713:2;22698:18;;22691:62;22789:10;22784:2;22769:18;;22762:38;22832:3;22817:19;;22612:230::o;22847:177::-;22993:25;;;22981:2;22966:18;;22948:76::o;23029:248::-;23203:25;;;23259:2;23244:18;;23237:34;23191:2;23176:18;;23158:119::o;23282:706::-;;23513:6;23502:9;23495:25;23556:6;23551:2;23540:9;23536:18;23529:34;23611:42;23603:6;23599:55;23594:2;23583:9;23579:18;23572:83;23691:3;23686:2;23675:9;23671:18;23664:31;23724:6;23718:13;23768:6;23762:3;23751:9;23747:19;23740:35;23784:67;23844:6;23838:3;23827:9;23823:19;23818:2;23810:6;23806:15;23784:67;:::i;:::-;23903:2;23891:15;23908:66;23887:88;23872:104;;;;23978:3;23868:114;;23485:503;-1:-1:-1;;;;;23485:503:1:o;23993:319::-;24195:25;;;24251:2;24236:18;;24229:34;;;;24294:2;24279:18;;24272:34;24183:2;24168:18;;24150:162::o;24317:128::-;;24388:1;24384:6;24381:1;24378:13;24375:2;;;24394:18;;:::i;:::-;-1:-1:-1;24430:9:1;;24365:80::o;24450:274::-;;24516:1;24506:2;;24551:77;24548:1;24541:88;24652:4;24649:1;24642:15;24680:4;24677:1;24670:15;24506:2;-1:-1:-1;24709:9:1;;24496:228::o;24729:::-;;24895:1;24827:66;24823:74;24820:1;24817:81;24812:1;24805:9;24798:17;24794:105;24791:2;;;24902:18;;:::i;:::-;-1:-1:-1;24942:9:1;;24781:176::o;24962:125::-;;25030:1;25027;25024:8;25021:2;;;25035:18;;:::i;:::-;-1:-1:-1;25072:9:1;;25011:76::o;25092:258::-;25164:1;25174:113;25188:6;25185:1;25182:13;25174:113;;;25264:11;;;25258:18;25245:11;;;25238:39;25210:2;25203:10;25174:113;;;25305:6;25302:1;25299:13;25296:2;;;-1:-1:-1;;25340:1:1;25322:16;;25315:27;25145:205::o;25355:196::-;;25422:5;25412:2;;25431:18;;:::i;:::-;-1:-1:-1;25478:66:1;25467:78;;25402:149::o;25556:195::-;;25626:66;25619:5;25616:77;25613:2;;;25696:18;;:::i;:::-;-1:-1:-1;25743:1:1;25732:13;;25603:148::o;25756:184::-;25808:77;25805:1;25798:88;25905:4;25902:1;25895:15;25929:4;25926:1;25919:15;25945:184;25997:77;25994:1;25987:88;26094:4;26091:1;26084:15;26118:4;26115:1;26108:15;26134:156;26222:42;26215:5;26211:54;26204:5;26201:65;26191:2;;26280:1;26277;26270:12;26191:2;26181:109;:::o;26295:120::-;26383:5;26376:13;26369:21;26362:5;26359:32;26349:2;;26405:1;26402;26395:12

Swarm Source

ipfs://bab737da5d6c50a059c45284320340295803a6ea6ab077a355e80f146ad24ea3
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading