Contract 0xE6e79A66cB32c53A9d56B18FA737fb5D72c71475

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2c13d9e5f79f1e5b92c4c1761722adf536fc66084343b754063c31c945202e46Add Liquidity ET...95635042022-01-14 15:28:5412 days 16 hrs ago0xe3b2437aceac91e3652eee3be188ae74fd79b638 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.002510314079034 AVAX0.004806175 25
0xf02f1b384300fa88f02e2c37173218eb6ba82527fddae209eb7db407b5cfbf77Swap ETH For Exa...95634652022-01-14 15:27:3512 days 16 hrs ago0xe3b2437aceac91e3652eee3be188ae74fd79b638 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.002161549894724 AVAX0.00589115 25
0xf5cdf7d9bd135d18efdee62e42f7f371f06839df7047d09538ac0375f5453a04Add Liquidity ET...95485912022-01-14 7:20:1913 days 14 mins ago0xe5130a95f45d6cae01fed29d00d3965339ee5485 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.001069349576888 AVAX0.004805875 25
0x71f111b27f95203442099f3be94bf536d28c824f772d6438ad4cf216edb52d66Swap Exact ETH F...95485562022-01-14 7:19:1013 days 15 mins ago0xe5130a95f45d6cae01fed29d00d3965339ee5485 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.0005 AVAX0.00527555 25
0x499f733f108264eba2f7fdc6c783a4cc166a7dbc2449302ed98f4473a36bf797Swap Exact ETH F...95485272022-01-14 7:18:1213 days 16 mins ago0xe5130a95f45d6cae01fed29d00d3965339ee5485 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.0005 AVAX0.009929625 25
0xe9d519873fffa2f727df77706d1cc280448066dd83f0483a31647a855e33e97dRemove Liquidity...95374812022-01-14 1:18:4913 days 6 hrs ago0x196c5e18b04e80272651ee74805eb0b2e692c152 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.00708425 25
0x54f7eb5ae6d8e6f1c77ef1701b83eb0901a4f18c493aed3de99f8d71932d5634Add Liquidity95371632022-01-14 1:08:4213 days 6 hrs ago0x196c5e18b04e80272651ee74805eb0b2e692c152 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0042407 25
0x5a25382f820f07acd8650d119b58d91017cec7a0e72a4f0fdbb33d340afad315Swap Exact Token...92449552022-01-07 7:32:3820 days 2 mins ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.005648775 25
0x59c82b50e2eda3c17333e1808eda1f2e53eb39efe94bd4e8afa212fa28445e47Swap ETH For Exa...92445152022-01-07 7:17:5720 days 16 mins ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.000096487699118 AVAX0.007667103588 25.365754174
0xad66e7e6a2b0cadbbb07c748a62c7df3ce54958ea965b5f141da292b0c93a426Swap ETH For Exa...92443352022-01-07 7:11:4020 days 23 mins ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.000091845678146 AVAX0.01225905 25
0x08366026dadee96cfd5daef0a7e6de7c4cfd66190145f00d5609ba5b141bf855Remove Liquidity...92269332022-01-06 21:46:4320 days 9 hrs ago0x305b0ecf72634825f7231058444c65d885e1f327 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.006841925 25
0xe31fa47960cf00cbd0c4acefc7526b7ed712efce97b3c5af5e000999585330b3Swap Exact Token...92218232022-01-06 18:59:0220 days 12 hrs ago0x305b0ecf72634825f7231058444c65d885e1f327 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.00384925 25
0x06e6829c8025750bb013c2ca42b07aa46f040069e789f2ddd50a981fbf7c1aaeAdd Liquidity ET...92217862022-01-06 18:57:4820 days 12 hrs ago0x305b0ecf72634825f7231058444c65d885e1f327 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.008859186264078 AVAX0.0046078 25
0x2e1c5dc167f204dc990bf77e3a67343878e06f212bad48e55e25c4751e8e3aaaAdd Liquidity92158302022-01-06 15:38:1720 days 15 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0049392 25
0x220b00073f941412120cdb437b7afa3d3a5998c23bca968617e6e06cc10eaa73Add Liquidity ET...92157452022-01-06 15:35:2620 days 15 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.007782195543543 AVAX0.0055587 25
0xaf21cb58feef6721c068db86d090490d256c9c378ac4faf12393ee43f21eb9a7Add Liquidity ET...92156652022-01-06 15:32:4220 days 16 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.01 AVAX0.00701635 25
0xa043a63741cc3e3918bcdf25ac5cf6be3d3f7da374cf38ceecc35155b621919fAdd Liquidity ET...92151022022-01-06 15:13:2920 days 16 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.01 AVAX0.00696005 25
0x4069b6b2ba55c97b8dfc7c8c19ac795568524687cf87648199c8aad7a1caebf6Add Liquidity ET...92150342022-01-06 15:11:1420 days 16 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.008859186264078 AVAX0.00460235 25
0x29b6f3715f0f41d976caffb7ef389efe0b8e575af5e5b93e0c9a636083308ec9Add Liquidity ET...91789992022-01-05 19:06:5621 days 12 hrs ago0xa355a0bfe235b9a1ea304a9dafeafa113f7d2caa IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.01 AVAX0.05664575 25
0x829cc243beb137d0f1601b58f21cdb878807fdf80dac46e4e66a016c24e63826Add Liquidity90830802022-01-03 13:20:0023 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0563109 25
0x97974280dde775ea15222779d46fcbf3b30bc843326811390eb7251c05c07b9bAdd Liquidity90830212022-01-03 13:18:0523 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0562994 25
0x3d20e3a3645910d1147f8ff6a489cbaf843d67dbb9782fd03bbf04710bded3c5Add Liquidity90828582022-01-03 13:12:3323 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0562994 25
0x6c22d82f0e00954825f58750837af60aa55703f7e9f6471a03c0869350ec9793Add Liquidity90827042022-01-03 13:07:3023 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0563569 25
0x8c05f471daf98a95128f0b8427d7e8296c13350240696a29def9e02b2cf7fac9Add Liquidity90825912022-01-03 13:03:4023 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0563569 25
0x3ae91068bc12228c2468bd08b0f64ef50c2abece9d6cf49d4ee15835361212ecAdd Liquidity90825162022-01-03 13:01:1123 days 18 hrs ago0x8a118b9891506e7f603d4abedaf117344e4b92e4 IN  0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750 AVAX0.0563454 25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2c13d9e5f79f1e5b92c4c1761722adf536fc66084343b754063c31c945202e4695635042022-01-14 15:28:5412 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.002510314079034315 AVAX
0xf02f1b384300fa88f02e2c37173218eb6ba82527fddae209eb7db407b5cfbf7795634652022-01-14 15:27:3512 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750xe3b2437aceac91e3652eee3be188ae74fd79b6380.000021401484106184 AVAX
0xf02f1b384300fa88f02e2c37173218eb6ba82527fddae209eb7db407b5cfbf7795634652022-01-14 15:27:3512 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.002140148410618547 AVAX
0xf5cdf7d9bd135d18efdee62e42f7f371f06839df7047d09538ac0375f5453a0495485912022-01-14 7:20:1913 days 14 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.001069349576888296 AVAX
0x71f111b27f95203442099f3be94bf536d28c824f772d6438ad4cf216edb52d6695485562022-01-14 7:19:1013 days 15 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.0005 AVAX
0x499f733f108264eba2f7fdc6c783a4cc166a7dbc2449302ed98f4473a36bf79795485272022-01-14 7:18:1213 days 16 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.0005 AVAX
0xe9d519873fffa2f727df77706d1cc280448066dd83f0483a31647a855e33e97d95374812022-01-14 1:18:4913 days 6 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x196c5e18b04e80272651ee74805eb0b2e692c1525.232004246471065112 AVAX
0xe9d519873fffa2f727df77706d1cc280448066dd83f0483a31647a855e33e97d95374812022-01-14 1:18:4913 days 6 hrs ago Wrapped AVAX 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714755.232004246471065112 AVAX
0x5a25382f820f07acd8650d119b58d91017cec7a0e72a4f0fdbb33d340afad31592449552022-01-07 7:32:3820 days 2 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x8a118b9891506e7f603d4abedaf117344e4b92e40.00009881383789778 AVAX
0x5a25382f820f07acd8650d119b58d91017cec7a0e72a4f0fdbb33d340afad31592449552022-01-07 7:32:3820 days 2 mins ago Wrapped AVAX 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.00009881383789778 AVAX
0x59c82b50e2eda3c17333e1808eda1f2e53eb39efe94bd4e8afa212fa28445e4792445152022-01-07 7:17:5720 days 16 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x8a118b9891506e7f603d4abedaf117344e4b92e40.000000756750493366 AVAX
0x59c82b50e2eda3c17333e1808eda1f2e53eb39efe94bd4e8afa212fa28445e4792445152022-01-07 7:17:5720 days 16 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.000095730948625214 AVAX
0xad66e7e6a2b0cadbbb07c748a62c7df3ce54958ea965b5f141da292b0c93a42692443352022-01-07 7:11:4020 days 23 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x8a118b9891506e7f603d4abedaf117344e4b92e40.000000719986185163 AVAX
0xad66e7e6a2b0cadbbb07c748a62c7df3ce54958ea965b5f141da292b0c93a42692443352022-01-07 7:11:4020 days 23 mins ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.000091125691961601 AVAX
0x08366026dadee96cfd5daef0a7e6de7c4cfd66190145f00d5609ba5b141bf85592269332022-01-06 21:46:4320 days 9 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x305b0ecf72634825f7231058444c65d885e1f3270.008863073615822454 AVAX
0x08366026dadee96cfd5daef0a7e6de7c4cfd66190145f00d5609ba5b141bf85592269332022-01-06 21:46:4320 days 9 hrs ago Wrapped AVAX 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.008863073615822454 AVAX
0xe31fa47960cf00cbd0c4acefc7526b7ed712efce97b3c5af5e000999585330b392218232022-01-06 18:59:0220 days 12 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750x305b0ecf72634825f7231058444c65d885e1f3270.000008838947529517 AVAX
0xe31fa47960cf00cbd0c4acefc7526b7ed712efce97b3c5af5e000999585330b392218232022-01-06 18:59:0220 days 12 hrs ago Wrapped AVAX 0xe6e79a66cb32c53a9d56b18fa737fb5d72c714750.000008838947529517 AVAX
0x06e6829c8025750bb013c2ca42b07aa46f040069e789f2ddd50a981fbf7c1aae92217862022-01-06 18:57:4820 days 12 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.008859186264078651 AVAX
0x220b00073f941412120cdb437b7afa3d3a5998c23bca968617e6e06cc10eaa7392157452022-01-06 15:35:2620 days 15 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.007782195543543557 AVAX
0xaf21cb58feef6721c068db86d090490d256c9c378ac4faf12393ee43f21eb9a792156652022-01-06 15:32:4220 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.01 AVAX
0xa043a63741cc3e3918bcdf25ac5cf6be3d3f7da374cf38ceecc35155b621919f92151022022-01-06 15:13:2920 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.01 AVAX
0x4069b6b2ba55c97b8dfc7c8c19ac795568524687cf87648199c8aad7a1caebf692150342022-01-06 15:11:1420 days 16 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.008859186264078651 AVAX
0x29b6f3715f0f41d976caffb7ef389efe0b8e575af5e5b93e0c9a636083308ec991789992022-01-05 19:06:5621 days 12 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.01 AVAX
0x27b1f8dfb4a17b226ce397692fb2bbe2b2e114d510df59d4855567c3eeb6ea2190824052022-01-03 12:57:2623 days 18 hrs ago 0xe6e79a66cb32c53a9d56b18fa737fb5d72c71475 Wrapped AVAX0.01 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HakuswapRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2021-12-30
*/

