contract Withdrawable is Ownable {
  using SafeTransfer for ERC20;
  address constant ETHER = address(0);

  event LogWithdrawToken(
    address indexed _from,
    address indexed _token,
    uint amount
  );

  /**
   * @dev Withdraw asset.
   * @param _tokenAddress Asset to be withdrawed.
   * @return bool.
   */
  function withdrawToken(address _tokenAddress) public onlyOwner {
    uint tokenBalance;
    if (_tokenAddress == ETHER) {
      tokenBalance = address(this).balance;
      msg.sender.transfer(tokenBalance);
    } else {
      tokenBalance = ERC20(_tokenAddress).balanceOf(address(this));
      ERC20(_tokenAddress)._safeTransfer(msg.sender, tokenBalance);
    }
    emit LogWithdrawToken(msg.sender, _tokenAddress, tokenBalance);
  }

}
function withdrawToken(address _tokenAddress) public onlyOwner {
  uint tokenBalance;
  if (_tokenAddress == ETHER) {
    tokenBalance = address(this).balance;
    msg.sender.transfer(tokenBalance);
  } else {
    tokenBalance = ERC20(_tokenAddress).balanceOf(address(this));
    ERC20(_tokenAddress)._safeTransfer(msg.sender, tokenBalance);
  }
  emit LogWithdrawToken(msg.sender, _tokenAddress, tokenBalance);
}

/**
 * @dev Withdraw asset.
 * @param _tokenAddress Asset to be withdrawed.
 * @return bool.
 */