Contract 0xdb9f9154a7f5830a05882847762eb83ab5144fb5

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x76970652f5570bb69a7e41b75696f0447bf83673457713f959142bac050e869fHarvest92568712021-10-19 17:29:322 hrs 53 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xa04b3debcede52b8b3e832c8f64ce34646746e8a6e5a127f98c1eb8173d9b9fcHarvest92532332021-10-19 14:27:365 hrs 55 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xce46072aeb514ffbe2c62455a5c29f1cc7f1c64ec39679b4b155595e61ecfa46Harvest92494332021-10-19 11:17:369 hrs 5 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x9f1336b6c885ab2079c27938a3c96b1040cebbe3cd462902c33e1e12a05dfcd7Harvest92458082021-10-19 8:16:2012 hrs 6 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001504882.5
0x483b594b2e5c8cd05edae2c96fd37f4b2d2ceb8facf5369ed471d439e103c424Harvest92420082021-10-19 5:06:2015 hrs 16 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xca28acd1935ce07c7c03814804f1a29e5ffafad46abb4d3d95cfa617a6d4ce4eHarvest92382082021-10-19 1:56:2018 hrs 26 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x7fca05c89f07244a5ac69a7b43783078c8961e827189dee4e63ca9cf17a6a527Harvest92344082021-10-18 22:46:2021 hrs 36 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x4557918fce90f1e042a8ad99397d10435bbcd6fcc3c4cf195d670da52dc9498dHarvest92306082021-10-18 19:36:201 day 46 mins ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x469e28faaedfced1433d2868d2d0f95a5fe6e8269fc4ca71cdd790c405ade762Harvest92268092021-10-18 16:26:221 day 3 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x520616dccbffcc6484c297f3853b7240265ee7d8d5c025ed940adfcb44fee336Harvest92230102021-10-18 13:16:201 day 7 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x992118ebf2a0840ca4151d97c86c3e8c2ce46e71a5e7667a7ea7d4278ce57617Harvest92192112021-10-18 10:06:221 day 10 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xd2b8cd75cf4e5e425621330ff5afbf8b55a6e0ff6d0faa456a0aebc70afccc9bHarvest92154112021-10-18 6:56:221 day 13 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xb79447492b00a21f2cd84e891f309cd29df11528211f62384fb0d1090d34ab32Harvest92116112021-10-18 3:46:221 day 16 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xda49425c4c95102b1d11fc3c2d6c91471c2d2a85000113cd7731cd7b0b2893f9Harvest92078112021-10-18 0:36:221 day 19 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001548952.5
0x2205ba6caff02892a99053f2f0dbaa10959a008cf1d03c5ef4ac376a129bc05eHarvest92040112021-10-17 21:26:221 day 22 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x55a1695b95cfeca41d17ab848baffdad69116c174724d47876f27fb765936597Harvest92002102021-10-17 18:16:192 days 2 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x4af34d10db5af73cfda3183d0ace313c97d3c77d392b46d424b32a091c94db50Harvest91996612021-10-17 17:48:522 days 2 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x19a4ef0786722ee0b13e4f45bcd3b8ce94b9c0c6136350aa62f0d417cddef94bHarvest91718892021-10-16 18:40:163 days 1 hr ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0xcec62033f77838c00f00919b0484f286300c50d3ff83397a1c4d36d1a9acbbb8Harvest91715642021-10-16 18:24:013 days 1 hr ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001504882.5
0x664b7c463deb8b5cff112db45844d1d50bace7bc5afbe6a864ea91149372b9c5Harvest91622892021-10-16 10:40:163 days 9 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001504882.5
0x10793ad42c29f20cba1db401b7363ed498a7e61d8b30424c2966170f3355bcf4Harvest91619642021-10-16 10:24:013 days 9 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001499882.5
0x1fb3b2b2c9ef8aa0712959d35f558e9a212d2cf2d4d7244beabc1ad2021c98b5Harvest91427642021-10-15 18:24:014 days 1 hr ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001499882.5
0xb5b193230a23f188bb93a0753ac8c2ae84fb01fe5f639fd71181a8602cf49f81Harvest91331482021-10-15 10:23:134 days 9 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001570382.5
0x383e0f2731e9913f850e77af31ee6df8687129228bfe691fcdb60d67835de1ddHarvest91134792021-10-14 17:59:415 days 2 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
0x8c830344f0ac3f9c87a949f376be04123f11e02f91bde2fec47e355fe213071bHarvest91134762021-10-14 17:59:325 days 2 hrs ago0xe768008aa0fb1f70222007d55f2e2ab7498c77d5 IN  0xdb9f9154a7f5830a05882847762eb83ab5144fb50 HT0.001575382.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x5e44C99eba77Df7a322d07e0202c985e5C982c20

Contract Name:
MdexBoardroomLPStrategy

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-03-26
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-03-22
*/

// File: @openzeppelin/contracts/math/Math.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/interfaces/mdex/IMDexRouter.sol



pragma solidity >=0.5.0;


interface IMDexRouter {

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


    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);

}

// File: contracts/interfaces/yearn/IVault.sol



pragma solidity =0.6.12;

interface IVault {

    function stake(uint) external;

    function exit() external;

    function withdraw(uint) external;

    function getPricePerFullShare() external view returns (uint);

    function underlying() external view returns (address);

    function strategy() external view returns (address);

    function setStrategy(address) external;

}

// File: contracts/interfaces/yearn/IStrategy.sol



pragma solidity =0.6.12;


interface IStrategy {

    function underlying() external view returns (address);

    function underlyingBalance() external view returns (uint);

    function vault() external view returns (address);

    function invest() external;

    function harvest() external;

    function withdrawToVault(uint) external;

    function withdrawAllToVault() external;

    function salvageToken(address) external returns (uint balance);


}

// File: contracts/interfaces/IMasterChef.sol



pragma solidity =0.6.12;

interface IMasterChef {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function pending(uint256 _pid, address _user) external view returns (uint256);
    function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt);
    function poolInfo(uint256 _pid) external view returns (address lpToken, uint256, uint256, uint256);
    function emergencyWithdraw(uint256 pid) external;
}

// File: contracts/interfaces/mdex/IMdexPair.sol



pragma solidity >=0.5.0 <0.8.0;

interface IMdexPair {
    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 price(address token, uint256 baseDecimal) external view returns (uint256);

    function initialize(address, address) external;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/interfaces/yearn/IController.sol



pragma solidity =0.6.12;

interface IController {

    function underlying(address) external view returns (address);

    function feeManager() external view returns (address);

    function check(address _target) external view returns (bool);
}

// File: contracts/interfaces/mdex/ISwapMining.sol



pragma solidity =0.6.12;

interface ISwapMining {
    function takerWithdraw() external;
}

// File: @openzeppelin/contracts/utils/Context.sol



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: @openzeppelin/contracts/access/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/Operatable.sol


pragma solidity =0.6.12;


// seperate owner and operator, operator is for daily devops, only owner can update operator
contract Operatable is Ownable {
    address public operator;

    event SetOperator(address indexed oldOperator, address indexed newOperator);

    constructor() public {
        operator = msg.sender;
        emit SetOperator(address(0), operator);
    }

    modifier onlyOperator() {
        require(msg.sender == operator, "not operator");
        _;
    }

    function setOperator(address newOperator) public onlyOwner {
        require(newOperator != address(0), "bad new operator");
        address oldOperator = operator;
        operator = newOperator;
        emit SetOperator(oldOperator, newOperator);
    }
}

// File: contracts/lib/TransferHelper.sol


pragma solidity =0.6.12;

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');
    }
}