// File: contracts/libraries/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: contracts/libraries/Ownable.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/interfaces/IHakuswapFactory.sol


pragma solidity >=0.5.0;

interface IHakuswapFactory {
    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 expectPairFor(address token0, address token1) external view returns (address);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

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

// File: contracts/interfaces/IHakuswapPair.sol


pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts/libraries/SafeMath.sol


pragma solidity >=0.4.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// File: contracts/libraries/HakuswapLibrary.sol


pragma solidity >=0.5.0;




library HakuswapLibrary {
    using SafeMath for uint;

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

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'c4a2d45c9c5ca06d95d3dfde61ffbe8fc8efb193c4d2899700d3fb5a9031e41e' // 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);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IHakuswapPair(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, 'HakuswapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'HakuswapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

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

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

    // 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, 'HakuswapLibrary: 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, 'HakuswapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/swap/Router.sol


pragma solidity >=0.6.6;



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

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

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

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

interface IHakuswapRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

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

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

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

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

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

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

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

interface ISwapMining {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

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

contract HakuswapRouter is IHakuswapRouter02, Ownable {
    using SafeMath for uint;

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

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

    function setSwapMining(address _swapMininng) public onlyOwner {
        swapMining = _swapMininng;
    }

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

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

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

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

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

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

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = HakuswapLibrary.sortTokens(input, output);
            IHakuswapPair pair = IHakuswapPair(HakuswapLibrary.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 = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = HakuswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            if (swapMining != address(0)) {
                ISwapMining(swapMining).swap(msg.sender, input, output, amountOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? HakuswapLibrary.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, HakuswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'HakuswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'HakuswapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(HakuswapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'HakuswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'HakuswapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, HakuswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'HakuswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapMininng","type":"address"}],"name":"setSwapMining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162004d0e38038062004d0e833981810160405260408110156200003757600080fd5b50805160209091015160006200004c620000b5565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606092831b8116608052911b1660a052620000b9565b3390565b60805160601c60a05160601c614b27620001e7600039806101d65280610e005280610e3b5280610f32528061115052806114da52806116e55280611b525280611c2d5280611d075280611dd55280611f1b5280611fa352806121ee5280612269528061231d52806123e9528061247e52806124f252806129d55280612d535280612da95280612ddd5280612e515280612fdf528061312252806131aa525080610fc052806110975280611216528061124f528061138a528061156852806116c352806118335280611e685280611fd5528061212f52806125245280612762528061295a528061298352806129b35280612b205280612d87528061307252806131dc5280613b085280613b4b5280613e295280614044528061442752806144e052806145935250614b276000f3fe6080604052600436106101c65760003560e01c806385f8c259116100f7578063baa2abde11610095578063e8e3370011610064578063e8e3370014610c36578063f2fde38b14610cb6578063f305d71914610ce9578063fb3bdb4114610d2f576101ff565b8063baa2abde14610a9c578063c45a015514610af9578063d06ca61f14610b0e578063ded9382a14610bc3576101ff565b8063ad5c4648116100d1578063ad5c46481461097a578063ad615dec1461098f578063af2979eb146109c5578063b6f9de9514610a18576101ff565b806385f8c259146108995780638803dbee146108cf5780638da5cb5b14610965576101ff565b80634e5eda11116101645780635c11d7951161013e5780635c11d795146106d4578063715018a61461076a578063791ac9471461077f5780637ff36ab514610815576101ff565b80634e5eda11146105fd5780634f8871831461062e5780635b0d598414610661576101ff565b80631f00ca74116101a05780631f00ca741461039e5780632195995c1461045357806338ed1739146104d15780634a25d94a14610567576101ff565b806302751cec14610204578063054d50d41461027057806318cbafe5146102b8576101ff565b366101ff57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101fd57fe5b005b600080fd5b34801561021057600080fd5b50610257600480360360c081101561022757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610db3565b6040805192835260208301919091528051918290030190f35b34801561027c57600080fd5b506102a66004803603606081101561029357600080fd5b5080359060208101359060400135610ecd565b60408051918252519081900360200190f35b3480156102c457600080fd5b5061034e600480360360a08110156102db57600080fd5b813591602081013591810190606081016040820135600160201b81111561030157600080fd5b82018360208201111561031357600080fd5b803590602001918460208302840111600160201b8311171561033457600080fd5b91935091506001600160a01b038135169060200135610ee2565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561038a578181015183820152602001610372565b505050509050019250505060405180910390f35b3480156103aa57600080fd5b5061034e600480360360408110156103c157600080fd5b81359190810190604081016020820135600160201b8111156103e257600080fd5b8201836020820111156103f457600080fd5b803590602001918460208302840111600160201b8311171561041557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061120f945050505050565b34801561045f57600080fd5b50610257600480360361016081101561047757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611245565b3480156104dd57600080fd5b5061034e600480360360a08110156104f457600080fd5b813591602081013591810190606081016040820135600160201b81111561051a57600080fd5b82018360208201111561052c57600080fd5b803590602001918460208302840111600160201b8311171561054d57600080fd5b91935091506001600160a01b03813516906020013561133f565b34801561057357600080fd5b5061034e600480360360a081101561058a57600080fd5b813591602081013591810190606081016040820135600160201b8111156105b057600080fd5b8201836020820111156105c257600080fd5b803590602001918460208302840111600160201b831117156105e357600080fd5b91935091506001600160a01b03813516906020013561148a565b34801561060957600080fd5b50610612611616565b604080516001600160a01b039092168252519081900360200190f35b34801561063a57600080fd5b506101fd6004803603602081101561065157600080fd5b50356001600160a01b0316611625565b34801561066d57600080fd5b506102a6600480360361014081101561068557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356116bb565b3480156106e057600080fd5b506101fd600480360360a08110156106f757600080fd5b813591602081013591810190606081016040820135600160201b81111561071d57600080fd5b82018360208201111561072f57600080fd5b803590602001918460208302840111600160201b8311171561075057600080fd5b91935091506001600160a01b0381351690602001356117c9565b34801561077657600080fd5b506101fd611a46565b34801561078b57600080fd5b506101fd600480360360a08110156107a257600080fd5b813591602081013591810190606081016040820135600160201b8111156107c857600080fd5b8201836020820111156107da57600080fd5b803590602001918460208302840111600160201b831117156107fb57600080fd5b91935091506001600160a01b038135169060200135611b04565b61034e6004803603608081101561082b57600080fd5b81359190810190604081016020820135600160201b81111561084c57600080fd5b82018360208201111561085e57600080fd5b803590602001918460208302840111600160201b8311171561087f57600080fd5b91935091506001600160a01b038135169060200135611d8d565b3480156108a557600080fd5b506102a6600480360360608110156108bc57600080fd5b50803590602081013590604001356120d7565b3480156108db57600080fd5b5061034e600480360360a08110156108f257600080fd5b813591602081013591810190606081016040820135600160201b81111561091857600080fd5b82018360208201111561092a57600080fd5b803590602001918460208302840111600160201b8311171561094b57600080fd5b91935091506001600160a01b0381351690602001356120e4565b34801561097157600080fd5b506106126121dd565b34801561098657600080fd5b506106126121ec565b34801561099b57600080fd5b506102a6600480360360608110156109b257600080fd5b5080359060208101359060400135612210565b3480156109d157600080fd5b506102a6600480360360c08110156109e857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561221d565b6101fd60048036036080811015610a2e57600080fd5b81359190810190604081016020820135600160201b811115610a4f57600080fd5b820183602082011115610a6157600080fd5b803590602001918460208302840111600160201b83111715610a8257600080fd5b91935091506001600160a01b0381351690602001356123a3565b348015610aa857600080fd5b50610257600480360360e0811015610abf57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612714565b348015610b0557600080fd5b50610612612958565b348015610b1a57600080fd5b5061034e60048036036040811015610b3157600080fd5b81359190810190604081016020820135600160201b811115610b5257600080fd5b820183602082011115610b6457600080fd5b803590602001918460208302840111600160201b83111715610b8557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061297c945050505050565b348015610bcf57600080fd5b506102576004803603610140811015610be757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356129a9565b348015610c4257600080fd5b50610c986004803603610100811015610c5a57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612abd565b60408051938452602084019290925282820152519081900360600190f35b348015610cc257600080fd5b506101fd60048036036020811015610cd957600080fd5b50356001600160a01b0316612bf0565b610c98600480360360c0811015610cff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612d04565b61034e60048036036080811015610d4557600080fd5b81359190810190604081016020820135600160201b811115610d6657600080fd5b820183602082011115610d7857600080fd5b803590602001918460208302840111600160201b83111715610d9957600080fd5b91935091506001600160a01b038135169060200135612f97565b6000808242811015610dfa576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b610e29897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612714565b9093509150610e39898685613310565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b50505050610ec1858361347a565b50965096945050505050565b6000610eda848484613572565b949350505050565b60608142811015610f28576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610f6257fe5b905060200201356001600160a01b03166001600160a01b031614610fbb576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b6110197f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061364a92505050565b9150868260018451038151811061102c57fe5b602002602001015110156110715760405162461bcd60e51b815260040180806020018281038252602a81526020018061493b602a913960400191505060405180910390fd5b61110f8686600081811061108157fe5b905060200201356001600160a01b0316336110f57f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106110c357fe5b905060200201356001600160a01b03168b8b60018181106110e057fe5b905060200201356001600160a01b0316613796565b8560008151811061110257fe5b6020026020010151613856565b61114e828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139b3915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061118d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156111cb57600080fd5b505af11580156111df573d6000803e3d6000fd5b5050505061120484836001855103815181106111f757fe5b602002602001015161347a565b509695505050505050565b606061123c7f00000000000000000000000000000000000000000000000000000000000000008484613c96565b90505b92915050565b60008060006112757f00000000000000000000000000000000000000000000000000000000000000008f8f613796565b9050600087611284578c611288565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b505050506113258f8f8f8f8f8f8f612714565b809450819550505050509b509b9950505050505050505050565b60608142811015611385576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6113e37f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061364a92505050565b915086826001845103815181106113f657fe5b6020026020010151101561143b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061493b602a913960400191505060405180910390fd5b61144b8686600081811061108157fe5b611204828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506139b3915050565b606081428110156114d0576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061150a57fe5b905060200201356001600160a01b03166001600160a01b031614611563576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b6115c17f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c9692505050565b915086826000815181106115d157fe5b602002602001015111156110715760405162461bcd60e51b81526004018080602001828103825260268152602001806149ca6026913960400191505060405180910390fd5b6001546001600160a01b031681565b61162d613dce565b6001600160a01b031661163e6121dd565b6001600160a01b031614611699576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000806117097f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613796565b9050600086611718578b61171c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561179257600080fd5b505af11580156117a6573d6000803e3d6000fd5b505050506117b88d8d8d8d8d8d61221d565b9d9c50505050505050505050505050565b804281101561180d576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6118828585600081811061181d57fe5b905060200201356001600160a01b03163361187c7f00000000000000000000000000000000000000000000000000000000000000008989600081811061185f57fe5b905060200201356001600160a01b03168a8a60018181106110e057fe5b8a613856565b60008585600019810181811061189457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118f057600080fd5b505afa158015611904573d6000803e3d6000fd5b505050506040513d602081101561191a57600080fd5b5051604080516020888102828101820190935288825292935061195c929091899189918291850190849080828437600092019190915250889250613dd2915050565b866119ff828888600019810181811061197157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119cd57600080fd5b505afa1580156119e1573d6000803e3d6000fd5b505050506040513d60208110156119f757600080fd5b505190614179565b1015611a3c5760405162461bcd60e51b815260040180806020018281038252602a81526020018061493b602a913960400191505060405180910390fd5b5050505050505050565b611a4e613dce565b6001600160a01b0316611a5f6121dd565b6001600160a01b031614611aba576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b8042811015611b48576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611b8257fe5b905060200201356001600160a01b03166001600160a01b031614611bdb576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b611beb8585600081811061181d57fe5b611c29858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613dd2915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c9857600080fd5b505afa158015611cac573d6000803e3d6000fd5b505050506040513d6020811015611cc257600080fd5b5051905086811015611d055760405162461bcd60e51b815260040180806020018281038252602a81526020018061493b602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b50505050611a3c848261347a565b60608142811015611dd3576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611e0a57fe5b905060200201356001600160a01b03166001600160a01b031614611e63576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b611ec17f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061364a92505050565b91508682600184510381518110611ed457fe5b60200260200101511015611f195760405162461bcd60e51b815260040180806020018281038252602a81526020018061493b602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611f5557fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f8857600080fd5b505af1158015611f9c573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120017f00000000000000000000000000000000000000000000000000000000000000008989600081811061185f57fe5b8460008151811061200e57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b505161208e57fe5b6120cd828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506139b3915050565b5095945050505050565b6000610eda8484846141bb565b6060814281101561212a576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b6121887f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c9692505050565b9150868260008151811061219857fe5b6020026020010151111561143b5760405162461bcd60e51b81526004018080602001828103825260268152602001806149ca6026913960400191505060405180910390fd5b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610eda848484614293565b60008142811015612263576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b612292887f00000000000000000000000000000000000000000000000000000000000000008989893089612714565b90508092505061231b88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122ea57600080fd5b505afa1580156122fe573d6000803e3d6000fd5b505050506040513d602081101561231457600080fd5b5051613310565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b50505050611204848361347a565b80428110156123e7576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061241e57fe5b905060200201356001600160a01b03166001600160a01b031614612477576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124d757600080fd5b505af11580156124eb573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125507f00000000000000000000000000000000000000000000000000000000000000008989600081811061185f57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561259757600080fd5b505af11580156125ab573d6000803e3d6000fd5b505050506040513d60208110156125c157600080fd5b50516125c957fe5b6000868660001981018181106125db57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561263757600080fd5b505afa15801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b505160408051602089810282810182019093528982529293506126a39290918a918a918291850190849080828437600092019190915250899250613dd2915050565b876119ff82898960001981018181106126b857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119cd57600080fd5b600080824281101561275b576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b60006127887f00000000000000000000000000000000000000000000000000000000000000008c8c613796565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156127e357600080fd5b505af11580156127f7573d6000803e3d6000fd5b505050506040513d602081101561280d57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561285a57600080fd5b505af115801561286e573d6000803e3d6000fd5b505050506040513d604081101561288457600080fd5b5080516020909101519092509050600061289e8e8e614339565b509050806001600160a01b03168e6001600160a01b0316146128c15781836128c4565b82825b90975095508a8710156129085760405162461bcd60e51b8152600401808060200182810382526025815260200180614a626025913960400191505060405180910390fd5b898610156129475760405162461bcd60e51b81526004018080602001828103825260258152602001806148ec6025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061123c7f0000000000000000000000000000000000000000000000000000000000000000848461364a565b60008060006129f97f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613796565b9050600087612a08578c612a0c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612a8257600080fd5b505af1158015612a96573d6000803e3d6000fd5b50505050612aa88e8e8e8e8e8e610db3565b909f909e509c50505050505050505050505050565b60008060008342811015612b06576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b612b148c8c8c8c8c8c614417565b90945092506000612b467f00000000000000000000000000000000000000000000000000000000000000008e8e613796565b9050612b548d338388613856565b612b608c338387613856565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b505050506040513d6020811015612bd957600080fd5b5051949d939c50939a509198505050505050505050565b612bf8613dce565b6001600160a01b0316612c096121dd565b6001600160a01b031614612c64576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116612ca95760405162461bcd60e51b81526004018080602001828103825260268152602001806148c66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008060008342811015612d4d576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b612d7b8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614417565b90945092506000612dcd7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613796565b9050612ddb8b338388613856565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3657600080fd5b505af1158015612e4a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec657600080fd5b505af1158015612eda573d6000803e3d6000fd5b505050506040513d6020811015612ef057600080fd5b5051612ef857fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612f4757600080fd5b505af1158015612f5b573d6000803e3d6000fd5b505050506040513d6020811015612f7157600080fd5b5051925034841015612f8957612f893385340361347a565b505096509650969350505050565b60608142811015612fdd576040805162461bcd60e51b81526020600482015260176024820152600080516020614989833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061301457fe5b905060200201356001600160a01b03166001600160a01b03161461306d576040805162461bcd60e51b815260206004820152601c6024820152600080516020614aab833981519152604482015290519081900360640190fd5b6130cb7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c9692505050565b915034826000815181106130db57fe5b602002602001015111156131205760405162461bcd60e51b81526004018080602001828103825260268152602001806149ca6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061315c57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561318f57600080fd5b505af11580156131a3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6132087f00000000000000000000000000000000000000000000000000000000000000008989600081811061185f57fe5b8460008151811061321557fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561326357600080fd5b505af1158015613277573d6000803e3d6000fd5b505050506040513d602081101561328d57600080fd5b505161329557fe5b6132d4828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506139b3915050565b816000815181106132e157fe5b60200260200101513411156120cd576120cd338360008151811061330157fe5b6020026020010151340361347a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061338d5780518252601f19909201916020918201910161336e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133ef576040519150601f19603f3d011682016040523d82523d6000602084013e6133f4565b606091505b5091509150818015613422575080511580613422575080806020019051602081101561341f57600080fd5b50515b613473576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134c65780518252601f1990920191602091820191016134a7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613528576040519150601f19603f3d011682016040523d82523d6000602084013e61352d565b606091505b505090508061356d5760405162461bcd60e51b8152600401808060200182810382526023815260200180614a3f6023913960400191505060405180910390fd5b505050565b60008084116135b25760405162461bcd60e51b815260040180806020018281038252602a815260200180614911602a913960400191505060405180910390fd5b6000831180156135c25750600082115b6135fd5760405162461bcd60e51b8152600401808060200182810382526027815260200180614acb6027913960400191505060405180910390fd5b600061360b856103e66146a8565b9050600061361982856146a8565b905060006136338361362d886103e86146a8565b90614701565b905080828161363e57fe5b04979650505050505050565b60606002825110156136a3576040805162461bcd60e51b815260206004820152601d60248201527f48616b75737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156136bb57600080fd5b506040519080825280602002602001820160405280156136e5578160200160208202803683370190505b50905082816000815181106136f657fe5b60200260200101818152505060005b600183510381101561378e576000806137488786858151811061372457fe5b602002602001015187866001018151811061373b57fe5b602002602001015161475b565b9150915061376a84848151811061375b57fe5b60200260200101518383613572565b84846001018151811061377957fe5b60209081029190910101525050600101613705565b509392505050565b60008060006137a58585614339565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fc4a2d45c9c5ca06d95d3dfde61ffbe8fc8efb193c4d2899700d3fb5a9031e41e609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138db5780518252601f1990920191602091820191016138bc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461393d576040519150601f19603f3d011682016040523d82523d6000602084013e613942565b606091505b5091509150818015613970575080511580613970575080806020019051602081101561396d57600080fd5b50515b6139ab5760405162461bcd60e51b8152600401808060200182810382526024815260200180614a876024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613c90576000808483815181106139d157fe5b60200260200101518584600101815181106139e857fe5b6020026020010151915091506000613a008383614339565b5090506000878560010181518110613a1457fe5b60209081029190910101516001549091506001600160a01b031615613ac4576001546040805163152cf14360e31b81523360048201526001600160a01b0387811660248301528681166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b158015613a9757600080fd5b505af1158015613aab573d6000803e3d6000fd5b505050506040513d6020811015613ac157600080fd5b50505b600080836001600160a01b0316866001600160a01b031614613ae857826000613aec565b6000835b91509150600060028a51038810613b035788613b44565b613b447f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613b3757fe5b6020026020010151613796565b9050613b717f00000000000000000000000000000000000000000000000000000000000000008888613796565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613bae576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c16578181015183820152602001613bfe565b50505050905090810190601f168015613c435780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c6557600080fd5b505af1158015613c79573d6000803e3d6000fd5b5050600190990198506139b6975050505050505050565b50505050565b6060600282511015613cef576040805162461bcd60e51b815260206004820152601d60248201527f48616b75737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613d0757600080fd5b50604051908082528060200260200182016040528015613d31578160200160208202803683370190505b5090508281600183510381518110613d4557fe5b60209081029190910101528151600019015b801561378e57600080613d8787866001860381518110613d7357fe5b602002602001015187868151811061373b57fe5b91509150613da9848481518110613d9a57fe5b602002602001015183836141bb565b846001850381518110613db857fe5b6020908102919091010152505060001901613d57565b3390565b60005b600183510381101561356d57600080848381518110613df057fe5b6020026020010151858460010181518110613e0757fe5b6020026020010151915091506000613e1f8383614339565b5090506000613e4f7f00000000000000000000000000000000000000000000000000000000000000008585613796565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613e9057600080fd5b505afa158015613ea4573d6000803e3d6000fd5b505050506040513d6060811015613eba57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613ef0578284613ef3565b83835b91509150613f48828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119cd57600080fd5b9550613f55868383613572565b6001549095506001600160a01b031615935061400092505050576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b158015613fd357600080fd5b505af1158015613fe7573d6000803e3d6000fd5b505050506040513d6020811015613ffd57600080fd5b50505b600080856001600160a01b0316886001600160a01b03161461402457826000614028565b6000835b91509150600060028c51038a1061403f578a614073565b6140737f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613b3757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156140fd5781810151838201526020016140e5565b50505050905090810190601f16801561412a5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561414c57600080fd5b505af1158015614160573d6000803e3d6000fd5b50506001909b019a50613dd59950505050505050505050565b600061123c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061482e565b60008084116141fb5760405162461bcd60e51b815260040180806020018281038252602b815260200180614a14602b913960400191505060405180910390fd5b60008311801561420b5750600082115b6142465760405162461bcd60e51b8152600401808060200182810382526027815260200180614acb6027913960400191505060405180910390fd5b600061425e6103e861425886886146a8565b906146a8565b905060006142726103e66142588689614179565b9050614289600282848161428257fe5b0490614701565b9695505050505050565b60008084116142d35760405162461bcd60e51b81526004018080602001828103825260248152602001806149656024913960400191505060405180910390fd5b6000831180156142e35750600082115b61431e5760405162461bcd60e51b8152600401808060200182810382526027815260200180614acb6027913960400191505060405180910390fd5b8261432985846146a8565b8161433057fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561438d5760405162461bcd60e51b81526004018080602001828103825260248152602001806149f06024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106143ad5782846143b0565b83835b90925090506001600160a01b038216614410576040805162461bcd60e51b815260206004820152601d60248201527f48616b75737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156144a357600080fd5b505afa1580156144b7573d6000803e3d6000fd5b505050506040513d60208110156144cd57600080fd5b50516001600160a01b0316141561458b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561455e57600080fd5b505af1158015614572573d6000803e3d6000fd5b505050506040513d602081101561458857600080fd5b50505b6000806145b97f00000000000000000000000000000000000000000000000000000000000000008b8b61475b565b915091508160001480156145cb575080155b156145db5787935086925061469b565b60006145e8898484614293565b905087811161463b57858110156146305760405162461bcd60e51b81526004018080602001828103825260258152602001806148ec6025913960400191505060405180910390fd5b889450925082614699565b6000614648898486614293565b90508981111561465457fe5b878110156146935760405162461bcd60e51b8152600401808060200182810382526025815260200180614a626025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000826146b75750600061123f565b828202828482816146c457fe5b041461123c5760405162461bcd60e51b81526004018080602001828103825260218152602001806149a96021913960400191505060405180910390fd5b60008282018381101561123c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080600061476a8585614339565b509050614778868686613796565b50600080614787888888613796565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156147bf57600080fd5b505afa1580156147d3573d6000803e3d6000fd5b505050506040513d60608110156147e957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461481c57808261481f565b81815b90999098509650505050505050565b600081848411156148bd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561488257818101518382015260200161486a565b50505050905090810190601f1680156148af5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737348616b7573776170526f757465723a20494e53554646494349454e545f425f414d4f554e5448616b75737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5448616b7573776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e5448616b75737761704c6962726172793a20494e53554646494349454e545f414d4f554e5448616b7573776170526f757465723a2045585049524544000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7748616b7573776170526f757465723a204558434553534956455f494e5055545f414d4f554e5448616b75737761704c6962726172793a204944454e544943414c5f41444452455353455348616b75737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454448616b7573776170526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454448616b7573776170526f757465723a20494e56414c49445f504154480000000048616b75737761704c6962726172793a20494e53554646494349454e545f4c4951554944495459a26469706673582212202906075ce6441f01ccfc60ce34bedf54ccba992ddb4ffee08ffd4bc1c1ce194d64736f6c634300060c0033000000000000000000000000b8cfa0e3016ed655f72fe9a9a5850c90c372fe99000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

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

000000000000000000000000b8cfa0e3016ed655f72fe9a9a5850c90c372fe99000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Decoded View---------------
Arg [0] : _factory (address): 0xb8cfa0e3016ed655f72fe9a9a5850c90c372fe99
Arg [1] : _WETH (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b8cfa0e3016ed655f72fe9a9a5850c90c372fe99
Arg [1] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7


Deployed ByteCode Sourcemap

24771:18924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25403:10;-1:-1:-1;;;;;25417:4:0;25403:18;;25396:26;;;;24771:18924;;;;;29536:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29536:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42643:261;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42643:261:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36826:846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36826:846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36826:846:0;;;;;;;;;;;;-1:-1:-1;36826:846:0;-1:-1:-1;;;;;;36826:846:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43440:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43440:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43440:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43440:252:0;;-1:-1:-1;43440:252:0;;-1:-1:-1;;;;;43440:252:0:i;30215:675::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30215:675:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34057:625::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34057:625:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34057:625:0;;;;;;;;;;;;-1:-1:-1;34057:625:0;-1:-1:-1;;;;;;34057:625:0;;;;;;;;:::i;35996:824::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35996:824:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35996:824:0;;;;;;;;;;;;-1:-1:-1;35996:824:0;-1:-1:-1;;;;;;35996:824:0;;;;;;;;:::i;24957:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;24957:25:0;;;;;;;;;;;;;;25124:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25124:106:0;-1:-1:-1;;;;;25124:106:0;;:::i;32348:716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32348:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39993:712::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39993:712:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39993:712:0;;;;;;;;;;;;-1:-1:-1;39993:712:0;-1:-1:-1;;;;;;39993:712:0;;;;;;;;:::i;2760:148::-;;;;;;;;;;;;;:::i;41564:840::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41564:840:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41564:840:0;;;;;;;;;;;;-1:-1:-1;41564:840:0;-1:-1:-1;;;;;;41564:840:0;;;;;;;;:::i;35297:693::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35297:693:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35297:693:0;;;;;;;;;;;;-1:-1:-1;35297:693:0;-1:-1:-1;;;;;;35297:693:0;;;;;;;;:::i;42912:260::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42912:260:0;;;;;;;;;;;;:::i;34688:603::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34688:603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34688:603:0;;;;;;;;;;;;-1:-1:-1;34688:603:0;-1:-1:-1;;;;;;34688:603:0;;;;;;;;:::i;2109:87::-;;;;;;;;;;;;;:::i;24912:38::-;;;;;;;;;;;;;:::i;42448:187::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42448:187:0;;;;;;;;;;;;:::i;31642:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31642:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40711:847::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40711:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40711:847:0;;;;;;;;;;;;-1:-1:-1;40711:847:0;-1:-1:-1;;;;;;40711:847:0;;;;;;;;:::i;28671:859::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28671:859:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24864:41::-;;;;;;;;;;;;;:::i;43180:252::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43180:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43180:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43180:252:0;;-1:-1:-1;43180:252:0;;-1:-1:-1;;;;;43180:252:0:i;30896:667::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30896:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26914:736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26914:736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3063:244;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3063:244:0;-1:-1:-1;;;;;3063:244:0;;:::i;27656:972::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27656:972:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37678:806::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37678:806:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37678:806:0;;;;;;;;;;;;-1:-1:-1;37678:806:0;-1:-1:-1;;;;;;37678:806:0;;;;;;;;:::i;29536:673::-;29773:16;29791:14;29754:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;29845:196:::1;29875:5;29895:4;29914:9;29938:14;29967:12;30002:4;30022:8;29845:15;:196::i;:::-;29818:223:::0;;-1:-1:-1;29818:223:0;-1:-1:-1;30052:51:0::1;30080:5:::0;30087:2;29818:223;30052:27:::1;:51::i;:::-;30120:4;-1:-1:-1::0;;;;;30114:20:0::1;;30135:9;30114:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30156:45;30187:2;30191:9;30156:30;:45::i;:::-;29536:673:::0;;;;;;;;;;:::o;42643:261::-;42796:14;42835:61;42864:8;42874:9;42885:10;42835:28;:61::i;:::-;42828:68;42643:261;-1:-1:-1;;;;42643:261:0:o;36826:846::-;37040:21;37012:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37112:4:0::1;37087:29;:4:::0;;-1:-1:-1;;37092:15:0;;37087:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37087:21:0::1;-1:-1:-1::0;;;;;37087:29:0::1;;37079:70;;;::::0;;-1:-1:-1;;;37079:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37079:70:0;;;;;;;;;;;;;::::1;;37170:54;37200:7;37209:8;37219:4;;37170:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37170:29:0::1;::::0;-1:-1:-1;;;37170:54:0:i:1;:::-;37160:64;;37274:12;37243:7;37268:1;37251:7;:14;:18;37243:27;;;;;;;;;;;;;;:43;;37235:98;;;;-1:-1:-1::0;;;37235:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37344:140;37390:4;;37395:1;37390:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37390:7:0::1;37399:10;37411:50;37435:7;37444:4;;37449:1;37444:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37444:7:0::1;37453:4;;37458:1;37453:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37453:7:0::1;37411:23;:50::i;:::-;37463:7;37471:1;37463:10;;;;;;;;;;;;;;37344:31;:140::i;:::-;37495:35;37501:7;37510:4;;37495:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37524:4:0::1;::::0;-1:-1:-1;37495:5:0::1;::::0;-1:-1:-1;;37495:35:0:i:1;:::-;37547:4;-1:-1:-1::0;;;;;37541:20:0::1;;37562:7;37587:1;37570:7;:14;:18;37562:27;;;;;;;;;;;;;;37541:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37601:63;37632:2;37636:7;37661:1;37644:7;:14;:18;37636:27;;;;;;;;;;;;;;37601:30;:63::i;:::-;36826:846:::0;;;;;;;;;:::o;43440:252::-;43584:21;43630:54;43659:7;43668:9;43679:4;43630:28;:54::i;:::-;43623:61;;43440:252;;;;;:::o;30215:675::-;30521:12;30535;30560;30575:48;30599:7;30608:6;30616;30575:23;:48::i;:::-;30560:63;;30634:10;30647;:33;;30671:9;30647:33;;;-1:-1:-1;;30647:33:0;30691:79;;;-1:-1:-1;;;30691:79:0;;30718:10;30691:79;;;;30738:4;30691:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30634:46;;-1:-1:-1;;;;;;30691:26:0;;;;;:79;;;;;-1:-1:-1;;30691:79:0;;;;;;;;-1:-1:-1;30691:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30802:80;30818:6;30826;30834:9;30845:10;30857;30869:2;30873:8;30802:15;:80::i;:::-;30781:101;;;;;;;;30215:675;;;;;;;;;;;;;;;;:::o;34057:625::-;34281:21;34262:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;34325:54:::1;34355:7;34364:8;34374:4;;34325:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34325:29:0::1;::::0;-1:-1:-1;;;34325:54:0:i:1;:::-;34315:64;;34429:12;34398:7;34423:1;34406:7;:14;:18;34398:27;;;;;;;;;;;;;;:43;;34390:98;;;;-1:-1:-1::0;;;34390:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34499:140;34545:4;;34550:1;34545:7;;;;;;34499:140;34650:24;34656:7;34665:4;;34650:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34671:2:0;;-1:-1:-1;34650:5:0::1;::::0;-1:-1:-1;;34650:24:0:i:1;35996:824::-:0;36210:21;36182:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36282:4:0::1;36257:29;:4:::0;;-1:-1:-1;;36262:15:0;;36257:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36257:21:0::1;-1:-1:-1::0;;;;;36257:29:0::1;;36249:70;;;::::0;;-1:-1:-1;;;36249:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36249:70:0;;;;;;;;;;;;;::::1;;36340:54;36369:7;36378:9;36389:4;;36340:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36340:28:0::1;::::0;-1:-1:-1;;;36340:54:0:i:1;:::-;36330:64;;36427:11;36413:7;36421:1;36413:10;;;;;;;;;;;;;;:25;;36405:76;;;;-1:-1:-1::0;;;36405:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24957:25:::0;;;-1:-1:-1;;;;;24957:25:0;;:::o;25124:106::-;2340:12;:10;:12::i;:::-;-1:-1:-1;;;;;2329:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2329:23:0;;2321:68;;;;;-1:-1:-1;;;2321:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25197:10:::1;:25:::0;;-1:-1:-1;;;;;;25197:25:0::1;-1:-1:-1::0;;;;;25197:25:0;;;::::1;::::0;;;::::1;::::0;;25124:106::o;32348:716::-;32666:14;32693:12;32708:45;32732:7;32741:5;32748:4;32708:23;:45::i;:::-;32693:60;;32764:10;32777;:33;;32801:9;32777:33;;;-1:-1:-1;;32777:33:0;32821:79;;;-1:-1:-1;;;32821:79:0;;32848:10;32821:79;;;;32868:4;32821:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32764:46;;-1:-1:-1;;;;;;32821:26:0;;;;;:79;;;;;-1:-1:-1;;32821:79:0;;;;;;;;-1:-1:-1;32821:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32923:133;32985:5;32992:9;33003:14;33019:12;33033:2;33037:8;32923:47;:133::i;:::-;32911:145;32348:716;-1:-1:-1;;;;;;;;;;;;;32348:716:0:o;39993:712::-;40227:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;40248:138:::1;40294:4;;40299:1;40294:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;40294:7:0::1;40303:10;40315:50;40339:7;40348:4;;40353:1;40348:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;40348:7:0::1;40357:4;;40362:1;40357:7;;;;;;40315:50;40367:8;40248:31;:138::i;:::-;40397:18;40425:4:::0;;-1:-1:-1;;40430:15:0;;40425:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40425:21:0::1;-1:-1:-1::0;;;;;40418:39:0::1;;40458:2;40418:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40418:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40418:43:0;40472:44:::1;::::0;;40418:43:::1;40472:44:::0;;::::1;::::0;;;;;;;;;;;40418:43;;-1:-1:-1;40472:44:0::1;::::0;;;40507:4;;;;;;40472:44;::::1;::::0;40507:4;;40472:44;40507:4;40472:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;40513:2:0;;-1:-1:-1;40472:34:0::1;::::0;-1:-1:-1;;40472:44:0:i:1;:::-;40615:12:::0;40549:62:::1;40597:13:::0;40556:4;;-1:-1:-1;;40561:15:0;;40556:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;40556:21:0::1;-1:-1:-1::0;;;;;40549:39:0::1;;40589:2;40549:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;40549:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40549:43:0;;:47:::1;:62::i;:::-;:78;;40527:170;;;;-1:-1:-1::0;;;40527:170:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25107:1;39993:712:::0;;;;;;;:::o;2760:148::-;2340:12;:10;:12::i;:::-;-1:-1:-1;;;;;2329:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2329:23:0;;2321:68;;;;;-1:-1:-1;;;2321:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2867:1:::1;2851:6:::0;;2830:40:::1;::::0;-1:-1:-1;;;;;2851:6:0;;::::1;::::0;2830:40:::1;::::0;2867:1;;2830:40:::1;2898:1;2881:19:::0;;-1:-1:-1;;;;;;2881:19:0::1;::::0;;2760:148::o;41564:840::-;41831:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41890:4:0::1;41865:29;:4:::0;;-1:-1:-1;;41870:15:0;;41865:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41865:21:0::1;-1:-1:-1::0;;;;;41865:29:0::1;;41857:70;;;::::0;;-1:-1:-1;;;41857:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41857:70:0;;;;;;;;;;;;;::::1;;41938:138;41984:4;;41989:1;41984:7;;;;;;41938:138;42087:55;42122:4;;42087:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42136:4:0::1;::::0;-1:-1:-1;42087:34:0::1;::::0;-1:-1:-1;;42087:55:0:i:1;:::-;42153:14;42177:4;-1:-1:-1::0;;;;;42170:22:0::1;;42201:4;42170:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;42170:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42170:37:0;;-1:-1:-1;42226:25:0;;::::1;;42218:80;;;;-1:-1:-1::0;;;42218:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42315:4;-1:-1:-1::0;;;;;42309:20:0::1;;42330:9;42309:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42351:45;42382:2;42386:9;42351:30;:45::i;35297:693::-:0;35513:21;35485:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;35571:4:::1;-1:-1:-1::0;;;;;35560:15:0::1;:4;;35565:1;35560:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35560:7:0::1;-1:-1:-1::0;;;;;35560:15:0::1;;35552:56;;;::::0;;-1:-1:-1;;;35552:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35552:56:0;;;;;;;;;;;;;::::1;;35629:55;35659:7;35668:9;35679:4;;35629:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35629:29:0::1;::::0;-1:-1:-1;;;35629:55:0:i:1;:::-;35619:65;;35734:12;35703:7;35728:1;35711:7;:14;:18;35703:27;;;;;;;;;;;;;;:43;;35695:98;;;;-1:-1:-1::0;;;35695:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35810:4;-1:-1:-1::0;;;;;35804:19:0::1;;35831:7;35839:1;35831:10;;;;;;;;;;;;;;35804:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;35868:4;-1:-1:-1::0;;;;;35862:20:0::1;;35883:50;35907:7;35916:4;;35921:1;35916:7;;;;;;35883:50;35935:7;35943:1;35935:10;;;;;;;;;;;;;;35862:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;35862:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35862:84:0;35855:92:::1;;;;35958:24;35964:7;35973:4;;35958:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35979:2:0;;-1:-1:-1;35958:5:0::1;::::0;-1:-1:-1;;35958:24:0:i:1;:::-;35297:693:::0;;;;;;;;:::o;42912:260::-;43065:13;43103:61;43131:9;43142;43153:10;43103:27;:61::i;34688:603::-;34912:21;34893:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;34956:54:::1;34985:7;34994:9;35005:4;;34956:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34956:28:0::1;::::0;-1:-1:-1;;;34956:54:0:i:1;:::-;34946:64;;35043:11;35029:7;35037:1;35029:10;;;;;;;;;;;;;;:25;;35021:76;;;;-1:-1:-1::0;;;35021:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2109:87:::0;2155:7;2182:6;-1:-1:-1;;;;;2182:6:0;2109:87;:::o;24912:38::-;;;:::o;42448:187::-;42545:12;42577:50;42599:7;42608:8;42618;42577:21;:50::i;31642:700::-;31908:14;31889:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;31951:196:::1;31981:5;32001:4;32020:9;32044:14;32073:12;32108:4;32128:8;31951:15;:196::i;:::-;31935:212;;;;;;32158:78;32186:5;32193:2;32204:5;-1:-1:-1::0;;;;;32197:23:0::1;;32229:4;32197:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;32197:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32197:38:0;32158:27:::1;:78::i;:::-;32253:4;-1:-1:-1::0;;;;;32247:20:0::1;;32268:9;32247:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32289:45;32320:2;32324:9;32289:30;:45::i;40711:847::-:0;40971:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;41016:4:::1;-1:-1:-1::0;;;;;41005:15:0::1;:4;;41010:1;41005:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;41005:7:0::1;-1:-1:-1::0;;;;;41005:15:0::1;;40997:56;;;::::0;;-1:-1:-1;;;40997:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;40997:56:0;;;;;;;;;;;;;::::1;;41064:13;41080:9;41064:25;;41106:4;-1:-1:-1::0;;;;;41100:19:0::1;;41127:8;41100:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;41162:4;-1:-1:-1::0;;;;;41156:20:0::1;;41177:50;41201:7;41210:4;;41215:1;41210:7;;;;;;41177:50;41229:8;41156:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;41156:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41156:82:0;41149:90:::1;;;;41250:18;41278:4:::0;;-1:-1:-1;;41283:15:0;;41278:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41278:21:0::1;-1:-1:-1::0;;;;;41271:39:0::1;;41311:2;41271:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;41271:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41271:43:0;41325:44:::1;::::0;;41271:43:::1;41325:44:::0;;::::1;::::0;;;;;;;;;;;41271:43;;-1:-1:-1;41325:44:0::1;::::0;;;41360:4;;;;;;41325:44;::::1;::::0;41360:4;;41325:44;41360:4;41325:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;41366:2:0;;-1:-1:-1;41325:34:0::1;::::0;-1:-1:-1;;41325:44:0:i:1;:::-;41468:12:::0;41402:62:::1;41450:13:::0;41409:4;;-1:-1:-1;;41414:15:0;;41409:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;41409:21:0::1;-1:-1:-1::0;;;;;41402:39:0::1;;41442:2;41402:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;41402:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;28671:859:::0;28925:12;28939;28906:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;28964:12:::1;28979:48;29003:7;29012:6;29020;28979:23;:48::i;:::-;29038:61;::::0;;-1:-1:-1;;;29038:61:0;;29071:10:::1;29038:61;::::0;::::1;::::0;-1:-1:-1;;;;;29038:32:0;::::1;:61:::0;;;;;;;;;;;;;;28964:63;;-1:-1:-1;29038:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;29038:32:0;:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;29167:28:0::1;::::0;;-1:-1:-1;;;29167:28:0;;-1:-1:-1;;;;;29167:28:0;;::::1;;::::0;::::1;::::0;;;29137:12:::1;::::0;;;29167:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;29137:12;29167:24;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29167:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;29167:28:0;-1:-1:-1;29207:14:0::1;29226:42;29253:6:::0;29261;29226:26:::1;:42::i;:::-;29206:62;;;29310:6;-1:-1:-1::0;;;;;29300:16:0::1;:6;-1:-1:-1::0;;;;;29300:16:0::1;;:58;;29341:7;29350;29300:58;;;29320:7;29329;29300:58;29279:79:::0;;-1:-1:-1;29279:79:0;-1:-1:-1;29377:21:0;;::::1;;29369:71;;;;-1:-1:-1::0;;;29369:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29470:10;29459:7;:21;;29451:71;;;;-1:-1:-1::0;;;29451:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25107:1;;;;28671:859:::0;;;;;;;;;;;:::o;24864:41::-;;;:::o;43180:252::-;43324:21;43370:54;43400:7;43409:8;43419:4;43370:29;:54::i;30896:667::-;31185:16;31203:14;31230:12;31245:45;31269:7;31278:5;31285:4;31245:23;:45::i;:::-;31230:60;;31301:10;31314;:33;;31338:9;31314:33;;;-1:-1:-1;;31314:33:0;31358:79;;;-1:-1:-1;;;31358:79:0;;31385:10;31358:79;;;;31405:4;31358:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31301:46;;-1:-1:-1;;;;;;31358:26:0;;;;;:79;;;;;-1:-1:-1;;31358:79:0;;;;;;;;-1:-1:-1;31358:26:0;:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31475:80;31494:5;31501:9;31512:14;31528:12;31542:2;31546:8;31475:18;:80::i;:::-;31448:107;;;;-1:-1:-1;30896:667:0;-1:-1:-1;;;;;;;;;;;;;30896:667:0:o;26914:736::-;27202:12;27216;27230:14;27183:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;27278:85:::1;27292:6;27300;27308:14;27324;27340:10;27352;27278:13;:85::i;:::-;27257:106:::0;;-1:-1:-1;27257:106:0;-1:-1:-1;27374:12:0::1;27389:48;27413:7;27422:6:::0;27430;27389:23:::1;:48::i;:::-;27374:63;;27448:66;27480:6;27488:10;27500:4;27506:7;27448:31;:66::i;:::-;27525;27557:6;27565:10;27577:4;27583:7;27525:31;:66::i;:::-;27628:4;-1:-1:-1::0;;;;;27614:24:0::1;;27639:2;27614:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;27614:28:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27614:28:0;26914:736;;;;-1:-1:-1;27614:28:0;;-1:-1:-1;26914:736:0;;-1:-1:-1;;;;;;;;;26914:736:0:o;3063:244::-;2340:12;:10;:12::i;:::-;-1:-1:-1;;;;;2329:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2329:23:0;;2321:68;;;;;-1:-1:-1;;;2321:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3152:22:0;::::1;3144:73;;;;-1:-1:-1::0;;;3144:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3254:6;::::0;;3233:38:::1;::::0;-1:-1:-1;;;;;3233:38:0;;::::1;::::0;3254:6;::::1;::::0;3233:38:::1;::::0;::::1;3282:6;:17:::0;;-1:-1:-1;;;;;;3282:17:0::1;-1:-1:-1::0;;;;;3282:17:0;;;::::1;::::0;;;::::1;::::0;;3063:244::o;27656:972::-;27909:16;27927:14;27943;27890:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;27997:176:::1;28025:5;28045:4;28064:18;28097:9;28121:14;28150:12;27997:13;:176::i;:::-;27970:203:::0;;-1:-1:-1;27970:203:0;-1:-1:-1;28184:12:0::1;28199:45;28223:7;28232:5:::0;28239:4:::1;28199:23;:45::i;:::-;28184:60;;28255:69;28287:5;28294:10;28306:4;28312:11;28255:31;:69::i;:::-;28341:4;-1:-1:-1::0;;;;;28335:19:0::1;;28362:9;28335:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28398:4;-1:-1:-1::0;;;;;28392:20:0::1;;28413:4;28419:9;28392:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;28392:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28392:37:0;28385:45:::1;;;;28467:4;-1:-1:-1::0;;;;;28453:24:0::1;;28478:2;28453:28;;;;;;;;;;;;;-1:-1:-1::0;;;;;28453:28:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28453:28:0;;-1:-1:-1;28532:9:0::1;:21:::0;-1:-1:-1;28528:92:0::1;;;28555:65;28586:10;28610:9;28598;:21;28555:30;:65::i;:::-;25107:1;27656:972:::0;;;;;;;;;;;:::o;37678:806::-;37891:21;37863:8;25053:15;25041:8;:27;;25033:63;;;;;-1:-1:-1;;;25033:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25033:63:0;;;;;;;;;;;;;;;37949:4:::1;-1:-1:-1::0;;;;;37938:15:0::1;:4;;37943:1;37938:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37938:7:0::1;-1:-1:-1::0;;;;;37938:15:0::1;;37930:56;;;::::0;;-1:-1:-1;;;37930:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37930:56:0;;;;;;;;;;;;;::::1;;38007:54;38036:7;38045:9;38056:4;;38007:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38007:28:0::1;::::0;-1:-1:-1;;;38007:54:0:i:1;:::-;37997:64;;38094:9;38080:7;38088:1;38080:10;;;;;;;;;;;;;;:23;;38072:74;;;;-1:-1:-1::0;;;38072:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38163:4;-1:-1:-1::0;;;;;38157:19:0::1;;38184:7;38192:1;38184:10;;;;;;;;;;;;;;38157:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;38221:4;-1:-1:-1::0;;;;;38215:20:0::1;;38236:50;38260:7;38269:4;;38274:1;38269:7;;;;;;38236:50;38288:7;38296:1;38288:10;;;;;;;;;;;;;;38215:84;;;;;;;;;;;;;-1:-1:-1::0;;;;;38215:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38215:84:0;38208:92:::1;;;;38311:24;38317:7;38326:4;;38311:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38332:2:0;;-1:-1:-1;38311:5:0::1;::::0;-1:-1:-1;;38311:24:0:i:1;:::-;38398:7;38406:1;38398:10;;;;;;;;;;;;;;38386:9;:22;38382:94;;;38410:66;38441:10;38465:7;38473:1;38465:10;;;;;;;;;;;;;;38453:9;:22;38410:30;:66::i;17803:361::-:0;17998:45;;;-1:-1:-1;;;;;17998:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17998:45:0;-1:-1:-1;;;17998:45:0;;;17987:57;;;;17952:12;;17966:17;;17987:10;;;;17998:45;17987:57;;;17998:45;17987:57;;17998:45;17987:57;;;;;;;;;;-1:-1:-1;;17987:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17951:93;;;;18063:7;:57;;;;-1:-1:-1;18075:11:0;;:16;;:44;;;18106:4;18095:24;;;;;;;;;;;;;;;-1:-1:-1;18095:24:0;18075:44;18055:101;;;;;-1:-1:-1;;;18055:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17803:361;;;;;:::o;18582:195::-;18690:12;;;18652;18690;;;;;;;;;-1:-1:-1;;;;;18669:7:0;;;18683:5;;18669:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18669:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18651:52;;;18722:7;18714:55;;;;-1:-1:-1;;;18714:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18582:195;;;:::o;14906:515::-;14999:14;15045:1;15034:8;:12;15026:67;;;;-1:-1:-1;;;15026:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15124:1;15112:9;:13;:31;;;;;15142:1;15129:10;:14;15112:31;15104:83;;;;-1:-1:-1;;;15104:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15198:20;15221:17;:8;15234:3;15221:12;:17::i;:::-;15198:40;-1:-1:-1;15249:14:0;15266:31;15198:40;15286:10;15266:19;:31::i;:::-;15249:48;-1:-1:-1;15308:16:0;15327:40;15351:15;15327:19;:9;15341:4;15327:13;:19::i;:::-;:23;;:40::i;:::-;15308:59;;15402:11;15390:9;:23;;;;;;;14906:515;-1:-1:-1;;;;;;;14906:515:0:o;16094:510::-;16195:21;16252:1;16237:4;:11;:16;;16229:58;;;;;-1:-1:-1;;;16229:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16319:4;:11;16308:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16308:23:0;;16298:33;;16355:8;16342:7;16350:1;16342:10;;;;;;;;;;;;;:21;;;;;16379:6;16374:223;16405:1;16391:4;:11;:15;16387:1;:19;16374:223;;;16429:14;16445:15;16464:42;16476:7;16485:4;16490:1;16485:7;;;;;;;;;;;;;;16494:4;16499:1;16503;16499:5;16494:11;;;;;;;;;;;;;;16464;:42::i;:::-;16428:78;;;;16538:47;16551:7;16559:1;16551:10;;;;;;;;;;;;;;16563:9;16574:10;16538:12;:47::i;:::-;16521:7;16529:1;16533;16529:5;16521:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;16408:3:0;;16374:223;;;;16094:510;;;;;:::o;13383:478::-;13472:12;13498:14;13514;13532:26;13543:6;13551;13532:10;:26::i;:::-;13696:32;;;-1:-1:-1;;13696:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13686:43;;;;;;-1:-1:-1;;;;;;13599:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13589:262;;;;;;;;;13383:478;-1:-1:-1;;;;;13383:478:0:o;18172:402::-;18397:51;;;-1:-1:-1;;;;;18397:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18397:51:0;-1:-1:-1;;;18397:51:0;;;18386:63;;;;18351:12;;18365:17;;18386:10;;;;18397:51;18386:63;;;18397:51;18386:63;;18397:51;18386:63;;;;;;;;;;-1:-1:-1;;18386:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18350:99;;;;18468:7;:57;;;;-1:-1:-1;18480:11:0;;:16;;:44;;;18511:4;18500:24;;;;;;;;;;;;;;;-1:-1:-1;18500:24:0;18480:44;18460:106;;;;-1:-1:-1;;;18460:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18172:402;;;;;;:::o;33175:876::-;33282:6;33277:767;33308:1;33294:4;:11;:15;33290:1;:19;33277:767;;;33332:13;33347:14;33366:4;33371:1;33366:7;;;;;;;;;;;;;;33375:4;33380:1;33384;33380:5;33375:11;;;;;;;;;;;;;;33331:56;;;;33403:14;33422:41;33449:5;33456:6;33422:26;:41::i;:::-;33402:61;;;33478:14;33495:7;33503:1;33507;33503:5;33495:14;;;;;;;;;;;;;;;;;;33528:10;;33495:14;;-1:-1:-1;;;;;;33528:10:0;:24;33524:131;;33585:10;;33573:66;;;-1:-1:-1;;;33573:66:0;;33602:10;33573:66;;;;-1:-1:-1;;;;;33573:66:0;;;;;;;;;;;;;;;;;;;;;;33585:10;;;;;33573:28;;:66;;;;;;;;;;;;;;33585:10;;33573:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33524:131:0;33670:15;33687;33715:6;-1:-1:-1;;;;;33706:15:0;:5;-1:-1:-1;;;;;33706:15:0;;:61;;33748:9;33764:1;33706:61;;;33730:1;33734:9;33706:61;33669:98;;;;33782:10;33813:1;33799:4;:11;:15;33795:1;:19;:81;;33873:3;33795:81;;;33817:53;33841:7;33850:6;33858:4;33863:1;33867;33863:5;33858:11;;;;;;;;;;;;;;33817:23;:53::i;:::-;33782:94;;33905:47;33929:7;33938:5;33945:6;33905:23;:47::i;:::-;-1:-1:-1;;;;;33891:67:0;;33977:10;33989;34001:2;34015:1;34005:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34005:12:0;;33891:141;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33891:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33311:3:0;;;;;-1:-1:-1;33277:767:0;;-1:-1:-1;;;;;;;;33277:767:0;;;33175:876;;;:::o;16685:531::-;16786:21;16843:1;16828:4;:11;:16;;16820:58;;;;;-1:-1:-1;;;16820:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16910:4;:11;16899:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16899:23:0;;16889:33;;16963:9;16933:7;16958:1;16941:7;:14;:18;16933:27;;;;;;;;;;;;;;;;;:39;16997:11;;-1:-1:-1;;16997:15:0;16983:226;17014:5;;16983:226;;17042:14;17058:15;17077:42;17089:7;17098:4;17107:1;17103;:5;17098:11;;;;;;;;;;;;;;17111:4;17116:1;17111:7;;;;;;;17077:42;17041:78;;;;17151:46;17163:7;17171:1;17163:10;;;;;;;;;;;;;;17175:9;17186:10;17151:11;:46::i;:::-;17134:7;17146:1;17142;:5;17134:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;17021:3:0;16983:226;;657:106;745:10;657:106;:::o;38631:1356::-;38744:6;38739:1241;38770:1;38756:4;:11;:15;38752:1;:19;38739:1241;;;38794:13;38809:14;38828:4;38833:1;38828:7;;;;;;;;;;;;;;38837:4;38842:1;38846;38842:5;38837:11;;;;;;;;;;;;;;38793:56;;;;38865:14;38884:41;38911:5;38918:6;38884:26;:41::i;:::-;38864:61;;;38940:18;38975:47;38999:7;39008:5;39015:6;38975:23;:47::i;:::-;38940:83;;39038:16;39069:17;39157:13;39172;39190:4;-1:-1:-1;;;;;39190:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39190:18:0;;;;;;;-1:-1:-1;;;;;39156:52:0;;;;-1:-1:-1;39156:52:0;;-1:-1:-1;39224:17:0;;-1:-1:-1;;;;;39265:15:0;;;;;;;:61;;39307:8;39317;39265:61;;;39284:8;39294;39265:61;39223:103;;;;39355:56;39398:12;39362:5;-1:-1:-1;;;;;39355:23:0;;39387:4;39355:38;;;;;;;;;;;;;-1:-1:-1;;;;;39355:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;:56;39341:70;;39441;39470:11;39483:12;39497:13;39441:28;:70::i;:::-;39545:10;;39426:85;;-1:-1:-1;;;;;;39545:10:0;:24;;-1:-1:-1;39541:134:0;;-1:-1:-1;;;39541:134:0;39602:10;;39590:69;;;-1:-1:-1;;;39590:69:0;;39619:10;39590:69;;;;-1:-1:-1;;;;;39590:69:0;;;;;;;;;;;;;;;;;;;;;;39602:10;;;;;39590:28;;:69;;;;;;;;;;;;;;39602:10;;39590:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39541:134:0;39690:15;39707;39735:6;-1:-1:-1;;;;;39726:15:0;:5;-1:-1:-1;;;;;39726:15:0;;:67;;39771:12;39790:1;39726:67;;;39750:1;39754:12;39726:67;39689:104;;;;39808:10;39839:1;39825:4;:11;:15;39821:1;:19;:81;;39899:3;39821:81;;;39843:53;39867:7;39876:6;39884:4;39889:1;39893;39889:5;39884:11;;;;;;;39843:53;39955:12;;;39965:1;39955:12;;;;;;;;;;-1:-1:-1;;;39917:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39917:51:0;;;;;;;;;;;;;;;;;;;;;;39808:94;;-1:-1:-1;39917:9:0;;;;;;39927:10;;39939;;39808:94;;39955:12;;39917:51;;;;;;;;39955:12;;39917:51;;;;39955:12;;39917:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38773:3:0;;;;;-1:-1:-1;38739:1241:0;;-1:-1:-1;;;;;;;;;;38739:1241:0;8051:136;8109:7;8136:43;8140:1;8143;8136:43;;;;;;;;;;;;;;;;;:3;:43::i;15542:470::-;15635:13;15681:1;15669:9;:13;15661:69;;;;-1:-1:-1;;;15661:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15761:1;15749:9;:13;:31;;;;;15779:1;15766:10;:14;15749:31;15741:83;;;;-1:-1:-1;;;15741:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15835:14;15852:34;15881:4;15852:24;:9;15866;15852:13;:24::i;:::-;:28;;:34::i;:::-;15835:51;-1:-1:-1;15897:16:0;15916:34;15946:3;15916:25;:10;15931:9;15916:14;:25::i;:34::-;15897:53;;15972:32;16002:1;15985:11;15973:9;:23;;;;;;;15972:29;:32::i;:::-;15961:43;15542:470;-1:-1:-1;;;;;;15542:470:0:o;14465:319::-;14547:12;14590:1;14580:7;:11;14572:60;;;;-1:-1:-1;;;14572:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14662:1;14651:8;:12;:28;;;;;14678:1;14667:8;:12;14651:28;14643:80;;;;-1:-1:-1;;;14643:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14768:8;14744:21;:7;14756:8;14744:11;:21::i;:::-;:32;;;;;;;14465:319;-1:-1:-1;;;;14465:319:0:o;12944:347::-;13019:14;13035;13080:6;-1:-1:-1;;;;;13070:16:0;:6;-1:-1:-1;;;;;13070:16:0;;;13062:65;;;;-1:-1:-1;;;13062:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13166:6;-1:-1:-1;;;;;13157:15:0;:6;-1:-1:-1;;;;;13157:15:0;;:53;;13195:6;13203;13157:53;;;13176:6;13184;13157:53;13138:72;;-1:-1:-1;13138:72:0;-1:-1:-1;;;;;;13229:20:0;;13221:62;;;;;-1:-1:-1;;;13221:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12944:347;;;;;:::o;25525:1383::-;25743:12;25757;25899:1;-1:-1:-1;;;;;25838:63:0;25855:7;-1:-1:-1;;;;;25838:33:0;;25872:6;25880;25838:49;;;;;;;;;;;;;-1:-1:-1;;;;;25838:49:0;;;;;;-1:-1:-1;;;;;25838:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25838:49:0;-1:-1:-1;;;;;25838:63:0;;25834:148;;;25935:7;-1:-1:-1;;;;;25918:36:0;;25955:6;25963;25918:52;;;;;;;;;;;;;-1:-1:-1;;;;;25918:52:0;;;;;;-1:-1:-1;;;;;25918:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25834:148:0;25993:13;26008;26025:52;26053:7;26062:6;26070;26025:27;:52::i;:::-;25992:85;;;;26092:8;26104:1;26092:13;:30;;;;-1:-1:-1;26109:13:0;;26092:30;26088:813;;;26161:14;;-1:-1:-1;26177:14:0;;-1:-1:-1;26088:813:0;;;26225:19;26247:57;26269:14;26285:8;26295;26247:21;:57::i;:::-;26225:79;;26341:14;26323;:32;26319:571;;26402:10;26384:14;:28;;26376:78;;;;-1:-1:-1;;;26376:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26495:14;;-1:-1:-1;26511:14:0;-1:-1:-1;26511:14:0;26319:571;;;26567:19;26589:57;26611:14;26627:8;26637;26589:21;:57::i;:::-;26567:79;;26690:14;26672;:32;;26665:40;;;;26750:10;26732:14;:28;;26724:78;;;;-1:-1:-1;;;26724:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26843:14;-1:-1:-1;26859:14:0;;-1:-1:-1;26319:571:0;26088:813;;25525:1383;;;;;;;;;;;:::o;8975:471::-;9033:7;9278:6;9274:47;;-1:-1:-1;9308:1:0;9301:8;;9274:47;9345:5;;;9349:1;9345;:5;:1;9369:5;;;;;:10;9361:56;;;;-1:-1:-1;;;9361:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7587:181;7645:7;7677:5;;;7701:6;;;;7693:46;;;;;-1:-1:-1;;;7693:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13919:433;14012:13;14027;14054:14;14073:26;14084:6;14092;14073:10;:26::i;:::-;14053:46;;;14110:32;14118:7;14127:6;14135;14110:7;:32::i;:::-;;14154:13;14169;14201:32;14209:7;14218:6;14226;14201:7;:32::i;:::-;-1:-1:-1;;;;;14187:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14187:61:0;;;;;;;-1:-1:-1;;;;;14153:95:0;;;;-1:-1:-1;14153:95:0;;-1:-1:-1;;;;;;14282:16:0;;;;;;;:62;;14325:8;14335;14282:62;;;14302:8;14312;14282:62;14259:85;;;;-1:-1:-1;13919:433:0;-1:-1:-1;;;;;;;13919:433:0:o;8490:226::-;8610:7;8646:12;8638:6;;;;8630:29;;;;-1:-1:-1;;;8630:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8682:5:0;;;8490:226::o

Swarm Source

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