Contract 0xf1302fe5bfa497de10d27e69c1321c982848b341

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2a937d111a5ef1d33b74625d176e4fac5b08befe8dfc4135f2a35de487fec4adFarm Claim80854702021-09-09 1:16:5544 days 3 hrs ago0x0c0fd563093bd30a87c55bd472c09fce70734aee IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000565413753.375
0x5a58fe46f85b24689499c4b870d3fa7ca64dbc4dc4c09e3768e3e885a8327f61Farm Provide One...80713012021-09-08 13:28:2844 days 15 hrs ago0xe568cd8e7063ce10b8ee24ab206504ef1966208b IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.00034188753.375
0xdb3ffecd1d119375f1490a818d9ab602586e488d6820401395812e57446d5657Farm Claim80483792021-09-07 18:22:2245 days 10 hrs ago0xaa6fa925e8cf7a7c1b0eee021df9b5dc78c8f68e IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000859263752.25
0x3316bf44597fb328e2ae62bc26440d43b149fffb8e566426878f2ec4c8d63ceaFarm Claim80422622021-09-07 13:16:3045 days 15 hrs ago0xaa6fa925e8cf7a7c1b0eee021df9b5dc78c8f68e IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000893013752.25
0x5d55e6bdd49359d4846f439da91bf45f4355c700caf89b4d7197265b7df3e3cbFarm Claim80341962021-09-07 6:33:1245 days 22 hrs ago0xaa6fa925e8cf7a7c1b0eee021df9b5dc78c8f68e IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000893013752.25
0x10254108638acdfe1f65a8fd54590b8ab2303bd540cb3d1f7eaf261bb78cc3ebFarm Claim80339672021-09-07 6:21:4545 days 22 hrs ago0xaa6fa925e8cf7a7c1b0eee021df9b5dc78c8f68e IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000893013752.25
0xf97d6274f2399767e909972a1fb372cb21a3791fa538758f172ce7c2bcc13551Farm Claim80335332021-09-07 6:00:0345 days 22 hrs ago0x16ba6944a4e83790301e9412a112ead0642710ad IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0x0b3d5c8f858385692650a3a6487452670e68e0d4f6dbeb6510a6c3c778bd3532Farm Withdraw On...80335252021-09-07 5:59:3945 days 22 hrs ago0x16ba6944a4e83790301e9412a112ead0642710ad IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000450042752.25
0x19d410b14c76f33571035e1fe4e28647f32076260650801a2dcc45e8dad2f443Farm Claim80335152021-09-07 5:59:0945 days 22 hrs ago0x5c578141f3566c54cda86532518304c01340624f IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0xda93f6e3f7e9b7296b4393a4882be13a18c05e1388a884a304cae4d66581057eFarm Claim80335112021-09-07 5:58:5745 days 22 hrs ago0x681fd461d88a3da162bdfbd1c13846a124a738b8 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000859317752.25
0x6df85c78fb0c31d4a89fdcaee5ef73b8aaf9c37005ee8bdf340449e3dabc1e11Farm Withdraw On...80335032021-09-07 5:58:3345 days 22 hrs ago0x5c578141f3566c54cda86532518304c01340624f IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416292752.25
0x5a1524300cf8c9a1f23a352bb45f534a14858a33d69811f93d5bbe40f1f76975Farm Claim80334952021-09-07 5:58:0945 days 22 hrs ago0x3ab08e9ec7e54305f71b473ea6cb803da42f29c8 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0x441381cf107482a435b0d583af108551f6c8f5a6e1258985c0a2a0357edb83a2Farm Withdraw On...80334902021-09-07 5:57:5445 days 22 hrs ago0x3ab08e9ec7e54305f71b473ea6cb803da42f29c8 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416292752.25
0x7a72f719331405f2b3e3a9615e5d9317010be0b8f409499295791f0d1aaf81f1Farm Claim80334792021-09-07 5:57:2145 days 22 hrs ago0x969e89a6c3000405de052b993f6d9054cece5ab6 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.0008085332.25
0xa77835c41720116f6e3adad7514fc5022230c23e243ab6b0972e35b2d87f28e8Farm Withdraw On...80334732021-09-07 5:57:0345 days 22 hrs ago0x969e89a6c3000405de052b993f6d9054cece5ab6 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416265752.25
0x650674547c4f518828238144fbe70adbc5f479db0d41305a6e75d92b4f475bf3Farm Claim80334632021-09-07 5:56:3345 days 22 hrs ago0x83afd17c3fdb8fc77d5385a61c6d870df42e9de5 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0xa9a18030972b01fa1cbf1ee3db1f70fad5094af3c08f30c498ce57fce7572f17Farm Withdraw On...80334582021-09-07 5:56:1845 days 22 hrs ago0x83afd17c3fdb8fc77d5385a61c6d870df42e9de5 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416292752.25
0x6dbb45c2eb1bd06dec1c4624c2542c2d63d2506e862395afc7da1ced6deee64dFarm Claim80334512021-09-07 5:55:5745 days 22 hrs ago0xc09df4b8a32472026aea2eea78b94e533e169ead IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0xee165e9200b0431a0988f920222666e5e9b0b6280999033087d15cd2fa46582dFarm Withdraw On...80334452021-09-07 5:55:3945 days 22 hrs ago0xc09df4b8a32472026aea2eea78b94e533e169ead IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416292752.25
0x7e112cc69ac7f5faf269b1e4291e4b307a34a2778b7269815836b106a7aae7bbFarm Claim80334362021-09-07 5:55:1245 days 22 hrs ago0xca7f6fd2070c892ccb4ec7e45790a16ed98d895c IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000859290752.25
0x3d077dbe2d199f0ebd208e15d760b558b864c58847088c873538070d6b368afbFarm Claim80334282021-09-07 5:54:4845 days 22 hrs ago0x7c458cb3abc8abea8d04862cc6261e719f48b654 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000808562.25
0x5cf997c25a7e5b5b02607659af2ffe8ea2f4feebb58665ffd11150ee423eadd6Farm Claim80334222021-09-07 5:54:3045 days 22 hrs ago0x3977618e8ee2ca489e15599caf74c8f75394f9e6 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000859290752.25
0x704e92e9ea51a1a786ac7d487604558d589f9cf2db228ad08973b37afdec2c7eFarm Withdraw On...80334152021-09-07 5:54:0945 days 22 hrs ago0x7c458cb3abc8abea8d04862cc6261e719f48b654 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000416292752.25
0x01c87efc8817fc1f725c451961934254d59e56671d889ae87e667668c598e6f8Farm Claim80332862021-09-07 5:47:4245 days 22 hrs ago0xab0411c7c258199ce2b6176a87c8e6183196c814 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000279416252.25
0xb2d625d80472b786c67b3f4a0ab1e4685d45ad9e2e8ca54533c026a68de44db7Farm Provide One...80332832021-09-07 5:47:3345 days 22 hrs ago0x3184a54c52fed5f3a2ae5be343e6cc31787c5b71 IN  0xf1302fe5bfa497de10d27e69c1321c982848b3410 HT0.000529368752.25
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-08-06
*/

// SPDX-License-Identifier: MIT

pragma solidity ^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);
    
    function killSupply() external view returns(uint256);
    
    function mint(address to,uint256 amount) external returns(bool);
    function burn(address from,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);
}


interface IMdexERC20 {
    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;
}

interface INodeIncome{
    // function updateGrades(address _currentUser) external;
    function commitTop100Reward(uint256 amount) external;
    function commitTotalNodeReward(uint256 amount) external;
    function commitTotalRecommend(uint256 amount) external;
    function commitTotalHaveReward(uint256 amount) external;
    function getUserLevel(address _user) external view returns(bytes8 _nodeLevel);
    function updateInto(address customer,uint256 amount) external; 
    function updateOut(address customer,uint256 amount) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function feeToRate() external view returns (uint256);

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

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

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setFeeToRate(uint256) external;

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

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

    function getReserves(address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

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

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

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

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

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


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


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) {
        unchecked {
            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) {
        unchecked {
            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) {
        unchecked {
            // 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) {
        unchecked {
            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) {
        unchecked {
            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) {
        return a + b;
    }

    /**
     * @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 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) {
        return a * b;
    }

    /**
     * @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.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        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) {
        unchecked {
            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.
     *
     * 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).
     *
     * 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) {
        unchecked {
            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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


contract Farm {
  using SafeMath for uint256;
  address public factory;
  address public token;
  address public router;
  address public dToken;
  address public ecologyMinerWallet;
  address public nodeIncome;
  uint256 public accPreReward;
  uint256 public minerAmount;

  struct User{
      uint256 tokenAmountA;
      uint256 rewardDebt;
      uint256 reward;
  }
  mapping (address => User) userInfo;
  uint256 public totalAmount;
  uint256 public dhdPerBlock;
  uint256 public lastRewardBlock;
  uint256 public halvingPeriod = 5256000;
  uint256 public startBlock;
  uint256 public decimals = 1e20;


  constructor(){
    factory = msg.sender;
  }
  
  function initialize(address _token0) external {
      require(msg.sender == factory , "DHD: FORBIDDEN");
      token = _token0;
     
  }
  
  function setFarmAddress(address _router,address _dToken,address _ecologyMinerWallet,address _nodeIncome) public{
      require(msg.sender == factory , "DHD: FORBIDDEN");
      router = _router;
      dToken = _dToken;
      ecologyMinerWallet = _ecologyMinerWallet;
      nodeIncome = _nodeIncome;
  }

  function getTotalAmount()public view returns (uint256 amountA) {
      amountA = totalAmount;
  }

  function userIncome(address _user) public view returns(uint256 income){

      uint256 mintAmount = getDhdFarmReward(lastRewardBlock);
      User storage user = userInfo[_user];
      if(user.tokenAmountA>0){
          if(mintAmount >0){
              uint256 currentAccReward = mintAmount.mul(decimals).div(totalAmount);
              uint256 preReward = accPreReward.add(currentAccReward);
              uint256 current = preReward.mul(user.tokenAmountA);
              income = (current.sub(user.rewardDebt).add(user.reward)).div(decimals);
          }else{
              uint256 currentReward = (user.tokenAmountA).mul(accPreReward).sub(user.rewardDebt);
              income =(currentReward.add(user.reward)).div(decimals);
          }
      }else{
          income = user.reward.div(decimals);
      }

  }


  function setPoolInfo(uint256 _dhdPerBlock,uint256 _halvingPeriod,uint256 _startMinerBlock)public {
      require(msg.sender == router,"DHD:No operation permission");
      dhdPerBlock = _dhdPerBlock;
      startBlock = _startMinerBlock;
      halvingPeriod = _halvingPeriod;
  }

  function getUserStakeAsset(address customer) public view returns (uint256 amount){
      User storage user = userInfo[customer];
      amount = user.tokenAmountA;

  }


  function updateOneAsset(address customer,uint256 amount) public{
    require(msg.sender == router,"DHD:No operation permission");
    updateFarm();
    User storage user = userInfo[customer];
    if(user.tokenAmountA==0){
        user.tokenAmountA = amount;
        totalAmount = totalAmount.add(amount);
        user.rewardDebt = amount.mul(accPreReward);
    }else{
        user.tokenAmountA = user.tokenAmountA.add(amount);
        totalAmount = totalAmount.add(amount);
        uint256 currentDebt = amount.mul(accPreReward);
        user.rewardDebt = user.rewardDebt.add(currentDebt);
    }

  }

  function withdrawOneAsset(address customer,uint256 amount) public{
    require(msg.sender == router,"DHD:No operation permission");
    require(amount >0 && customer!=address(0),"DHD:Withdraw address and amount is Wrong");
    updateFarm();
    User storage user = userInfo[customer];
    require(amount == user.tokenAmountA,"DHD:Not all assets drawn");
    
    user.reward = amount.mul(accPreReward).sub(user.rewardDebt).add(user.reward);
    user.tokenAmountA = user.tokenAmountA.sub(amount);
    totalAmount = totalAmount.sub(amount);
    if(token==dToken){
        require(IERC20(token).transfer(customer,amount),"DHD:Transfer is failed!");
    }else{
        require(IMdexERC20(token).transfer(customer,amount),"DHD:Transfer is failed!");
    }
  }

  function claim(address customer,uint256 amount) public {
    updateFarm();
    User storage user = userInfo[customer];
    uint256 _userIncome = userIncome(customer);
    require(amount <= _userIncome,"DHD:User asset is not enough!");
    uint256 userRateIncome = amount.mul(75).div(100);
    require(IERC20(dToken).transfer(customer,userRateIncome),"DHD:Transfer failed!");
    uint256 ecology = amount.mul(5).div(100);
    require(IERC20(dToken).transfer(ecologyMinerWallet,ecology),"DHD:Transfer failed!");
    uint256 node = amount.mul(15).div(100);
    require(IERC20(dToken).transfer(nodeIncome,node),"DHD:Transfer failed!");
    minerAmount = minerAmount.sub(amount);
    uint256 _reward = user.reward.div(decimals);
    if(amount>_reward){
        uint256 middle = amount.sub(_reward);
        user.rewardDebt = user.rewardDebt.add(middle.mul(decimals));
        user.reward = 0;
    }else{
        user.reward = decimals.mul(_reward.sub(amount));
    }
  }

    function phase(uint256 blockNumber) public view returns (uint256) {
        if (halvingPeriod == 0) {
            return 0;
        }
        if (blockNumber > startBlock) {
            return (blockNumber.sub(startBlock).sub(1)).div(halvingPeriod);
        }
        return 0;
    }

     function reward(uint256 blockNumber) internal view returns (uint256) {
        uint256 _phase = phase(blockNumber);
        return dhdPerBlock.div(2 ** _phase);
    }

    function getDhdFarmReward(uint256 _lastRewardBlock) internal view returns (uint256) {
        uint256 total = IERC20(dToken).totalSupply().add(IERC20(dToken).killSupply());
        if(block.number < startBlock){
            return 0;
        }else if(total>=21000000e18){
            return 0;
        }else {
            uint256 blockReward = 0;
            uint256 n = phase(_lastRewardBlock);
            uint256 m = phase(block.number);
            while (n < m) {
                n++;
                uint256 r = n.mul(halvingPeriod).add(startBlock);
                blockReward = blockReward.add((r.sub(_lastRewardBlock)).mul(reward(r)));
                _lastRewardBlock = r;
            }
            blockReward = blockReward.add((block.number.sub(_lastRewardBlock)).mul(reward(block.number)));
            return blockReward;
        }
    }//6819901 "6820817"

    function updateFarm() internal {
      
        if(block.number < lastRewardBlock){
          return ;
        }
        if(totalAmount == 0){
          lastRewardBlock = block.number;
          return;
        }
        uint256 farmReward = getDhdFarmReward(lastRewardBlock);
        if(farmReward <= 0){
          return;
        }else{
          bool isMint = IERC20(dToken).mint(address(this),farmReward);
          if(isMint==true){
              uint256 transition = farmReward.mul(decimals).div(totalAmount);
              accPreReward = accPreReward.add(transition);
              lastRewardBlock = block.number;
              minerAmount = minerAmount.add(farmReward);
          }else{
              return;
          }
    }

  }
}


contract MinerFactory {
    mapping(address => address) public getFarm;
    address[] public allFarms;
    bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(Farm).creationCode));
    event FarmCreated(address indexed token0, address pair, uint);
    address  router;
    address  owner;
    address  nodeIncome;
    address  ecologyMinerWallet;
    address  dToken;

    constructor (){
        owner = msg.sender;
    }
    
    function changerOwner(address customer) public{
        require(msg.sender==owner,"DHD:No operation permission");
        owner = customer;
    }
      
    function getAllFarm() public view returns(address[] memory _allFarm){
      _allFarm = allFarms;
    }   
    
    function setMinerAddress(address _router,address _node,address _ecology,address _dToken)public{
        require(msg.sender==owner,"DHD:No operation permission");
        router = _router;
        nodeIncome = _node;
        ecologyMinerWallet = _ecology;
        dToken = _dToken;
    }
    
      function setPoolAddress(address token) public {
          require(msg.sender==owner,"DHD:No operation permission");
          address farm = getContractAddress(token);
          Farm(farm).setFarmAddress(router,dToken,ecologyMinerWallet,nodeIncome);
      }
  
    function createFarm(address token) external returns (address farm){
        require(msg.sender==router || msg.sender == owner,"DHD:No operation permission");
        require(token != address(0), 'DHD: ZERO_ADDRESS');
        require(getFarm[token] == address(0), 'DHD: PAIR_EXISTS'); // single check is sufficient
        bytes memory bytecode = type(Farm).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(token));
        //solium-disable-next-line
        assembly {
            farm := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }

        Farm(farm).initialize(token);
        getFarm[token] = farm; // populate mapping in the reverse direction
        allFarms.push(farm);
        emit FarmCreated(token, farm, allFarms.length);
    }
    
      function getContractAddress(address token) public view returns(address){
        bytes32 salt = keccak256(abi.encodePacked(token));
        return computeAddress(salt,keccak256(abi.encodePacked(type(Farm).creationCode)));
    }

    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return _computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function _computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) public pure returns (address) {
        bytes32 _data = keccak256(
            abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)
        );
        return address(uint160(uint256(_data)));
    }
}


contract Router {
  using SafeMath for uint256;
  using SafeMath for uint112;
  address public dToken;
  address public owner;
  address public minerFactory;
  address public nodeIncome;
  address public mdexFactory;
  address public usdt;
  
    constructor(){
        owner = msg.sender;
    }

    function setAllAddress(address _dToken,address _miner,address _node) public {
      require(msg.sender == owner,"DHD:No operation permission");
      dToken = _dToken;
      minerFactory = _miner;
      nodeIncome = _node;
  }
  

  function setMdexFactory(address _factory,address _usdt) public {
      require(msg.sender == owner,"DHD:No operation permission");
      mdexFactory = _factory;
      usdt = _usdt;
  }

  function getAllFarms() public view returns(address[] memory _allFarm){
      _allFarm = MinerFactory(minerFactory).getAllFarm();
  }

  function changeOwner(address _owner) public {
    require(msg.sender == owner,"DHD:No operation permission");
    owner = _owner;
  }

  function getPrice(address token) internal view returns (uint256 _tokenAmount) {
      (address token0,address token1) = token < usdt ? (token, usdt) : (usdt, token);
      if(token==usdt){
          _tokenAmount = 1e18;
      }else{
          (uint256 amount0,uint256 amount1)=IMdexFactory(mdexFactory).getReserves(token,usdt);
          if(token==token0 && usdt==token1){
               _tokenAmount = amount0.mul(1e18).div(amount1);
          }else{
              _tokenAmount = amount1.mul(1e18).div(amount0);
          }
      }
      
  }
  //0x9659A059431a7cF9C61933fe1A7b050358F1306E
  //0xb0b670fc1F7724119963018DB0BfA86aDb22d941
  //0xa71edc38d189767582c38a3145b5873052c3e47a usdt

  function getTotalKill() public view returns(uint256){
      return IERC20(dToken).killSupply();
  }

  function getOneAssetAPY(address token) public view returns (uint256 apy) {
      
    if(token==dToken){
        address farm = MinerFactory(minerFactory).getContractAddress(token);
        uint256 accBlock = Farm(farm).dhdPerBlock();
        uint256 totalDhd = accBlock.mul(10512000);
        uint256 amount=Farm(farm).getTotalAmount();
        if(amount==0){
            apy = totalDhd.mul(100);
        }else{
            apy = totalDhd.div(amount).mul(100);
        }
    }else{
        address farm = MinerFactory(minerFactory).getContractAddress(token);
        address token0 = IMdexPair(token).token0();
        address token1 = IMdexPair(token).token1();
        (uint112 tokenA,uint112 tokenB,) = IMdexPair(token).getReserves();
        uint256 totalMdexPairAsset = tokenA.mul(getPrice(token0)).add(tokenB.mul(getPrice(token1)));
        uint256 lpTotalSupply = IMdexPair(token).totalSupply();
        uint256 acclpAsset = totalMdexPairAsset.div(lpTotalSupply);
        uint256 totalPoollpAsset = acclpAsset.mul(Farm(farm).getTotalAmount());
        uint256 totallPoolAsset = Farm(farm).dhdPerBlock().mul(10512000).mul(getPrice(dToken));
        if(totalPoollpAsset==0){
            apy = totallPoolAsset.mul(100).div(1e18);
        }else{
            apy = totallPoolAsset.mul(100).div(totalPoollpAsset);
        }
    }

  }

  function generatefarm(address token) external returns(address farm){
      require(msg.sender == owner,"DHD:No operation permission");
      farm = MinerFactory(minerFactory).createFarm(token);
  }

  function getFarmAddress(address token)public view returns(address farm){
      farm = MinerFactory(minerFactory).getContractAddress(token);
  }

  function setMinerPool(address token,uint256 dhdPerBlock,uint256 halvingPeriod,uint256 startMint) public{
      require(msg.sender == owner,"DHD:No operation permission");
      address farm = MinerFactory(minerFactory).getContractAddress(token);
      Farm(farm).setPoolInfo(dhdPerBlock,halvingPeriod,startMint);
  }
//   function getAmountInA(address tokenA,address tokenB,uint256 amountB)public view returns(uint256 amountInA){
//           uint256 _tokenA = getPrice(tokenA);
//           uint256 _tokenB = getPrice(tokenB);
//           amountInA = amountB.mul(_tokenB).div(_tokenA);
//   }



  function getUserAmount(address token,address customer) public view returns(uint256 amount){
      require(token!=address(0)  && customer!=address(0),"DHD:Wrong address");
      address farm = MinerFactory(minerFactory).getContractAddress(token);
      amount = Farm(farm).getUserStakeAsset(customer);

  }


  function farmProvideOneAsset(address customer,address token,uint256 amount) public{
    require(customer!=address(0)&&token!=address(0)&&amount>0,"DHD:Wrong amount and address");
    address farm = MinerFactory(minerFactory).getContractAddress(token);
    if(token==dToken){
        require(IERC20(dToken).transferFrom(customer,farm,amount),"DHD:Transfer to contract is failed!");
        INodeIncome(nodeIncome).updateInto(customer,amount);
        Farm(farm).updateOneAsset(customer,amount);
    }else{
        require(IMdexERC20(token).transferFrom(customer,farm,amount),"DHD:Transfer is failed!");
        Farm(farm).updateOneAsset(customer,amount);
    }
    
  }
    

  function getAllownceAmount(address customer,address token) public view returns(bool){
      if(token==dToken){
          uint256 amount = IERC20(token).allowance(customer,address(this));
          if(amount <3000e18){
              return false;
          }else{
              return true;
          }
      }else{
          uint256 amount = IMdexERC20(token).allowance(customer,address(this));
          if(amount <3000e18){
              return false;
          }else{
              return true;
          }
            
      }
      
  }

  function farmWithdrawOneAsset(address customer,address token,uint256 amount) public{
    require(customer!=address(0) && token!=address(0) && amount>0,"DHD:Wrong address and amount");
    if(token == dToken){
        INodeIncome(nodeIncome).updateOut(customer,amount);
    }
    address farm = MinerFactory(minerFactory).getContractAddress(token);
    Farm(farm).withdrawOneAsset(customer,amount);
  }

  
  
  function farmClaim(address customer,address token,uint256 amount)public{
    require(customer!=address(0)&& token!=address(0),"DHD:Wrong address");
    address farm = MinerFactory(minerFactory).getContractAddress(token);
    Farm(farm).claim(customer,amount);
    INodeIncome(nodeIncome).commitTop100Reward(amount);
    uint256 kill = amount.mul(5).div(100);
    IERC20(dToken).burn(farm,kill);
  }

  function getUserWalletAsset(address token,address user) public view returns(uint256 asset){
      asset = IERC20(token).balanceOf(user);
  }


  function getMinerIncome(address user,address token) public view returns(uint256 income){
      address farm = MinerFactory(minerFactory).getContractAddress(token);
      income = Farm(farm).userIncome(user);
  }

  function getTotalAmount(address token) public view returns(uint256 amount){
     address farm = MinerFactory(minerFactory).getContractAddress(token);
     amount = Farm(farm).getTotalAmount();
  }


  function getFarmMinerAmount(address token) public view returns(uint256 minerAmount){
    address farm = MinerFactory(minerFactory).getContractAddress(token);
    minerAmount = Farm(farm).minerAmount();
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"farmClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"farmProvideOneAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"farmWithdrawOneAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"generatefarm","outputs":[{"internalType":"address","name":"farm","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllFarms","outputs":[{"internalType":"address[]","name":"_allFarm","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"customer","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getAllownceAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getFarmAddress","outputs":[{"internalType":"address","name":"farm","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getFarmMinerAmount","outputs":[{"internalType":"uint256","name":"minerAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getMinerIncome","outputs":[{"internalType":"uint256","name":"income","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getOneAssetAPY","outputs":[{"internalType":"uint256","name":"apy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTotalAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalKill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"customer","type":"address"}],"name":"getUserAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"getUserWalletAsset","outputs":[{"internalType":"uint256","name":"asset","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdexFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minerFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeIncome","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dToken","type":"address"},{"internalType":"address","name":"_miner","type":"address"},{"internalType":"address","name":"_node","type":"address"}],"name":"setAllAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_usdt","type":"address"}],"name":"setMdexFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"dhdPerBlock","type":"uint256"},{"internalType":"uint256","name":"halvingPeriod","type":"uint256"},{"internalType":"uint256","name":"startMint","type":"uint256"}],"name":"setMinerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061372e806100616000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063a6f9dae11161007c578063a6f9dae1146103ed578063a8f1c06b14610409578063b51533f514610439578063ccbb7cac14610455578063d9d7858a14610485578063f9559774146104a357610158565b80638da5cb5b146103055780638dab22b1146103235780638fb683bc146103535780639f19165914610383578063a266f9e1146103b3578063a6de93ac146103cf57610158565b806357d66d721161011557806357d66d72146102455780635a5397ae1461027557806363c17d2e1461029157806374fa1553146102af578063762cf77b146102cd578063784087ca146102e957610158565b806309a4d4ce1461015d5780630e13b9bd1461017b57806312920b56146101ab5780632f48ab7d146101c757806335f62e7e146101e557806346387d0a14610215575b600080fd5b6101656104c1565b60405161017291906130b9565b60405180910390f35b61019560048036038101906101909190612c88565b6104e7565b6040516101a2919061325a565b60405180910390f35b6101c560048036038101906101c09190612db4565b61061d565b005b6101cf6107d2565b6040516101dc91906130b9565b60405180910390f35b6101ff60048036038101906101fa9190612cda565b6107f8565b60405161020c919061325a565b60405180910390f35b61022f600480360381019061022a9190612cda565b61088b565b60405161023c919061325a565b60405180910390f35b61025f600480360381019061025a9190612c88565b6109cd565b60405161026c919061325a565b60405180910390f35b61028f600480360381019061028a9190612d65565b610b03565b005b610299610dbe565b6040516102a6919061325a565b60405180910390f35b6102b7610e64565b6040516102c491906130b9565b60405180910390f35b6102e760048036038101906102e29190612d16565b610e8a565b005b61030360048036038101906102fe9190612d65565b610fe1565b005b61030d6114ca565b60405161031a91906130b9565b60405180910390f35b61033d60048036038101906103389190612c88565b6114f0565b60405161034a91906130b9565b60405180910390f35b61036d60048036038101906103689190612c88565b6115a4565b60405161037a919061325a565b60405180910390f35b61039d60048036038101906103989190612cda565b611d37565b6040516103aa919061325a565b60405180910390f35b6103cd60048036038101906103c89190612cda565b611f22565b005b6103d7612038565b6040516103e491906130b9565b60405180910390f35b61040760048036038101906104029190612c88565b61205e565b005b610423600480360381019061041e9190612cda565b612132565b604051610430919061317f565b60405180910390f35b610453600480360381019061044e9190612d65565b6122f3565b005b61046f600480360381019061046a9190612c88565b612625565b60405161047c91906130b9565b60405180910390f35b61048d61276b565b60405161049a91906130b9565b60405180910390f35b6104ab61278f565b6040516104b8919061315d565b60405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b815260040161054591906130b9565b60206040518083038186803b15801561055d57600080fd5b505afa158015610571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105959190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff166365ac43416040518163ffffffff1660e01b815260040160206040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106159190612ed0565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a49061319a565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e866040518263ffffffff1660e01b815260040161070a91906130b9565b60206040518083038186803b15801561072257600080fd5b505afa158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a9190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff1663fb7853a98585856040518463ffffffff1660e01b815260040161079993929190613275565b600060405180830381600087803b1580156107b357600080fd5b505af11580156107c7573d6000803e3d6000fd5b505050505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161083391906130b9565b60206040518083038186803b15801561084b57600080fd5b505afa15801561085f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108839190612ed0565b905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b81526004016108e991906130b9565b60206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff1663c8ba7d21856040518263ffffffff1660e01b815260040161097491906130b9565b60206040518083038186803b15801561098c57600080fd5b505afa1580156109a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c49190612ed0565b91505092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b8152600401610a2b91906130b9565b60206040518083038186803b158015610a4357600080fd5b505afa158015610a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7b9190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff166368b6c06b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac357600080fd5b505afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190612ed0565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610b6d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015610b795750600081115b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf906131fa565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c9c57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a71343ae84836040518363ffffffff1660e01b8152600401610c69929190613134565b600060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b505050505b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b8152600401610cf991906130b9565b60206040518083038186803b158015610d1157600080fd5b505afa158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff1663ad63dc7f85846040518363ffffffff1660e01b8152600401610d86929190613134565b600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b5050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f42e79f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2757600080fd5b505afa158015610e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5f9190612ed0565b905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f119061319a565b60405180910390fd5b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561104b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156110575750600081115b611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d906131ba565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b81526004016110f391906130b9565b60206040518083038186803b15801561110b57600080fd5b505afa15801561111f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111439190612cb1565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113885760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8583856040518463ffffffff1660e01b81526004016111f6939291906130fd565b602060405180830381600087803b15801561121057600080fd5b505af1158015611224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112489190612e58565b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061321a565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631fdd12d185846040518363ffffffff1660e01b81526004016112e4929190613134565b600060405180830381600087803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166384eefdde85846040518363ffffffff1660e01b8152600401611351929190613134565b600060405180830381600087803b15801561136b57600080fd5b505af115801561137f573d6000803e3d6000fd5b505050506114c4565b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd8583856040518463ffffffff1660e01b81526004016113c5939291906130fd565b602060405180830381600087803b1580156113df57600080fd5b505af11580156113f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114179190612e58565b611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d906131da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166384eefdde85846040518363ffffffff1660e01b8152600401611491929190613134565b600060405180830381600087803b1580156114ab57600080fd5b505af11580156114bf573d6000803e3d6000fd5b505050505b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e836040518263ffffffff1660e01b815260040161154d91906130b9565b60206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190612cb1565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181e576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b815260040161165891906130b9565b60206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190612cb1565b905060008173ffffffffffffffffffffffffffffffffffffffff166338f4721d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f257600080fd5b505afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a9190612ed0565b9050600061174462a066808361283b90919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff166365ac43416040518163ffffffff1660e01b815260040160206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c69190612ed0565b905060008114156117ec576117e560648361283b90919063ffffffff16565b9450611815565b6118126064611804838561285190919063ffffffff16565b61283b90919063ffffffff16565b94505b50505050611d32565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b815260040161187b91906130b9565b60206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190612cb1565b905060008373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190612cb1565b905060008473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf9190612cb1565b90506000808673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611a1a57600080fd5b505afa158015611a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a529190612e81565b50915091506000611ac0611a87611a6886612867565b846dffffffffffffffffffffffffffff1661283b90919063ffffffff16565b611ab2611a9388612867565b866dffffffffffffffffffffffffffff1661283b90919063ffffffff16565b612b4990919063ffffffff16565b905060008873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0a57600080fd5b505afa158015611b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b429190612ed0565b90506000611b59828461285190919063ffffffff16565b90506000611bed8973ffffffffffffffffffffffffffffffffffffffff166365ac43416040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba657600080fd5b505afa158015611bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bde9190612ed0565b8361283b90919063ffffffff16565b90506000611cbe611c1d60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612867565b611cb062a066808d73ffffffffffffffffffffffffffffffffffffffff166338f4721d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6a57600080fd5b505afa158015611c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca29190612ed0565b61283b90919063ffffffff16565b61283b90919063ffffffff16565b90506000821415611cfe57611cf7670de0b6b3a7640000611ce960648461283b90919063ffffffff16565b61285190919063ffffffff16565b9a50611d27565b611d2482611d1660648461283b90919063ffffffff16565b61285190919063ffffffff16565b9a505b505050505050505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611da25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd89061323a565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e856040518263ffffffff1660e01b8152600401611e3e91906130b9565b60206040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff16636fc1ac7b846040518263ffffffff1660e01b8152600401611ec991906130b9565b60206040518083038186803b158015611ee157600080fd5b505afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190612ed0565b91505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061319a565b60405180910390fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e59061319a565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561223d5760008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85306040518363ffffffff1660e01b81526004016121c69291906130d4565b60206040518083038186803b1580156121de57600080fd5b505afa1580156121f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122169190612ed0565b905068a2a15d09519be000008110156122335760009150506122ed565b60019150506122ed565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85306040518363ffffffff1660e01b815260040161227a9291906130d4565b60206040518083038186803b15801561229257600080fd5b505afa1580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190612ed0565b905068a2a15d09519be000008110156122e75760009150506122ed565b60019150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561235d5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61239c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123939061323a565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663622bc90e846040518263ffffffff1660e01b81526004016123f991906130b9565b60206040518083038186803b15801561241157600080fd5b505afa158015612425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124499190612cb1565b90508073ffffffffffffffffffffffffffffffffffffffff1663aad3ec9685846040518363ffffffff1660e01b8152600401612486929190613134565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b50505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae9818ab836040518263ffffffff1660e01b8152600401612513919061325a565b600060405180830381600087803b15801561252d57600080fd5b505af1158015612541573d6000803e3d6000fd5b50505050600061256e606461256060058661283b90919063ffffffff16565b61285190919063ffffffff16565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac83836040518363ffffffff1660e01b81526004016125cb929190613134565b602060405180830381600087803b1580156125e557600080fd5b505af11580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261d9190612e58565b505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae9061319a565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663061278c0836040518263ffffffff1660e01b815260040161271291906130b9565b602060405180830381600087803b15801561272c57600080fd5b505af1158015612740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127649190612cb1565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663292740e06040518163ffffffff1660e01b815260040160006040518083038186803b1580156127f957600080fd5b505afa15801561280d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906128369190612e17565b905090565b6000818361284991906133ce565b905092915050565b6000818361285f919061339d565b905092915050565b6000806000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106128ea57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461290f565b83600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b91509150600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561297957670de0b6b3a76400009250612b42565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d52bb6f487600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016129fb9291906130d4565b604080518083038186803b158015612a1257600080fd5b505afa158015612a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4a9190612ef9565b915091508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612ad657508273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15612b0f57612b0881612afa670de0b6b3a76400008561283b90919063ffffffff16565b61285190919063ffffffff16565b9450612b3f565b612b3c82612b2e670de0b6b3a76400008461283b90919063ffffffff16565b61285190919063ffffffff16565b94505b50505b5050919050565b60008183612b579190613347565b905092915050565b6000612b72612b6d846132d1565b6132ac565b90508083825260208201905082856020860282011115612b9157600080fd5b60005b85811015612bc15781612ba78882612be0565b845260208401935060208301925050600181019050612b94565b5050509392505050565b600081359050612bda81613685565b92915050565b600081519050612bef81613685565b92915050565b600082601f830112612c0657600080fd5b8151612c16848260208601612b5f565b91505092915050565b600081519050612c2e8161369c565b92915050565b600081519050612c43816136b3565b92915050565b600081359050612c58816136ca565b92915050565b600081519050612c6d816136ca565b92915050565b600081519050612c82816136e1565b92915050565b600060208284031215612c9a57600080fd5b6000612ca884828501612bcb565b91505092915050565b600060208284031215612cc357600080fd5b6000612cd184828501612be0565b91505092915050565b60008060408385031215612ced57600080fd5b6000612cfb85828601612bcb565b9250506020612d0c85828601612bcb565b9150509250929050565b600080600060608486031215612d2b57600080fd5b6000612d3986828701612bcb565b9350506020612d4a86828701612bcb565b9250506040612d5b86828701612bcb565b9150509250925092565b600080600060608486031215612d7a57600080fd5b6000612d8886828701612bcb565b9350506020612d9986828701612bcb565b9250506040612daa86828701612c49565b9150509250925092565b60008060008060808587031215612dca57600080fd5b6000612dd887828801612bcb565b9450506020612de987828801612c49565b9350506040612dfa87828801612c49565b9250506060612e0b87828801612c49565b91505092959194509250565b600060208284031215612e2957600080fd5b600082015167ffffffffffffffff811115612e4357600080fd5b612e4f84828501612bf5565b91505092915050565b600060208284031215612e6a57600080fd5b6000612e7884828501612c1f565b91505092915050565b600080600060608486031215612e9657600080fd5b6000612ea486828701612c34565b9350506020612eb586828701612c34565b9250506040612ec686828701612c73565b9150509250925092565b600060208284031215612ee257600080fd5b6000612ef084828501612c5e565b91505092915050565b60008060408385031215612f0c57600080fd5b6000612f1a85828601612c5e565b9250506020612f2b85828601612c5e565b9150509250929050565b6000612f418383612f4d565b60208301905092915050565b612f5681613428565b82525050565b612f6581613428565b82525050565b6000612f768261330d565b612f808185613325565b9350612f8b836132fd565b8060005b83811015612fbc578151612fa38882612f35565b9750612fae83613318565b925050600181019050612f8f565b5085935050505092915050565b612fd28161343a565b82525050565b6000612fe5601b83613336565b9150612ff082613569565b602082019050919050565b6000613008601c83613336565b915061301382613592565b602082019050919050565b600061302b601783613336565b9150613036826135bb565b602082019050919050565b600061304e601c83613336565b9150613059826135e4565b602082019050919050565b6000613071602383613336565b915061307c8261360d565b604082019050919050565b6000613094601183613336565b915061309f8261365c565b602082019050919050565b6130b381613480565b82525050565b60006020820190506130ce6000830184612f5c565b92915050565b60006040820190506130e96000830185612f5c565b6130f66020830184612f5c565b9392505050565b60006060820190506131126000830186612f5c565b61311f6020830185612f5c565b61312c60408301846130aa565b949350505050565b60006040820190506131496000830185612f5c565b61315660208301846130aa565b9392505050565b600060208201905081810360008301526131778184612f6b565b905092915050565b60006020820190506131946000830184612fc9565b92915050565b600060208201905081810360008301526131b381612fd8565b9050919050565b600060208201905081810360008301526131d381612ffb565b9050919050565b600060208201905081810360008301526131f38161301e565b9050919050565b6000602082019050818103600083015261321381613041565b9050919050565b6000602082019050818103600083015261323381613064565b9050919050565b6000602082019050818103600083015261325381613087565b9050919050565b600060208201905061326f60008301846130aa565b92915050565b600060608201905061328a60008301866130aa565b61329760208301856130aa565b6132a460408301846130aa565b949350505050565b60006132b66132c7565b90506132c2828261349a565b919050565b6000604051905090565b600067ffffffffffffffff8211156132ec576132eb613529565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061335282613480565b915061335d83613480565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613392576133916134cb565b5b828201905092915050565b60006133a882613480565b91506133b383613480565b9250826133c3576133c26134fa565b5b828204905092915050565b60006133d982613480565b91506133e483613480565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561341d5761341c6134cb565b5b828202905092915050565b600061343382613460565b9050919050565b60008115159050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6134a382613558565b810181811067ffffffffffffffff821117156134c2576134c1613529565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4448443a4e6f206f7065726174696f6e207065726d697373696f6e0000000000600082015250565b7f4448443a57726f6e6720616d6f756e7420616e64206164647265737300000000600082015250565b7f4448443a5472616e73666572206973206661696c656421000000000000000000600082015250565b7f4448443a57726f6e67206164647265737320616e6420616d6f756e7400000000600082015250565b7f4448443a5472616e7366657220746f20636f6e7472616374206973206661696c60008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b7f4448443a57726f6e672061646472657373000000000000000000000000000000600082015250565b61368e81613428565b811461369957600080fd5b50565b6136a58161343a565b81146136b057600080fd5b50565b6136bc81613446565b81146136c757600080fd5b50565b6136d381613480565b81146136de57600080fd5b50565b6136ea8161348a565b81146136f557600080fd5b5056fea26469706673582212208f6fca8a2c39823f9b0f1951fba73e946f33322890db39eabcde565724cb1f8a64736f6c63430008040033

Deployed ByteCode Sourcemap

25818:7389:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25984:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32787:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29396:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26045:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32417:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32567:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32994:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31584:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27561:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25952:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26133:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30327:680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25927:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29245:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27668:1365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30009:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26374:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26014:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26708:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31019:559;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32006:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29039:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25901:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26568:134;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25984:25;;;;;;;;;;;;;:::o;32787:199::-;32846:14;32869:12;32897;;;;;;;;;;;32884:45;;;32930:5;32884:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32869:67;;32958:4;32953:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32944:36;;32787:199;;;;:::o;29396:320::-;29530:5;;;;;;;;;;;29516:19;;:10;:19;;;29508:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29575:12;29603;;;;;;;;;;;29590:45;;;29636:5;29590:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29575:67;;29656:4;29651:22;;;29674:11;29686:13;29700:9;29651:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29396:320;;;;;:::o;26045:19::-;;;;;;;;;;;;;:::o;32417:142::-;32493:13;32531:5;32524:23;;;32548:4;32524:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32516:37;;32417:142;;;;:::o;32567:214::-;32639:14;32663:12;32691;;;;;;;;;;;32678:45;;;32724:5;32678:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32663:67;;32753:4;32748:21;;;32770:4;32748:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32739:36;;32567:214;;;;;:::o;32994:208::-;33057:19;33084:12;33112;;;;;;;;;;;33099:45;;;33145:5;33099:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33084:67;;33177:4;33172:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33158:38;;32994:208;;;;:::o;31584:408::-;31700:1;31682:20;;:8;:20;;;;:41;;;;;31721:1;31706:17;;:5;:17;;;;31682:41;:53;;;;;31734:1;31727:6;:8;31682:53;31674:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;31786:6;;;;;;;;;;31777:15;;:5;:15;;;31774:88;;;31816:10;;;;;;;;;;;31804:33;;;31838:8;31847:6;31804:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31774:88;31868:12;31896;;;;;;;;;;;31883:45;;;31929:5;31883:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31868:67;;31947:4;31942:27;;;31970:8;31979:6;31942:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31584:408;;;;:::o;27561:101::-;27605:7;27636:6;;;;;;;;;;;27629:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27622:34;;27561:101;:::o;25952:27::-;;;;;;;;;;;;;:::o;26133:231::-;26240:5;;;;;;;;;;;26226:19;;:10;:19;;;26218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26294:7;26285:6;;:16;;;;;;;;;;;;;;;;;;26325:6;26310:12;;:21;;;;;;;;;;;;;;;;;;26353:5;26340:10;;:18;;;;;;;;;;;;;;;;;;26133:231;;;:::o;30327:680::-;30442:1;30424:20;;:8;:20;;;;:39;;;;;30461:1;30446:17;;:5;:17;;;;30424:39;:49;;;;;30472:1;30465:6;:8;30424:49;30416:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;30512:12;30540;;;;;;;;;;;30527:45;;;30573:5;30527:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30512:67;;30596:6;;;;;;;;;;30589:13;;:5;:13;;;30586:410;;;30629:6;;;;;;;;;;30622:27;;;30650:8;30659:4;30664:6;30622:49;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30614:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;30733:10;;;;;;;;;;;30721:34;;;30756:8;30765:6;30721:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30788:4;30783:25;;;30809:8;30818:6;30783:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30586:410;;;30867:5;30856:30;;;30887:8;30896:4;30901:6;30856:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30848:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;30951:4;30946:25;;;30972:8;30981:6;30946:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30586:410;30327:680;;;;:::o;25927:20::-;;;;;;;;;;;;;:::o;29245:145::-;29303:12;29345;;;;;;;;;;;29332:45;;;29378:5;29332:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29325:59;;29245:145;;;:::o;27668:1365::-;27728:11;27766:6;;;;;;;;;;;27759:13;;:5;:13;;;27756:1270;;;27784:12;27812;;;;;;;;;;;27799:45;;;27845:5;27799:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27784:67;;27862:16;27886:4;27881:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27862:43;;27916:16;27935:22;27948:8;27935;:12;;:22;;;;:::i;:::-;27916:41;;27968:14;27988:4;27983:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27968:42;;28032:1;28024:6;:9;28021:129;;;28055:17;28068:3;28055:8;:12;;:17;;;;:::i;:::-;28049:23;;28021:129;;;28109:29;28134:3;28109:20;28122:6;28109:8;:12;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;28103:35;;28021:129;27756:1270;;;;;;;28172:12;28200;;;;;;;;;;;28187:45;;;28233:5;28187:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28172:67;;28250:14;28277:5;28267:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28250:42;;28303:14;28330:5;28320:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28303:42;;28357:14;28372;28401:5;28391:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28356:65;;;;;28432:26;28461:62;28494:28;28505:16;28514:6;28505:8;:16::i;:::-;28494:6;:10;;;;:28;;;;:::i;:::-;28461;28472:16;28481:6;28472:8;:16::i;:::-;28461:6;:10;;;;:28;;;;:::i;:::-;:32;;:62;;;;:::i;:::-;28432:91;;28534:21;28568:5;28558:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28534:54;;28599:18;28620:37;28643:13;28620:18;:22;;:37;;;;:::i;:::-;28599:58;;28668:24;28695:43;28715:4;28710:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28695:10;:14;;:43;;;;:::i;:::-;28668:70;;28749:23;28775:60;28818:16;28827:6;;;;;;;;;;28818:8;:16::i;:::-;28775:38;28804:8;28780:4;28775:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;:38;;;;:::i;:::-;:42;;:60;;;;:::i;:::-;28749:86;;28867:1;28849:16;:19;28846:173;;;28890:34;28919:4;28890:24;28910:3;28890:15;:19;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;28884:40;;28846:173;;;28961:46;28990:16;28961:24;28981:3;28961:15;:19;;:24;;;;:::i;:::-;:28;;:46;;;;:::i;:::-;28955:52;;28846:173;27756:1270;;;;;;;;;;;27668:1365;;;:::o;30009:310::-;30084:14;30131:1;30116:17;;:5;:17;;;;:42;;;;;30156:1;30138:20;;:8;:20;;;;30116:42;30108:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30188:12;30216;;;;;;;;;;;30203:45;;;30249:5;30203:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30188:67;;30278:4;30273:28;;;30302:8;30273:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30264:47;;30009:310;;;;;:::o;26374:188::-;26468:5;;;;;;;;;;;26454:19;;:10;:19;;;26446:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26527:8;26513:11;;:22;;;;;;;;;;;;;;;;;;26551:5;26544:4;;:12;;;;;;;;;;;;;;;;;;26374:188;;:::o;26014:26::-;;;;;;;;;;;;;:::o;26708:136::-;26781:5;;;;;;;;;;;26767:19;;:10;:19;;;26759:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26832:6;26824:5;;:14;;;;;;;;;;;;;;;;;;26708:136;:::o;31019:559::-;31098:4;31122:6;;;;;;;;;;;31115:13;;:5;:13;;;31112:453;;;31142:14;31166:5;31159:23;;;31183:8;31200:4;31159:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31142:64;;31230:7;31222:6;:15;31219:108;;;31262:5;31255:12;;;;;31219:108;31309:4;31302:11;;;;;31112:453;31353:14;31381:5;31370:27;;;31398:8;31415:4;31370:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31353:68;;31445:7;31437:6;:15;31434:108;;;31477:5;31470:12;;;;;31434:108;31524:4;31517:11;;;31019:559;;;;;:::o;32006:405::-;32110:1;32092:20;;:8;:20;;;;:40;;;;;32130:1;32115:17;;:5;:17;;;;32092:40;32084:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;32160:12;32188;;;;;;;;;;;32175:45;;;32221:5;32175:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32160:67;;32239:4;32234:16;;;32251:8;32260:6;32234:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32286:10;;;;;;;;;;;32274:42;;;32317:6;32274:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32331:12;32346:22;32364:3;32346:13;32357:1;32346:6;:10;;:13;;;;:::i;:::-;:17;;:22;;;;:::i;:::-;32331:37;;32382:6;;;;;;;;;;32375:19;;;32395:4;32400;32375:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32006:405;;;;;:::o;29039:200::-;29093:12;29137:5;;;;;;;;;;;29123:19;;:10;:19;;;29115:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29202:12;;;;;;;;;;;29189:37;;;29227:5;29189:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29182:51;;29039:200;;;:::o;25901:21::-;;;;;;;;;;;;:::o;26568:134::-;26611:25;26670:12;;;;;;;;;;;26657:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26646:50;;26568:134;:::o;12082:98::-;12140:7;12171:1;12167;:5;;;;:::i;:::-;12160:12;;12082:98;;;;:::o;12481:::-;12539:7;12570:1;12566;:5;;;;:::i;:::-;12559:12;;12481:98;;;;:::o;26850:556::-;26906:20;26938:14;26953;26979:4;;;;;;;;;;;26971:12;;:5;:12;;;:44;;27003:4;;;;;;;;;;;27009:5;26971:44;;;26987:5;26994:4;;;;;;;;;;;26971:44;26937:78;;;;27034:4;;;;;;;;;;;27027:11;;:5;:11;;;27024:369;;;27067:4;27052:19;;27024:369;;;27099:15;27115;27145:11;;;;;;;;;;;27132:37;;;27170:5;27176:4;;;;;;;;;;;27132:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27098:83;;;;27204:6;27197:13;;:5;:13;;;:29;;;;;27220:6;27214:12;;:4;;;;;;;;;;;:12;;;27197:29;27194:190;;;27260:30;27282:7;27260:17;27272:4;27260:7;:11;;:17;;;;:::i;:::-;:21;;:30;;;;:::i;:::-;27245:45;;27194:190;;;27340:30;27362:7;27340:17;27352:4;27340:7;:11;;:17;;;;:::i;:::-;:21;;:30;;;;:::i;:::-;27325:45;;27194:190;27024:369;;;26850:556;;;;;:::o;11344:98::-;11402:7;11433:1;11429;:5;;;;:::i;:::-;11422:12;;11344:98;;;;:::o;24:677:1:-;131:5;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;286:6;279:5;272:21;320:4;313:5;309:16;302:23;;346:6;396:3;388:4;380:6;376:17;371:3;367:27;364:36;361:2;;;425:1;422;415:12;361:2;461:1;446:249;471:6;468:1;465:13;446:249;;;539:3;568:48;612:3;600:10;568:48;:::i;:::-;563:3;556:61;646:4;641:3;637:14;630:21;;680:4;675:3;671:14;664:21;;506:189;493:1;490;486:9;481:14;;446:249;;;450:14;137:564;;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;909:5;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1018:318::-;1100:5;1149:3;1142:4;1134:6;1130:17;1126:27;1116:2;;1167:1;1164;1157:12;1116:2;1200:6;1194:13;1225:105;1326:3;1318:6;1311:4;1303:6;1299:17;1225:105;:::i;:::-;1216:114;;1106:230;;;;;:::o;1342:137::-;1396:5;1427:6;1421:13;1412:22;;1443:30;1467:5;1443:30;:::i;:::-;1402:77;;;;:::o;1485:143::-;1542:5;1573:6;1567:13;1558:22;;1589:33;1616:5;1589:33;:::i;:::-;1548:80;;;;:::o;1634:139::-;1680:5;1718:6;1705:20;1696:29;;1734:33;1761:5;1734:33;:::i;:::-;1686:87;;;;:::o;1779:143::-;1836:5;1867:6;1861:13;1852:22;;1883:33;1910:5;1883:33;:::i;:::-;1842:80;;;;:::o;1928:141::-;1984:5;2015:6;2009:13;2000:22;;2031:32;2057:5;2031:32;:::i;:::-;1990:79;;;;:::o;2075:262::-;2134:6;2183:2;2171:9;2162:7;2158:23;2154:32;2151:2;;;2199:1;2196;2189:12;2151:2;2242:1;2267:53;2312:7;2303:6;2292:9;2288:22;2267:53;:::i;:::-;2257:63;;2213:117;2141:196;;;;:::o;2343:284::-;2413:6;2462:2;2450:9;2441:7;2437:23;2433:32;2430:2;;;2478:1;2475;2468:12;2430:2;2521:1;2546:64;2602:7;2593:6;2582:9;2578:22;2546:64;:::i;:::-;2536:74;;2492:128;2420:207;;;;:::o;2633:407::-;2701:6;2709;2758:2;2746:9;2737:7;2733:23;2729:32;2726:2;;;2774:1;2771;2764:12;2726:2;2817:1;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2788:117;2944:2;2970:53;3015:7;3006:6;2995:9;2991:22;2970:53;:::i;:::-;2960:63;;2915:118;2716:324;;;;;:::o;3046:552::-;3123:6;3131;3139;3188:2;3176:9;3167:7;3163:23;3159:32;3156:2;;;3204:1;3201;3194:12;3156:2;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3374:2;3400:53;3445:7;3436:6;3425:9;3421:22;3400:53;:::i;:::-;3390:63;;3345:118;3502:2;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3473:118;3146:452;;;;;:::o;3604:552::-;3681:6;3689;3697;3746:2;3734:9;3725:7;3721:23;3717:32;3714:2;;;3762:1;3759;3752:12;3714:2;3805:1;3830:53;3875:7;3866:6;3855:9;3851:22;3830:53;:::i;:::-;3820:63;;3776:117;3932:2;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3903:118;4060:2;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4031:118;3704:452;;;;;:::o;4162:698::-;4248:6;4256;4264;4272;4321:3;4309:9;4300:7;4296:23;4292:33;4289:2;;;4338:1;4335;4328:12;4289:2;4381:1;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;:::i;:::-;4396:63;;4352:117;4508:2;4534:53;4579:7;4570:6;4559:9;4555:22;4534:53;:::i;:::-;4524:63;;4479:118;4636:2;4662:53;4707:7;4698:6;4687:9;4683:22;4662:53;:::i;:::-;4652:63;;4607:118;4764:2;4790:53;4835:7;4826:6;4815:9;4811:22;4790:53;:::i;:::-;4780:63;;4735:118;4279:581;;;;;;;:::o;4866:420::-;4961:6;5010:2;4998:9;4989:7;4985:23;4981:32;4978:2;;;5026:1;5023;5016:12;4978:2;5090:1;5079:9;5075:17;5069:24;5120:18;5112:6;5109:30;5106:2;;;5152:1;5149;5142:12;5106:2;5180:89;5261:7;5252:6;5241:9;5237:22;5180:89;:::i;:::-;5170:99;;5040:239;4968:318;;;;:::o;5292:278::-;5359:6;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:61;5545:7;5536:6;5525:9;5521:22;5492:61;:::i;:::-;5482:71;;5438:125;5366:204;;;;:::o;5576:594::-;5663:6;5671;5679;5728:2;5716:9;5707:7;5703:23;5699:32;5696:2;;;5744:1;5741;5734:12;5696:2;5787:1;5812:64;5868:7;5859:6;5848:9;5844:22;5812:64;:::i;:::-;5802:74;;5758:128;5925:2;5951:64;6007:7;5998:6;5987:9;5983:22;5951:64;:::i;:::-;5941:74;;5896:129;6064:2;6090:63;6145:7;6136:6;6125:9;6121:22;6090:63;:::i;:::-;6080:73;;6035:128;5686:484;;;;;:::o;6176:284::-;6246:6;6295:2;6283:9;6274:7;6270:23;6266:32;6263:2;;;6311:1;6308;6301:12;6263:2;6354:1;6379:64;6435:7;6426:6;6415:9;6411:22;6379:64;:::i;:::-;6369:74;;6325:128;6253:207;;;;:::o;6466:440::-;6545:6;6553;6602:2;6590:9;6581:7;6577:23;6573:32;6570:2;;;6618:1;6615;6608:12;6570:2;6661:1;6686:64;6742:7;6733:6;6722:9;6718:22;6686:64;:::i;:::-;6676:74;;6632:128;6799:2;6825:64;6881:7;6872:6;6861:9;6857:22;6825:64;:::i;:::-;6815:74;;6770:129;6560:346;;;;;:::o;6912:179::-;6981:10;7002:46;7044:3;7036:6;7002:46;:::i;:::-;7080:4;7075:3;7071:14;7057:28;;6992:99;;;;:::o;7097:108::-;7174:24;7192:5;7174:24;:::i;:::-;7169:3;7162:37;7152:53;;:::o;7211:118::-;7298:24;7316:5;7298:24;:::i;:::-;7293:3;7286:37;7276:53;;:::o;7365:732::-;7484:3;7513:54;7561:5;7513:54;:::i;:::-;7583:86;7662:6;7657:3;7583:86;:::i;:::-;7576:93;;7693:56;7743:5;7693:56;:::i;:::-;7772:7;7803:1;7788:284;7813:6;7810:1;7807:13;7788:284;;;7889:6;7883:13;7916:63;7975:3;7960:13;7916:63;:::i;:::-;7909:70;;8002:60;8055:6;8002:60;:::i;:::-;7992:70;;7848:224;7835:1;7832;7828:9;7823:14;;7788:284;;;7792:14;8088:3;8081:10;;7489:608;;;;;;;:::o;8103:109::-;8184:21;8199:5;8184:21;:::i;:::-;8179:3;8172:34;8162:50;;:::o;8218:366::-;8360:3;8381:67;8445:2;8440:3;8381:67;:::i;:::-;8374:74;;8457:93;8546:3;8457:93;:::i;:::-;8575:2;8570:3;8566:12;8559:19;;8364:220;;;:::o;8590:366::-;8732:3;8753:67;8817:2;8812:3;8753:67;:::i;:::-;8746:74;;8829:93;8918:3;8829:93;:::i;:::-;8947:2;8942:3;8938:12;8931:19;;8736:220;;;:::o;8962:366::-;9104:3;9125:67;9189:2;9184:3;9125:67;:::i;:::-;9118:74;;9201:93;9290:3;9201:93;:::i;:::-;9319:2;9314:3;9310:12;9303:19;;9108:220;;;:::o;9334:366::-;9476:3;9497:67;9561:2;9556:3;9497:67;:::i;:::-;9490:74;;9573:93;9662:3;9573:93;:::i;:::-;9691:2;9686:3;9682:12;9675:19;;9480:220;;;:::o;9706:366::-;9848:3;9869:67;9933:2;9928:3;9869:67;:::i;:::-;9862:74;;9945:93;10034:3;9945:93;:::i;:::-;10063:2;10058:3;10054:12;10047:19;;9852:220;;;:::o;10078:366::-;10220:3;10241:67;10305:2;10300:3;10241:67;:::i;:::-;10234:74;;10317:93;10406:3;10317:93;:::i;:::-;10435:2;10430:3;10426:12;10419:19;;10224:220;;;:::o;10450:118::-;10537:24;10555:5;10537:24;:::i;:::-;10532:3;10525:37;10515:53;;:::o;10574:222::-;10667:4;10705:2;10694:9;10690:18;10682:26;;10718:71;10786:1;10775:9;10771:17;10762:6;10718:71;:::i;:::-;10672:124;;;;:::o;10802:332::-;10923:4;10961:2;10950:9;10946:18;10938:26;;10974:71;11042:1;11031:9;11027:17;11018:6;10974:71;:::i;:::-;11055:72;11123:2;11112:9;11108:18;11099:6;11055:72;:::i;:::-;10928:206;;;;;:::o;11140:442::-;11289:4;11327:2;11316:9;11312:18;11304:26;;11340:71;11408:1;11397:9;11393:17;11384:6;11340:71;:::i;:::-;11421:72;11489:2;11478:9;11474:18;11465:6;11421:72;:::i;:::-;11503;11571:2;11560:9;11556:18;11547:6;11503:72;:::i;:::-;11294:288;;;;;;:::o;11588:332::-;11709:4;11747:2;11736:9;11732:18;11724:26;;11760:71;11828:1;11817:9;11813:17;11804:6;11760:71;:::i;:::-;11841:72;11909:2;11898:9;11894:18;11885:6;11841:72;:::i;:::-;11714:206;;;;;:::o;11926:373::-;12069:4;12107:2;12096:9;12092:18;12084:26;;12156:9;12150:4;12146:20;12142:1;12131:9;12127:17;12120:47;12184:108;12287:4;12278:6;12184:108;:::i;:::-;12176:116;;12074:225;;;;:::o;12305:210::-;12392:4;12430:2;12419:9;12415:18;12407:26;;12443:65;12505:1;12494:9;12490:17;12481:6;12443:65;:::i;:::-;12397:118;;;;:::o;12521:419::-;12687:4;12725:2;12714:9;12710:18;12702:26;;12774:9;12768:4;12764:20;12760:1;12749:9;12745:17;12738:47;12802:131;12928:4;12802:131;:::i;:::-;12794:139;;12692:248;;;:::o;12946:419::-;13112:4;13150:2;13139:9;13135:18;13127:26;;13199:9;13193:4;13189:20;13185:1;13174:9;13170:17;13163:47;13227:131;13353:4;13227:131;:::i;:::-;13219:139;;13117:248;;;:::o;13371:419::-;13537:4;13575:2;13564:9;13560:18;13552:26;;13624:9;13618:4;13614:20;13610:1;13599:9;13595:17;13588:47;13652:131;13778:4;13652:131;:::i;:::-;13644:139;;13542:248;;;:::o;13796:419::-;13962:4;14000:2;13989:9;13985:18;13977:26;;14049:9;14043:4;14039:20;14035:1;14024:9;14020:17;14013:47;14077:131;14203:4;14077:131;:::i;:::-;14069:139;;13967:248;;;:::o;14221:419::-;14387:4;14425:2;14414:9;14410:18;14402:26;;14474:9;14468:4;14464:20;14460:1;14449:9;14445:17;14438:47;14502:131;14628:4;14502:131;:::i;:::-;14494:139;;14392:248;;;:::o;14646:419::-;14812:4;14850:2;14839:9;14835:18;14827:26;;14899:9;14893:4;14889:20;14885:1;14874:9;14870:17;14863:47;14927:131;15053:4;14927:131;:::i;:::-;14919:139;;14817:248;;;:::o;15071:222::-;15164:4;15202:2;15191:9;15187:18;15179:26;;15215:71;15283:1;15272:9;15268:17;15259:6;15215:71;:::i;:::-;15169:124;;;;:::o;15299:442::-;15448:4;15486:2;15475:9;15471:18;15463:26;;15499:71;15567:1;15556:9;15552:17;15543:6;15499:71;:::i;:::-;15580:72;15648:2;15637:9;15633:18;15624:6;15580:72;:::i;:::-;15662;15730:2;15719:9;15715:18;15706:6;15662:72;:::i;:::-;15453:288;;;;;;:::o;15747:129::-;15781:6;15808:20;;:::i;:::-;15798:30;;15837:33;15865:4;15857:6;15837:33;:::i;:::-;15788:88;;;:::o;15882:75::-;15915:6;15948:2;15942:9;15932:19;;15922:35;:::o;15963:311::-;16040:4;16130:18;16122:6;16119:30;16116:2;;;16152:18;;:::i;:::-;16116:2;16202:4;16194:6;16190:17;16182:25;;16262:4;16256;16252:15;16244:23;;16045:229;;;:::o;16280:132::-;16347:4;16370:3;16362:11;;16400:4;16395:3;16391:14;16383:22;;16352:60;;;:::o;16418:114::-;16485:6;16519:5;16513:12;16503:22;;16492:40;;;:::o;16538:113::-;16608:4;16640;16635:3;16631:14;16623:22;;16613:38;;;:::o;16657:184::-;16756:11;16790:6;16785:3;16778:19;16830:4;16825:3;16821:14;16806:29;;16768:73;;;;:::o;16847:169::-;16931:11;16965:6;16960:3;16953:19;17005:4;17000:3;16996:14;16981:29;;16943:73;;;;:::o;17022:305::-;17062:3;17081:20;17099:1;17081:20;:::i;:::-;17076:25;;17115:20;17133:1;17115:20;:::i;:::-;17110:25;;17269:1;17201:66;17197:74;17194:1;17191:81;17188:2;;;17275:18;;:::i;:::-;17188:2;17319:1;17316;17312:9;17305:16;;17066:261;;;;:::o;17333:185::-;17373:1;17390:20;17408:1;17390:20;:::i;:::-;17385:25;;17424:20;17442:1;17424:20;:::i;:::-;17419:25;;17463:1;17453:2;;17468:18;;:::i;:::-;17453:2;17510:1;17507;17503:9;17498:14;;17375:143;;;;:::o;17524:348::-;17564:7;17587:20;17605:1;17587:20;:::i;:::-;17582:25;;17621:20;17639:1;17621:20;:::i;:::-;17616:25;;17809:1;17741:66;17737:74;17734:1;17731:81;17726:1;17719:9;17712:17;17708:105;17705:2;;;17816:18;;:::i;:::-;17705:2;17864:1;17861;17857:9;17846:20;;17572:300;;;;:::o;17878:96::-;17915:7;17944:24;17962:5;17944:24;:::i;:::-;17933:35;;17923:51;;;:::o;17980:90::-;18014:7;18057:5;18050:13;18043:21;18032:32;;18022:48;;;:::o;18076:114::-;18113:7;18153:30;18146:5;18142:42;18131:53;;18121:69;;;:::o;18196:126::-;18233:7;18273:42;18266:5;18262:54;18251:65;;18241:81;;;:::o;18328:77::-;18365:7;18394:5;18383:16;;18373:32;;;:::o;18411:93::-;18447:7;18487:10;18480:5;18476:22;18465:33;;18455:49;;;:::o;18510:281::-;18593:27;18615:4;18593:27;:::i;:::-;18585:6;18581:40;18723:6;18711:10;18708:22;18687:18;18675:10;18672:34;18669:62;18666:2;;;18734:18;;:::i;:::-;18666:2;18774:10;18770:2;18763:22;18553:238;;;:::o;18797:180::-;18845:77;18842:1;18835:88;18942:4;18939:1;18932:15;18966:4;18963:1;18956:15;18983:180;19031:77;19028:1;19021:88;19128:4;19125:1;19118:15;19152:4;19149:1;19142:15;19169:180;19217:77;19214:1;19207:88;19314:4;19311:1;19304:15;19338:4;19335:1;19328:15;19355:102;19396:6;19447:2;19443:7;19438:2;19431:5;19427:14;19423:28;19413:38;;19403:54;;;:::o;19463:177::-;19603:29;19599:1;19591:6;19587:14;19580:53;19569:71;:::o;19646:178::-;19786:30;19782:1;19774:6;19770:14;19763:54;19752:72;:::o;19830:173::-;19970:25;19966:1;19958:6;19954:14;19947:49;19936:67;:::o;20009:178::-;20149:30;20145:1;20137:6;20133:14;20126:54;20115:72;:::o;20193:222::-;20333:34;20329:1;20321:6;20317:14;20310:58;20402:5;20397:2;20389:6;20385:15;20378:30;20299:116;:::o;20421:167::-;20561:19;20557:1;20549:6;20545:14;20538:43;20527:61;:::o;20594:122::-;20667:24;20685:5;20667:24;:::i;:::-;20660:5;20657:35;20647:2;;20706:1;20703;20696:12;20647:2;20637:79;:::o;20722:116::-;20792:21;20807:5;20792:21;:::i;:::-;20785:5;20782:32;20772:2;;20828:1;20825;20818:12;20772:2;20762:76;:::o;20844:122::-;20917:24;20935:5;20917:24;:::i;:::-;20910:5;20907:35;20897:2;;20956:1;20953;20946:12;20897:2;20887:79;:::o;20972:122::-;21045:24;21063:5;21045:24;:::i;:::-;21038:5;21035:35;21025:2;;21084:1;21081;21074:12;21025:2;21015:79;:::o;21100:120::-;21172:23;21189:5;21172:23;:::i;:::-;21165:5;21162:34;21152:2;;21210:1;21207;21200:12;21152:2;21142:78;:::o

Swarm Source

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