// File: contracts/strategies/ProfitNotifier.sol


pragma solidity =0.6.12;









abstract contract ProfitNotifier is Operatable, IStrategy {
    using SafeMath for uint;

    uint256 public constant  MAX_FEE = 100;

    uint256 public profitSharingFee;
    address public controller;
    address public routerToken;
    address public swapRouter;
    address public swapMining;
    address public rewardToken;

    address internal  _underlying;
    address internal _vault;

    event ProfitLog(
        uint256 oldBalance,
        uint256 newBalance,
        uint256 feeAmount,
        uint256 timestamp
    );


    constructor(
        address _pvault,
        address _controller,
        address _want,
        address _pswapRouter

    ) Operatable() public {
        _vault = _pvault;
        controller = _controller;
        _underlying = _want;
        swapRouter = _pswapRouter;

        // persist in the state for immutability of the fee
        profitSharingFee = 30;
    }


    modifier restricted() {
        require(msg.sender == _vault || msg.sender == address(controller),
            "The sender has to be the controller or vault");
        _;
    }
    
     modifier operationWithManagerVaultAndController() {
         require(msg.sender == _vault || msg.sender == address(controller) || msg.sender == operator,
             "The sender has to be the controller or vault");
         _;
     }

    modifier vaultControllerAndGeneralUser() {
        require(IController(controller).check(msg.sender) || msg.sender == vault() || msg.sender == controller,
            "address is ban");
        _;
    }

    function setRouterAddress(address _address) onlyOperator external {
        swapRouter = _address;
    }

    function setSwapMining(address _address) onlyOperator external {
        swapMining = _address;
    }

    function setRouterToken(address _address) onlyOperator external {
        routerToken = _address;
    }

    function withdrawSwapMining() external {
        ISwapMining(swapMining).takerWithdraw();
    }

    function notifyProfit(uint256 oldBalance, uint256 newBalance) internal {
        if (newBalance > oldBalance) {
            uint256 profit = newBalance.sub(oldBalance);
            uint256 feeAmount = profit.mul(profitSharingFee).div(MAX_FEE);
            emit ProfitLog(oldBalance, newBalance, feeAmount, block.timestamp);
            TransferHelper.safeTransfer(_underlying, IController(controller).feeManager(), feeAmount);
        } else {
            emit ProfitLog(oldBalance, newBalance, 0, block.timestamp);
        }
    }

    function salvageToken(address _asset) external override returns (uint balance) {
        require(msg.sender == controller, "not operator");
        require(_underlying != _asset, "want");
        balance = IERC20(_asset).balanceOf(address(this));
        TransferHelper.safeTransfer(_asset, controller, balance);
    }

    function setPerformanceFee(uint _performanceFee) onlyOperator external {
        require(_performanceFee <= 35, "fee < 35");
        profitSharingFee = _performanceFee;
    }

    function setController(address payable _controller) onlyOperator external {
        controller = _controller;
    }

    function underlying() public override view returns (address){
        return _underlying;
    }

    function vault() public override view returns (address){
        return _vault;
    }

}

// File: contracts/strategies/AbstractLPStrategy.sol


pragma solidity =0.6.12;









abstract contract AbstractLPStrategy is ProfitNotifier {
    using SafeMath for uint;

    mapping(address => address[]) public mdexRoutes;

    constructor(
        address _vault,
        address _controller,
        address _underlying,
        address _rewardToken,
        address _swapRouter
    ) ProfitNotifier(_vault, _controller, _underlying, _swapRouter) public {
        rewardToken = _rewardToken;
    }

    function setLiquidation(
        address [] memory _routeToToken0, address [] memory _routeToToken1
    ) public onlyOperator {
        address lpToken0 = IMdexPair(underlying()).token0();
        address lpToken1 = IMdexPair(underlying()).token1();
        mdexRoutes[lpToken0] = _routeToToken0;
        mdexRoutes[lpToken1] = _routeToToken1;
    }


    function _liquidateReward() internal {

        uint256 rewardBalance = IERC20(rewardToken).balanceOf(address(this));

        address lpToken0 = IMdexPair(underlying()).token0();
        address lpToken1 = IMdexPair(underlying()).token1();

        address[] memory routesToken0;
        address[] memory routesToken1;

        routesToken0 = mdexRoutes[lpToken0];
        routesToken1 = mdexRoutes[lpToken1];

        uint _beforeBal = IERC20(underlying()).balanceOf(address(this));
        if (rewardBalance > 0 // we have tokens to swap
        && routesToken0.length > 1 // and we have a route to do the swap
            && routesToken1.length > 1 // and we have a route to do the swap
        ) {
            if (rewardToken != lpToken0) {
                IERC20(rewardToken).approve(swapRouter, 0);
                IERC20(rewardToken).approve(swapRouter, rewardBalance);

                IMDexRouter(swapRouter).swapExactTokensForTokens(
                    rewardBalance,
                    1,
                    routesToken0,
                    address(this),
                    block.timestamp
                );
            }
            uint256 lpToken0Amount = IERC20(lpToken0).balanceOf(address(this));

            IERC20(lpToken0).approve(swapRouter, 0);
            IERC20(lpToken0).approve(swapRouter, lpToken0Amount);

            lpToken0Amount = lpToken0Amount.div(2);
            IMDexRouter(swapRouter).swapExactTokensForTokens(
                lpToken0Amount,
                1,
                routesToken1,
                address(this),
                block.timestamp
            );
            uint256 lpToken1Amount = IERC20(lpToken1).balanceOf(address(this));

            IERC20(lpToken1).approve(swapRouter, 0);
            IERC20(lpToken1).approve(swapRouter, lpToken1Amount);

            uint256 liquidity;
            (,, liquidity) = IMDexRouter(swapRouter).addLiquidity(
                lpToken0,
                lpToken1,
                lpToken0Amount,
                lpToken1Amount,
                1, // we are willing to take whatever the pair gives us
                1, // we are willing to take whatever the pair gives us
                address(this),
                block.timestamp
            );
        }
        uint _afterBal = IERC20(_underlying).balanceOf(address(this));
        if (_afterBal > 0) {
            notifyProfit(_beforeBal, _afterBal);
        }
    }
}

// File: contracts/strategies/MdexBoardroomLPStrategy.sol


pragma solidity =0.6.12;









contract MdexBoardroomLPStrategy is AbstractLPStrategy {
    using SafeMath for uint;

    address public rewardPool;
    uint public poolID;

    constructor(
        address _vault,
        address _controller,
        address _underlying,
        address _rewardPool,
        uint256 _poolID,
        address _rewardToken,
        address _swapRouter
    ) AbstractLPStrategy(_vault, _controller, _underlying, _rewardToken, _swapRouter) public {
        address _lpt;
        rewardPool = _rewardPool;
        rewardToken = _rewardToken;
        (_lpt,,,) = IMasterChef(rewardPool).poolInfo(_poolID);
        require(_lpt == underlying(), "Pool Info does not match underlying");

        poolID = _poolID;
    }

    function balanceOfPool() public view returns (uint256 bal) {
        (bal,) = IMasterChef(rewardPool).userInfo(poolId(), address(this));
    }

    function exitRewardPool() internal {
        uint256 bal = balanceOfPool();
        if (bal != 0) {
            IMasterChef(rewardPool).withdraw(poolId(), bal);
        }
    }

    function enterRewardPool() internal {
        uint256 entireBalance = IERC20(underlying()).balanceOf(address(this));
        TransferHelper.safeApprove(underlying(), rewardPool, 0);
        TransferHelper.safeApprove(underlying(), rewardPool, entireBalance);
        IMasterChef(rewardPool).deposit(poolId(), entireBalance);
    }

    function emergencyWithdraw(uint _amount) public onlyOperator {
        if (_amount != 0) {
            IMasterChef(rewardPool).emergencyWithdraw(poolId());
        }
    }

    function invest() public vaultControllerAndGeneralUser override {
        // this check is needed, because most of the SNX reward pools will revert if
        // you try to stake(0).
        if (IERC20(underlying()).balanceOf(address(this)) > 0) {
            enterRewardPool();
        }
    }

    function withdrawAllToVault() public override restricted {
        if (rewardPool != address(0)) {
            exitRewardPool();
        }
        _liquidateReward();
        TransferHelper.safeTransfer(underlying(), vault(), IERC20(underlying()).balanceOf(address(this)));
    }

    function withdrawToVault(uint256 amount) public override restricted {
        // Typically there wouldn't be any amount here
        // however, it is possible because of the emergencyExit
        uint256 entireBalance = IERC20(underlying()).balanceOf(address(this));

        if (amount > entireBalance) {
            // While we have the check above, we still using SafeMath below
            // for the peace of mind (in case something gets changed in between)
            uint256 needToWithdraw = amount.sub(entireBalance);
            uint256 toWithdraw = Math.min(balanceOfPool(), needToWithdraw);
            IMasterChef(rewardPool).withdraw(poolId(), toWithdraw);
        }

        TransferHelper.safeTransfer(underlying(), vault(), amount);
    }

    /*
    *   Note that we currently do not have a mechanism here to include the
    *   amount of reward that is accrued.
    */
    function underlyingBalance() external override view returns (uint256) {
        if (rewardPool == address(0)) {
            return IERC20(underlying()).balanceOf(address(this));
        }
        // Adding the amount locked in the reward pool and the amount that is somehow in this contract
        // both are in the units of "underlying"
        // The second part is needed because there is the emergency exit mechanism
        // which would break the assumption that all the funds are always inside of the reward pool
        return balanceOfPool().add(IERC20(underlying()).balanceOf(address(this)));
    }

    function harvest() external override vaultControllerAndGeneralUser {
        getPoolReward();
        _liquidateReward();
        invest();
    }

    // deposit 0 can claim all pending amount
    function getPoolReward() internal {
        IMasterChef(rewardPool).deposit(poolId(), 0);
    }

    function poolId() public view returns (uint256) {
        return poolID;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_rewardPool","type":"address"},{"internalType":"uint256","name":"_poolID","type":"uint256"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_swapRouter","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ProfitLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"SetOperator","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"bal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mdexRoutes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitSharingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"salvageToken","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_routeToToken0","type":"address[]"},{"internalType":"address[]","name":"_routeToToken1","type":"address[]"}],"name":"setLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouterToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSwapMining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllToVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawSwapMining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002d0838038062002d08833981810160405260e08110156200003757600080fd5b508051602082015160408301516060840151608085015160a086015160c09096015194959394929391929091908686868484848484836000620000796200026b565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319163317908190556040516001600160a01b0391909116906000907f2709918445f306d3e94d280907c62c5d2525ac3192d2e544774c7f181d65af3e908290a3600980546001600160a01b03199081166001600160a01b03968716179091556003805482169486169490941790935560088054841692851692909217909155600580548316918416919091179055601e60025560078054600b805484168e861617908190559083169584169590951790911689831617905560408051631526fe2760e01b8152600481018b9052905160009750939091169450631526fe2793506024808201936080935091829003018186803b158015620001cf57600080fd5b505afa158015620001e4573d6000803e3d6000fd5b505050506040513d6080811015620001fb57600080fd5b50519050620002096200026f565b6001600160a01b0316816001600160a01b0316146200025a5760405162461bcd60e51b815260040180806020018281038252602381526020018062002ce56023913960400191505060405180910390fd5b505050600c55506200027e92505050565b3390565b6008546001600160a01b031690565b612a57806200028e6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063c31c9c07116100ad578063e8b5e51f1161007c578063e8b5e51f14610542578063f2fde38b1461054a578063f77c479114610570578063f7c618c114610578578063fbfa77cf14610580576101fb565b8063c31c9c07146104ef578063ce8c42e8146104f7578063cf80dd9e14610514578063d16106e41461053a576101fb565b806392eefe9b116100e957806392eefe9b14610493578063b3ab15fb146104b9578063bc063e1a146104df578063bfd131f1146104e7576101fb565b8063715018a61461044f5780638cb59d07146104575780638d934485146104835780638da5cb5b1461048b576101fb565b80635312ea8e116101925780636700632f116101615780636700632f146103fc5780636726df53146104045780636f307dc31461042a57806370897b2314610432576101fb565b80635312ea8e146103c7578063570ca735146103e457806359356c5c146103ec57806366666aa9146103f4576101fb565b806341cb87fc116101ce57806341cb87fc1461034f5780634641257d146103755780634e5eda111461037d5780634f887183146103a1576101fb565b8063115880861461020057806321412e0f1461021a578063307eb941146102245780633e0dc34e14610347575b600080fd5b610208610588565b60408051918252519081900360200190f35b610222610614565b005b6102226004803603604081101561023a57600080fd5b810190602081018135600160201b81111561025457600080fd5b82018360208201111561026657600080fd5b803590602001918460208302840111600160201b8311171561028757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156102d657600080fd5b8201836020820111156102e857600080fd5b803590602001918460208302840111600160201b8311171561030957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061067e945050505050565b610208610809565b6102226004803603602081101561036557600080fd5b50356001600160a01b0316610810565b610222610880565b61038561098b565b604080516001600160a01b039092168252519081900360200190f35b610222600480360360208110156103b757600080fd5b50356001600160a01b031661099a565b610222600480360360208110156103dd57600080fd5b5035610a0a565b610385610ac4565b610208610ad3565b610385610c03565b610385610c12565b6102226004803603602081101561041a57600080fd5b50356001600160a01b0316610c21565b610385610c91565b6102226004803603602081101561044857600080fd5b5035610ca0565b610222610d34565b6103856004803603604081101561046d57600080fd5b506001600160a01b038135169060200135610df2565b610208610e27565b610385610e2d565b610222600480360360208110156104a957600080fd5b50356001600160a01b0316610e3c565b610222600480360360208110156104cf57600080fd5b50356001600160a01b0316610eac565b610208610fc0565b610222610fc5565b6103856110dc565b6102226004803603602081101561050d57600080fd5b50356110eb565b6102086004803603602081101561052a57600080fd5b50356001600160a01b0316611288565b6102086113b7565b6102226113bd565b6102226004803603602081101561056057600080fd5b50356001600160a01b031661153e565b610385611652565b610385611661565b610385611670565b600b546000906001600160a01b03166393f1a40b6105a4610809565b604080516001600160e01b031960e085901b16815260048101929092523060248301528051604480840193829003018186803b1580156105e357600080fd5b505afa1580156105f7573d6000803e3d6000fd5b505050506040513d604081101561060d57600080fd5b5051919050565b600660009054906101000a90046001600160a01b03166001600160a01b031663b872dd0e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561066457600080fd5b505af1158015610678573d6000803e3d6000fd5b50505050565b6001546001600160a01b031633146106cc576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b60006106d6610c91565b6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561070e57600080fd5b505afa158015610722573d6000803e3d6000fd5b505050506040513d602081101561073857600080fd5b505190506000610746610c91565b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561077e57600080fd5b505afa158015610792573d6000803e3d6000fd5b505050506040513d60208110156107a857600080fd5b50516001600160a01b0383166000908152600a6020908152604090912086519293506107d892909187019061292a565b506001600160a01b0381166000908152600a6020908152604090912084516108029286019061292a565b5050505050565b600c545b90565b6001546001600160a01b0316331461085e576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60035460408051631846d2f560e31b815233600482015290516001600160a01b039092169163c23697a891602480820192602092909190829003018186803b1580156108cb57600080fd5b505afa1580156108df573d6000803e3d6000fd5b505050506040513d60208110156108f557600080fd5b50518061091a5750610905611670565b6001600160a01b0316336001600160a01b0316145b8061092f57506003546001600160a01b031633145b610971576040805162461bcd60e51b815260206004820152600e60248201526d30b2323932b9b99034b9903130b760911b604482015290519081900360640190fd5b61097961167f565b6109816116d7565b6109896113bd565b565b6006546001600160a01b031681565b6001546001600160a01b031633146109e8576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610a58576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b8015610ac157600b546001600160a01b0316635312ea8e610a77610809565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610aad57600080fd5b505af1158015610802573d6000803e3d6000fd5b50565b6001546001600160a01b031681565b600b546000906001600160a01b0316610b6d57610aee610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b3a57600080fd5b505afa158015610b4e573d6000803e3d6000fd5b505050506040513d6020811015610b6457600080fd5b5051905061080d565b610bfe610b78610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610bc457600080fd5b505afa158015610bd8573d6000803e3d6000fd5b505050506040513d6020811015610bee57600080fd5b5051610bf8610588565b90612237565b905090565b600b546001600160a01b031681565b6004546001600160a01b031681565b6001546001600160a01b03163314610c6f576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6001546001600160a01b03163314610cee576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b6023811115610d2f576040805162461bcd60e51b8152602060048201526008602482015267666565203c20333560c01b604482015290519081900360640190fd5b600255565b610d3c61229a565b6001600160a01b0316610d4d610e2d565b6001600160a01b031614610da8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600a6020528160005260406000208181548110610e0b57fe5b6000918252602090912001546001600160a01b03169150829050565b600c5481565b6000546001600160a01b031690565b6001546001600160a01b03163314610e8a576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610eb461229a565b6001600160a01b0316610ec5610e2d565b6001600160a01b031614610f20576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116610f6e576040805162461bcd60e51b815260206004820152601060248201526f3130b2103732bb9037b832b930ba37b960811b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f2709918445f306d3e94d280907c62c5d2525ac3192d2e544774c7f181d65af3e90600090a35050565b606481565b6009546001600160a01b0316331480610fe857506003546001600160a01b031633145b6110235760405162461bcd60e51b815260040180806020018281038252602c8152602001806129d5602c913960400191505060405180910390fd5b600b546001600160a01b03161561103c5761103c61229e565b6110446116d7565b61098961104f610c91565b611057611670565b61105f610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156110ab57600080fd5b505afa1580156110bf573d6000803e3d6000fd5b505050506040513d60208110156110d557600080fd5b5051612307565b6005546001600160a01b031681565b6009546001600160a01b031633148061110e57506003546001600160a01b031633145b6111495760405162461bcd60e51b815260040180806020018281038252602c8152602001806129d5602c913960400191505060405180910390fd5b6000611153610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561119f57600080fd5b505afa1580156111b3573d6000803e3d6000fd5b505050506040513d60208110156111c957600080fd5b505190508082111561126b5760006111e1838361246a565b905060006111f66111f0610588565b836124c7565b600b549091506001600160a01b031663441a3e70611212610809565b836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561125057600080fd5b505af1158015611264573d6000803e3d6000fd5b5050505050505b611284611276610c91565b61127e611670565b84612307565b5050565b6003546000906001600160a01b031633146112d9576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b6008546001600160a01b0383811691161415611325576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561136b57600080fd5b505afa15801561137f573d6000803e3d6000fd5b505050506040513d602081101561139557600080fd5b50516003549091506113b29083906001600160a01b031683612307565b919050565b60025481565b60035460408051631846d2f560e31b815233600482015290516001600160a01b039092169163c23697a891602480820192602092909190829003018186803b15801561140857600080fd5b505afa15801561141c573d6000803e3d6000fd5b505050506040513d602081101561143257600080fd5b5051806114575750611442611670565b6001600160a01b0316336001600160a01b0316145b8061146c57506003546001600160a01b031633145b6114ae576040805162461bcd60e51b815260206004820152600e60248201526d30b2323932b9b99034b9903130b760911b604482015290519081900360640190fd5b60006114b8610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150457600080fd5b505afa158015611518573d6000803e3d6000fd5b505050506040513d602081101561152e57600080fd5b50511115610989576109896124dd565b61154661229a565b6001600160a01b0316611557610e2d565b6001600160a01b0316146115b2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166115f75760405162461bcd60e51b81526004018080602001828103825260268152602001806129af6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b6007546001600160a01b031681565b6009546001600160a01b031690565b600b546001600160a01b031663e2bbb158611698610809565b60006040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561066457600080fd5b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561172257600080fd5b505afa158015611736573d6000803e3d6000fd5b505050506040513d602081101561174c57600080fd5b50519050600061175a610c91565b6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561179257600080fd5b505afa1580156117a6573d6000803e3d6000fd5b505050506040513d60208110156117bc57600080fd5b5051905060006117ca610c91565b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561180257600080fd5b505afa158015611816573d6000803e3d6000fd5b505050506040513d602081101561182c57600080fd5b50516001600160a01b0383166000908152600a6020908152604091829020805483518184028101840190945280845293945060609384939283018282801561189d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161187f575b50505050509150600a6000846001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561191d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118ff575b50505050509050600061192e610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561197a57600080fd5b505afa15801561198e573d6000803e3d6000fd5b505050506040513d60208110156119a457600080fd5b5051905085158015906119b8575060018351115b80156119c5575060018251115b156121a5576007546001600160a01b03868116911614611c64576007546005546040805163095ea7b360e01b81526001600160a01b0392831660048201526000602482018190529151929093169263095ea7b39260448083019360209383900390910190829087803b158015611a3a57600080fd5b505af1158015611a4e573d6000803e3d6000fd5b505050506040513d6020811015611a6457600080fd5b50506007546005546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018a90529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611abf57600080fd5b505af1158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b50506005546040516338ed173960e01b8152600481018881526001602483018190523060648401819052426084850181905260a060448601908152895160a487015289516001600160a01b03909716966338ed1739968e968c9594939092909160c401906020878101910280838360005b83811015611b72578181015183820152602001611b5a565b505050509050019650505050505050600060405180830381600087803b158015611b9b57600080fd5b505af1158015611baf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611bd857600080fd5b8101908080516040519392919084600160201b821115611bf757600080fd5b908301906020820185811115611c0c57600080fd5b82518660208202830111600160201b82111715611c2857600080fd5b82525081516020918201928201910280838360005b83811015611c55578181015183820152602001611c3d565b50505050905001604052505050505b6000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611cb357600080fd5b505afa158015611cc7573d6000803e3d6000fd5b505050506040513d6020811015611cdd57600080fd5b50516005546040805163095ea7b360e01b81526001600160a01b03928316600482015260006024820181905291519394509189169263095ea7b3926044808201936020939283900390910190829087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b505050506040513d6020811015611d6457600080fd5b50506005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519188169163095ea7b3916044808201926020929091908290030181600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505050506040513d6020811015611de657600080fd5b50611df490508160026125b5565b6005546040516338ed173960e01b8152600481018381526001602483018190523060648401819052426084850181905260a0604486019081528a5160a48701528a519798506001600160a01b03909616966338ed173996899694958c95909260c4909101906020808801910280838360005b83811015611e7e578181015183820152602001611e66565b505050509050019650505050505050600060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ee457600080fd5b8101908080516040519392919084600160201b821115611f0357600080fd5b908301906020820185811115611f1857600080fd5b82518660208202830111600160201b82111715611f3457600080fd5b82525081516020918201928201910280838360005b83811015611f61578181015183820152602001611f49565b50505050905001604052505050506000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611fbe57600080fd5b505afa158015611fd2573d6000803e3d6000fd5b505050506040513d6020811015611fe857600080fd5b50516005546040805163095ea7b360e01b81526001600160a01b03928316600482015260006024820181905291519394509189169263095ea7b3926044808201936020939283900390910190829087803b15801561204557600080fd5b505af1158015612059573d6000803e3d6000fd5b505050506040513d602081101561206f57600080fd5b50506005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519188169163095ea7b3916044808201926020929091908290030181600087803b1580156120c757600080fd5b505af11580156120db573d6000803e3d6000fd5b505050506040513d60208110156120f157600080fd5b50506005546040805162e8e33760e81b81526001600160a01b038a811660048301528981166024830152604482018690526064820185905260016084830181905260a48301523060c48301524260e48301529151600093929092169163e8e33700916101048082019260609290919082900301818787803b15801561217557600080fd5b505af1158015612189573d6000803e3d6000fd5b505050506040513d606081101561219f57600080fd5b50505050505b600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156121f057600080fd5b505afa158015612204573d6000803e3d6000fd5b505050506040513d602081101561221a57600080fd5b50519050801561222e5761222e828261261c565b50505050505050565b600082820183811015612291576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b3390565b60006122a8610588565b90508015610ac157600b546001600160a01b031663441a3e706122c9610809565b836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015610aad57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106123845780518252601f199092019160209182019101612365565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123e6576040519150601f19603f3d011682016040523d82523d6000602084013e6123eb565b606091505b5091509150818015612419575080511580612419575080806020019051602081101561241657600080fd5b50515b610802576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b6000828211156124c1576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008183106124d65781612291565b5090919050565b60006124e7610c91565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561253357600080fd5b505afa158015612547573d6000803e3d6000fd5b505050506040513d602081101561255d57600080fd5b5051905061257f61256c610c91565b600b546001600160a01b0316600061276e565b61259c61258a610c91565b600b546001600160a01b03168361276e565b600b546001600160a01b031663e2bbb1586122c9610809565b600080821161260b576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161261457fe5b049392505050565b81811115612724576000612630828461246a565b90506000612654606461264e600254856128d190919063ffffffff16565b906125b5565b604080518681526020810186905280820183905242606082015290519192507f0b34b93979d93253da0e9e54841c680c66377f129a340ef2a37e802865e40588919081900360800190a16008546003546040805163d0fb020360e01b8152905161271d936001600160a01b0390811693169163d0fb0203916004808301926020929190829003018186803b1580156126eb57600080fd5b505afa1580156126ff573d6000803e3d6000fd5b505050506040513d602081101561271557600080fd5b505183612307565b5050611284565b604080518381526020810183905260008183015242606082015290517f0b34b93979d93253da0e9e54841c680c66377f129a340ef2a37e802865e405889181900360800190a15050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106127eb5780518252601f1990920191602091820191016127cc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461284d576040519150601f19603f3d011682016040523d82523d6000602084013e612852565b606091505b5091509150818015612880575080511580612880575080806020019051602081101561287d57600080fd5b50515b610802576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b6000826128e057506000612294565b828202828482816128ed57fe5b04146122915760405162461bcd60e51b8152600401808060200182810382526021815260200180612a016021913960400191505060405180910390fd5b82805482825590600052602060002090810192821561297f579160200282015b8281111561297f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061294a565b5061298b92915061298f565b5090565b5b8082111561298b5780546001600160a01b031916815560010161299056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735468652073656e6465722068617320746f2062652074686520636f6e74726f6c6c6572206f72207661756c74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220ee9df738e7578f3e781d33ba5ebe5c4fd1655e8a44c47873e84a3b8c9f29627264736f6c634300060c0033506f6f6c20496e666f20646f6573206e6f74206d6174636820756e6465726c79696e6700000000000000000000000063f80c8f948b8c48c363e1dace4196ff54e2822f000000000000000000000000cb04e174e6a1416bb6af59549cf6ecea0b034830000000000000000000000000793c2a814e23ee38ab46412be65e94fe47d4b397000000000000000000000000fb03e11d93632d97a8981158a632dd5986f5e909000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c000000000000000000000000ed7d5f38c79115ca12fe6c0041abb22f0a06c300

Deployed ByteCode Sourcemap

29034:4147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29778:144;;;:::i;:::-;;;;;;;;;;;;;;;;24030:97;;;:::i;:::-;;26064:356;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26064:356:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26064:356:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26064:356:0;;;;;;;;-1:-1:-1;26064:356:0;;-1:-1:-1;;;;;26064:356:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26064:356:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26064:356:0;;-1:-1:-1;26064:356:0;;-1:-1:-1;;;;;26064:356:0:i;33096:80::-;;;:::i;23692:106::-;;;;;;;;;;;;;;;;-1:-1:-1;23692:106:0;-1:-1:-1;;;;;23692:106:0;;:::i;32787:149::-;;;:::i;22364:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;22364:25:0;;;;;;;;;;;;;;23806:103;;;;;;;;;;;;;;;;-1:-1:-1;23806:103:0;-1:-1:-1;;;;;23806:103:0;;:::i;30462:175::-;;;;;;;;;;;;;;;;-1:-1:-1;30462:175:0;;:::i;20128:23::-;;;:::i;32159:620::-;;;:::i;29128:25::-;;;:::i;22299:26::-;;;:::i;23917:105::-;;;;;;;;;;;;;;;;-1:-1:-1;23917:105:0;-1:-1:-1;;;;;23917:105:0;;:::i;25324:97::-;;;:::i;25014:177::-;;;;;;;;;;;;;;;;-1:-1:-1;25014:177:0;;:::i;19373:148::-;;;:::i;25721:47::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25721:47:0;;;;;;;;:::i;29160:18::-;;;:::i;18722:87::-;;;:::i;25199:117::-;;;;;;;;;;;;;;;;-1:-1:-1;25199:117:0;-1:-1:-1;;;;;25199:117:0;;:::i;20472:259::-;;;;;;;;;;;;;;;;-1:-1:-1;20472:259:0;-1:-1:-1;;;;;20472:259:0;;:::i;22182:38::-;;;:::i;30953:285::-;;;:::i;22332:25::-;;;:::i;31246:770::-;;;;;;;;;;;;;;;;-1:-1:-1;31246:770:0;;:::i;24683:323::-;;;;;;;;;;;;;;;;-1:-1:-1;24683:323:0;-1:-1:-1;;;;;24683:323:0;;:::i;22229:31::-;;;:::i;30645:300::-;;;:::i;19676:244::-;;;;;;;;;;;;;;;;-1:-1:-1;19676:244:0;-1:-1:-1;;;;;19676:244:0;;:::i;22267:25::-;;;:::i;22396:26::-;;;:::i;25429:87::-;;;:::i;29778:144::-;29869:10;;29824:11;;-1:-1:-1;;;;;29869:10:0;29857:32;29890:8;:6;:8::i;:::-;29857:57;;;-1:-1:-1;;;;;;29857:57:0;;;;;;;;;;;;;;29908:4;29857:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29857:57:0;;29778:144;-1:-1:-1;29778:144:0:o;24030:97::-;24092:10;;;;;;;;;-1:-1:-1;;;;;24092:10:0;-1:-1:-1;;;;;24080:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24030:97::o;26064:356::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;26203:16:::1;26232:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26222:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26222:32:0;;-1:-1:-1;26265:16:0::1;26294:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26284:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26284:32:0;-1:-1:-1;;;;;26327:20:0;::::1;;::::0;;;:10:::1;26284:32;26327:20:::0;;;;;;;:37;;26284:32;;-1:-1:-1;26327:37:0::1;::::0;:20;;:37;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;26375:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;:37;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;20455:1;;26064:356:::0;;:::o;33096:80::-;33162:6;;33096:80;;:::o;23692:106::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;23769:10:::1;:21:::0;;-1:-1:-1;;;;;;23769:21:0::1;-1:-1:-1::0;;;;;23769:21:0;;;::::1;::::0;;;::::1;::::0;;23692:106::o;32787:149::-;23550:10;;23538:41;;;-1:-1:-1;;;23538:41:0;;23568:10;23538:41;;;;;;-1:-1:-1;;;;;23550:10:0;;;;23538:29;;:41;;;;;;;;;;;;;;;23550:10;23538:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23538:41:0;;:66;;;23597:7;:5;:7::i;:::-;-1:-1:-1;;;;;23583:21:0;:10;-1:-1:-1;;;;;23583:21:0;;23538:66;:94;;;-1:-1:-1;23622:10:0;;-1:-1:-1;;;;;23622:10:0;23608;:24;23538:94;23530:134;;;;;-1:-1:-1;;;23530:134:0;;;;;;;;;;;;-1:-1:-1;;;23530:134:0;;;;;;;;;;;;;;;32865:15:::1;:13;:15::i;:::-;32891:18;:16;:18::i;:::-;32920:8;:6;:8::i;:::-;32787:149::o:0;22364:25::-;;;-1:-1:-1;;;;;22364:25:0;;:::o;23806:103::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;23880:10:::1;:21:::0;;-1:-1:-1;;;;;;23880:21:0::1;-1:-1:-1::0;;;;;23880:21:0;;;::::1;::::0;;;::::1;::::0;;23806:103::o;30462:175::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;30538:12;;30534:96:::1;;30579:10;::::0;-1:-1:-1;;;;;30579:10:0::1;30567:41;30609:8;:6;:8::i;:::-;30567:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;30534:96;30462:175:::0;:::o;20128:23::-;;;-1:-1:-1;;;;;20128:23:0;;:::o;32159:620::-;32244:10;;32220:7;;-1:-1:-1;;;;;32244:10:0;32240:109;;32299:12;:10;:12::i;:::-;-1:-1:-1;;;;;32292:30:0;;32331:4;32292:45;;;;;;;;;;;;;-1:-1:-1;;;;;32292:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32292:45:0;;-1:-1:-1;32285:52:0;;32240:109;32705:66;32732:12;:10;:12::i;:::-;-1:-1:-1;;;;;32725:30:0;;32764:4;32725:45;;;;;;;;;;;;;-1:-1:-1;;;;;32725:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32725:45:0;32705:15;:13;:15::i;:::-;:19;;:66::i;:::-;32698:73;;32159:620;:::o;29128:25::-;;;-1:-1:-1;;;;;29128:25:0;;:::o;22299:26::-;;;-1:-1:-1;;;;;22299:26:0;;:::o;23917:105::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;23992:11:::1;:22:::0;;-1:-1:-1;;;;;;23992:22:0::1;-1:-1:-1::0;;;;;23992:22:0;;;::::1;::::0;;;::::1;::::0;;23917:105::o;25324:97::-;25402:11;;-1:-1:-1;;;;;25402:11:0;25324:97;:::o;25014:177::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;25123:2:::1;25104:15;:21;;25096:42;;;::::0;;-1:-1:-1;;;25096:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25096:42:0;;;;;;;;;;;;;::::1;;25149:16;:34:::0;25014:177::o;19373:148::-;18953:12;:10;:12::i;:::-;-1:-1:-1;;;;;18942:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18942:23:0;;18934:68;;;;;-1:-1:-1;;;18934:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19480:1:::1;19464:6:::0;;19443:40:::1;::::0;-1:-1:-1;;;;;19464:6:0;;::::1;::::0;19443:40:::1;::::0;19480:1;;19443:40:::1;19511:1;19494:19:::0;;-1:-1:-1;;;;;;19494:19:0::1;::::0;;19373:148::o;25721:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25721:47:0;;-1:-1:-1;25721:47:0;;-1:-1:-1;25721:47:0:o;29160:18::-;;;;:::o;18722:87::-;18768:7;18795:6;-1:-1:-1;;;;;18795:6:0;18722:87;:::o;25199:117::-;20419:8;;-1:-1:-1;;;;;20419:8:0;20405:10;:22;20397:47;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;-1:-1:-1;;;20397:47:0;;;;;;;;;;;;;;;25284:10:::1;:24:::0;;-1:-1:-1;;;;;;25284:24:0::1;-1:-1:-1::0;;;;;25284:24:0;;;::::1;::::0;;;::::1;::::0;;25199:117::o;20472:259::-;18953:12;:10;:12::i;:::-;-1:-1:-1;;;;;18942:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18942:23:0;;18934:68;;;;;-1:-1:-1;;;18934:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20550:25:0;::::1;20542:54;;;::::0;;-1:-1:-1;;;20542:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20542:54:0;;;;;;;;;;;;;::::1;;20629:8;::::0;;-1:-1:-1;;;;;20648:22:0;;::::1;-1:-1:-1::0;;;;;;20648:22:0;::::1;::::0;::::1;::::0;;;20686:37:::1;::::0;20629:8;::::1;::::0;20648:22;20629:8;;20686:37:::1;::::0;20607:19:::1;::::0;20686:37:::1;19013:1;20472:259:::0;:::o;22182:38::-;22217:3;22182:38;:::o;30953:285::-;23094:6;;-1:-1:-1;;;;;23094:6:0;23080:10;:20;;:57;;-1:-1:-1;23126:10:0;;-1:-1:-1;;;;;23126:10:0;23104;:33;23080:57;23072:127;;;;-1:-1:-1;;;23072:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31025:10:::1;::::0;-1:-1:-1;;;;;31025:10:0::1;:24:::0;31021:73:::1;;31066:16;:14;:16::i;:::-;31104:18;:16;:18::i;:::-;31133:97;31161:12;:10;:12::i;:::-;31175:7;:5;:7::i;:::-;31191:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;31184:30:0::1;;31223:4;31184:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;31184:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31184:45:0;31133:27:::1;:97::i;22332:25::-:0;;;-1:-1:-1;;;;;22332:25:0;;:::o;31246:770::-;23094:6;;-1:-1:-1;;;;;23094:6:0;23080:10;:20;;:57;;-1:-1:-1;23126:10:0;;-1:-1:-1;;;;;23126:10:0;23104;:33;23080:57;23072:127;;;;-1:-1:-1;;;23072:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31446:21:::1;31477:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;31470:30:0::1;;31509:4;31470:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;31470:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31470:45:0;;-1:-1:-1;31532:22:0;;::::1;31528:410;;;31730:22;31755:25;:6:::0;31766:13;31755:10:::1;:25::i;:::-;31730:50;;31795:18;31816:41;31825:15;:13;:15::i;:::-;31842:14;31816:8;:41::i;:::-;31884:10;::::0;31795:62;;-1:-1:-1;;;;;;31884:10:0::1;31872:32;31905:8;:6;:8::i;:::-;31915:10;31872:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31528:410;;;31950:58;31978:12;:10;:12::i;:::-;31992:7;:5;:7::i;:::-;32001:6;31950:27;:58::i;:::-;23210:1;31246:770:::0;:::o;24683:323::-;24795:10;;24748:12;;-1:-1:-1;;;;;24795:10:0;24781;:24;24773:49;;;;;-1:-1:-1;;;24773:49:0;;;;;;;;;;;;-1:-1:-1;;;24773:49:0;;;;;;;;;;;;;;;24841:11;;-1:-1:-1;;;;;24841:21:0;;;:11;;:21;;24833:38;;;;;-1:-1:-1;;;24833:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;24833:38:0;;;;;;;;;;;;;;;24892:39;;;-1:-1:-1;;;24892:39:0;;24925:4;24892:39;;;;;;-1:-1:-1;;;;;24892:24:0;;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24892:39:0;24978:10;;24892:39;;-1:-1:-1;24942:56:0;;24970:6;;-1:-1:-1;;;;;24978:10:0;24892:39;24942:27;:56::i;:::-;24683:323;;;:::o;22229:31::-;;;;:::o;30645:300::-;23550:10;;23538:41;;;-1:-1:-1;;;23538:41:0;;23568:10;23538:41;;;;;;-1:-1:-1;;;;;23550:10:0;;;;23538:29;;:41;;;;;;;;;;;;;;;23550:10;23538:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23538:41:0;;:66;;;23597:7;:5;:7::i;:::-;-1:-1:-1;;;;;23583:21:0;:10;-1:-1:-1;;;;;23583:21:0;;23538:66;:94;;;-1:-1:-1;23622:10:0;;-1:-1:-1;;;;;23622:10:0;23608;:24;23538:94;23530:134;;;;;-1:-1:-1;;;23530:134:0;;;;;;;;;;;;-1:-1:-1;;;23530:134:0;;;;;;;;;;;;;;;30891:1:::1;30850:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;30843:30:0::1;;30882:4;30843:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;30843:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30843:45:0;:49:::1;30839:99;;;30909:17;:15;:17::i;19676:244::-:0;18953:12;:10;:12::i;:::-;-1:-1:-1;;;;;18942:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;18942:23:0;;18934:68;;;;;-1:-1:-1;;;18934:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19765:22:0;::::1;19757:73;;;;-1:-1:-1::0;;;19757:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19867:6;::::0;;19846:38:::1;::::0;-1:-1:-1;;;;;19846:38:0;;::::1;::::0;19867:6;::::1;::::0;19846:38:::1;::::0;::::1;19895:6;:17:::0;;-1:-1:-1;;;;;;19895:17:0::1;-1:-1:-1::0;;;;;19895:17:0;;;::::1;::::0;;;::::1;::::0;;19676:244::o;22267:25::-;;;-1:-1:-1;;;;;22267:25:0;;:::o;22396:26::-;;;-1:-1:-1;;;;;22396:26:0;;:::o;25429:87::-;25502:6;;-1:-1:-1;;;;;25502:6:0;25429:87;:::o;32991:97::-;33048:10;;-1:-1:-1;;;;;33048:10:0;33036:31;33068:8;:6;:8::i;:::-;33078:1;33036:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26430:2490;26511:11;;26504:44;;;-1:-1:-1;;;26504:44:0;;26542:4;26504:44;;;;;;26480:21;;-1:-1:-1;;;;;26511:11:0;;26504:29;;:44;;;;;;;;;;;;;;26511:11;26504:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26504:44:0;;-1:-1:-1;26561:16:0;26590:12;:10;:12::i;:::-;-1:-1:-1;;;;;26580:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26580:32:0;;-1:-1:-1;26623:16:0;26652:12;:10;:12::i;:::-;-1:-1:-1;;;;;26642:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26642:32:0;-1:-1:-1;;;;;26784:20:0;;;;;;:10;26642:32;26784:20;;;;;;;;26769:35;;;;;;;;;;;;;;;;;26642:32;;-1:-1:-1;26687:29:0;;;;26769:35;;;26784:20;26769:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26769:35:0;;;;;;;;;;;;;;;;;;;;;;;26830:10;:20;26841:8;-1:-1:-1;;;;;26830:20:0;-1:-1:-1;;;;;26830:20:0;;;;;;;;;;;;26815:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26815:35:0;;;;;;;;;;;;;;;;;;;;;;;26863:15;26888:12;:10;:12::i;:::-;-1:-1:-1;;;;;26881:30:0;;26920:4;26881:45;;;;;;;;;;;;;-1:-1:-1;;;;;26881:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26881:45:0;;-1:-1:-1;26941:17:0;;;;;:79;;;27019:1;26997:12;:19;:23;26941:79;:157;;;;;27097:1;27075:12;:19;:23;26941:157;26937:1813;;;27167:11;;-1:-1:-1;;;;;27167:23:0;;;:11;;:23;27163:436;;27218:11;;27239:10;;27211:42;;;-1:-1:-1;;;27211:42:0;;-1:-1:-1;;;;;27239:10:0;;;27211:42;;;;27218:11;27211:42;;;;;;;;27218:11;;;;;27211:27;;:42;;;;;;;;;;;;;;;;27218:11;27211:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27279:11:0;;27300:10;;27272:54;;;-1:-1:-1;;;27272:54:0;;-1:-1:-1;;;;;27300:10:0;;;27272:54;;;;;;;;;;;;27279:11;;;;;27272:27;;:54;;;;;27211:42;;27272:54;;;;;;;27279:11;;27272:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27359:10:0;;27347:236;;-1:-1:-1;;;27347:236:0;;;;;;;;27359:10;27347:236;;;;;;27521:4;27347:236;;;;;;27549:15;27347:236;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27359:10:0;;;;27347:48;;27418:13;;27478:12;;27521:4;27549:15;27347:236;;;;;;;27272:54;27347:236;;;;;;;;27359:10;27347:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27347:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27347:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27347:236:0;;;;;;;;;;;;-1:-1:-1;27347:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27163:436;27613:22;27645:8;-1:-1:-1;;;;;27638:26:0;;27673:4;27638:41;;;;;;;;;;;;;-1:-1:-1;;;;;27638:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27638:41:0;27721:10;;27696:39;;;-1:-1:-1;;;27696:39:0;;-1:-1:-1;;;;;27721:10:0;;;27696:39;;;;27721:10;27696:39;;;;;;;;27638:41;;-1:-1:-1;27696:24:0;;;;;;:39;;;;;27638:41;;27696:39;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27775:10:0;;27750:52;;;-1:-1:-1;;;27750:52:0;;-1:-1:-1;;;;;27775:10:0;;;27750:52;;;;;;;;;;;;:24;;;;;;:52;;;;;27696:39;;27750:52;;;;;;;;27775:10;27750:24;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27836:21:0;;-1:-1:-1;27836:14:0;27855:1;27836:18;:21::i;:::-;27884:10;;27872:213;;-1:-1:-1;;;27872:213:0;;;;;;;;27884:10;27872:213;;;;;;28031:4;27872:213;;;;;;28055:15;27872:213;;;;;;;;;;;;;;;;;;;;;27819:38;;-1:-1:-1;;;;;;27884:10:0;;;;27872:48;;27819:38;;27884:10;;27992:12;;27872:213;;;;;;;;;;;;;;;;27884:10;27872:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27872:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27872:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27872:213:0;;;;;;;;;;;;-1:-1:-1;27872:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28100:22;28132:8;-1:-1:-1;;;;;28125:26:0;;28160:4;28125:41;;;;;;;;;;;;;-1:-1:-1;;;;;28125:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28125:41:0;28208:10;;28183:39;;;-1:-1:-1;;;28183:39:0;;-1:-1:-1;;;;;28208:10:0;;;28183:39;;;;28208:10;28183:39;;;;;;;;28125:41;;-1:-1:-1;28183:24:0;;;;;;:39;;;;;28125:41;;28183:39;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28262:10:0;;28237:52;;;-1:-1:-1;;;28237:52:0;;-1:-1:-1;;;;;28262:10:0;;;28237:52;;;;;;;;;;;;:24;;;;;;:52;;;;;28183:39;;28237:52;;;;;;;;28262:10;28237:24;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28367:10:0;;28355:383;;;-1:-1:-1;;;28355:383:0;;-1:-1:-1;;;;;28355:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;28367:10;28355:383;;;;;;;;;;28684:4;28355:383;;;;28708:15;28355:383;;;;;;28306:17;;28367:10;;;;;28355:36;;:383;;;;;;;;;;;;;;;28306:17;28367:10;28355:383;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26937:1813:0;28784:11;;28777:44;;;-1:-1:-1;;;28777:44:0;;28815:4;28777:44;;;;;;28760:14;;-1:-1:-1;;;;;28784:11:0;;28777:29;;:44;;;;;;;;;;;;;;28784:11;28777:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28777:44:0;;-1:-1:-1;28836:13:0;;28832:81;;28866:35;28879:10;28891:9;28866:12;:35::i;:::-;26430:2490;;;;;;;:::o;3760:179::-;3818:7;3850:5;;;3874:6;;;;3866:46;;;;;-1:-1:-1;;;3866:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3930:1;-1:-1:-1;3760:179:0;;;;;:::o;17257:106::-;17345:10;17257:106;:::o;29930:181::-;29976:11;29990:15;:13;:15::i;:::-;29976:29;-1:-1:-1;30020:8:0;;30016:88;;30057:10;;-1:-1:-1;;;;;30057:10:0;30045:32;30078:8;:6;:8::i;:::-;30088:3;30045:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21209:361;21404:45;;;-1:-1:-1;;;;;21404:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21404:45:0;-1:-1:-1;;;21404:45:0;;;21393:57;;;;21358:12;;21372:17;;21393:10;;;;21404:45;21393:57;;;21404:45;21393:57;;21404:45;21393:57;;;;;;;;;;-1:-1:-1;;21393:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21357:93;;;;21469:7;:57;;;;-1:-1:-1;21481:11:0;;:16;;:44;;;21512:4;21501:24;;;;;;;;;;;;;;;-1:-1:-1;21501:24:0;21481:44;21461:101;;;;;-1:-1:-1;;;21461:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4222:158;4280:7;4313:1;4308;:6;;4300:49;;;;;-1:-1:-1;;;4300:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4367:5:0;;;4222:158::o;538:106::-;596:7;627:1;623;:5;:13;;635:1;623:13;;;-1:-1:-1;631:1:0;;616:20;-1:-1:-1;538:106:0:o;30119:335::-;30166:21;30197:12;:10;:12::i;:::-;-1:-1:-1;;;;;30190:30:0;;30229:4;30190:45;;;;;;;;;;;;;-1:-1:-1;;;;;30190:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30190:45:0;;-1:-1:-1;30246:55:0;30273:12;:10;:12::i;:::-;30287:10;;-1:-1:-1;;;;;30287:10:0;;30246:26;:55::i;:::-;30312:67;30339:12;:10;:12::i;:::-;30353:10;;-1:-1:-1;;;;;30353:10:0;30365:13;30312:26;:67::i;:::-;30402:10;;-1:-1:-1;;;;;30402:10:0;30390:31;30422:8;:6;:8::i;5337:153::-;5395:7;5427:1;5423;:5;5415:44;;;;;-1:-1:-1;;;5415:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5481:1;5477;:5;;;;;;;5337:153;-1:-1:-1;;;5337:153:0:o;24135:540::-;24234:10;24221;:23;24217:451;;;24261:14;24278:26;:10;24293;24278:14;:26::i;:::-;24261:43;;24319:17;24339:41;22217:3;24339:28;24350:16;;24339:6;:10;;:28;;;;:::i;:::-;:32;;:41::i;:::-;24400:61;;;;;;;;;;;;;;;;;;24445:15;24400:61;;;;;;24319;;-1:-1:-1;24400:61:0;;;;;;;;;;24504:11;;24529:10;;24517:36;;;-1:-1:-1;;;24517:36:0;;;;24476:89;;-1:-1:-1;;;;;24504:11:0;;;;24529:10;;24517:34;;:36;;;;;;;;;;;;;;24529:10;24517:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24517:36:0;24555:9;24476:27;:89::i;:::-;24217:451;;;;;24603:53;;;;;;;;;;;;24637:1;24603:53;;;;24640:15;24603:53;;;;;;;;;;;;;;;24135:540;;:::o;20843:358::-;21036:45;;;-1:-1:-1;;;;;21036:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21036:45:0;-1:-1:-1;;;21036:45:0;;;21025:57;;;;20990:12;;21004:17;;21025:10;;;;21036:45;21025:57;;;21036:45;21025:57;;21036:45;21025:57;;;;;;;;;;-1:-1:-1;;21025:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20989:93;;;;21101:7;:57;;;;-1:-1:-1;21113:11:0;;:16;;:44;;;21144:4;21133:24;;;;;;;;;;;;;;;-1:-1:-1;21133:24:0;21113:44;21093:100;;;;;-1:-1:-1;;;21093:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4639:220;4697:7;4721:6;4717:20;;-1:-1:-1;4736:1:0;4729:8;;4717:20;4760:5;;;4764:1;4760;:5;:1;4784:5;;;;;:10;4776:56;;;;-1:-1:-1;;;4776:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://ee9df738e7578f3e781d33ba5ebe5c4fd1655e8a44c47873e84a3b8c9f296272
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading