// Path: android-net/src/main/java/li/vin/net/Message.java
// public static final class AccelData {
// 
//   /*
//   "accel": {
//       "maxZ": 6.282417,
//       "maxX": -2.911364,
//       "maxY": -2.489982,
//       "minX": -7.853021,
//       "minY": -10.649463,
//       "minZ": -0.804456
//     }
//    */
// 
//   private Double maxX;
//   private Double maxY;
//   private Double maxZ;
//   private Double minX;
//   private Double minY;
//   private Double minZ;
// 
//   AccelData(double maxX, double maxY, double maxZ, double minX, double minY, double minZ) {
//     this.maxX = maxX;
//     this.maxY = maxY;
//     this.maxZ = maxZ;
//     this.minX = minX;
//     this.minY = minY;
//     this.minZ = minZ;
//   }
// 
//   AccelData() {
//   }
// 
//   public double maxX() {
//     if (maxX == null) return 0d;
//     return maxX;
//   }
// 
//   public double maxY() {
//     if (maxY == null) return 0d;
//     return maxY;
//   }
// 
//   public double maxZ() {
//     if (maxZ == null) return 0d;
//     return maxZ;
//   }
// 
//   public double minX() {
//     if (minX == null) return 0d;
//     return minX;
//   }
// 
//   public double minY() {
//     if (minY == null) return 0d;
//     return minY;
//   }
// 
//   public double minZ() {
//     if (minZ == null) return 0d;
//     return minZ;
//   }
// 
//   @Override
//   public String toString() {
//     return "AccelData{" +
//         "maxX=" + maxX +
//         ", maxY=" + maxY +
//         ", maxZ=" + maxZ +
//         ", minX=" + minX +
//         ", minY=" + minY +
//         ", minZ=" + minZ +
//         '}';
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     AccelData accelData = (AccelData) o;
//     return !(maxX != null
//         ? !maxX.equals(accelData.maxX)
//         : accelData.maxX != null) && !(maxY != null
//         ? !maxY.equals(accelData.maxY)
//         : accelData.maxY != null) && !(maxZ != null
//         ? !maxZ.equals(accelData.maxZ)
//         : accelData.maxZ != null) && !(minX != null
//         ? !minX.equals(accelData.minX)
//         : accelData.minX != null) && !(minY != null
//         ? !minY.equals(accelData.minY)
//         : accelData.minY != null) && !(minZ != null
//         ? !minZ.equals(accelData.minZ)
//         : accelData.minZ != null);
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = maxX != null
//         ? maxX.hashCode()
//         : 0;
//     result = 31 * result + (maxY != null
//         ? maxY.hashCode()
//         : 0);
//     result = 31 * result + (maxZ != null
//         ? maxZ.hashCode()
//         : 0);
//     result = 31 * result + (minX != null
//         ? minX.hashCode()
//         : 0);
//     result = 31 * result + (minY != null
//         ? minY.hashCode()
//         : 0);
//     result = 31 * result + (minZ != null
//         ? minZ.hashCode()
//         : 0);
//     return result;
//   }
// }


import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import auto.parcel.AutoParcel;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;
import li.vin.net.Message.AccelData;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
      if (colonIndex == line.length() - 1) return; // can't end with colon
      pfx = line.substring(0, colonIndex);
      line = line.substring(colonIndex + 1);
    } else if (line.length() == 2) {
      pfx = line;
      line = null;
    } else if (line.startsWith("41")) {
      pfx = "41";
      line = line.substring(2);
    } else {
      return;
    }

    if (pfx.equals("41") && line != null && line.length() > 2) {
      processObd(line.substring(0, 2), line.substring(2), dt, subscriber);
    } else if (pfx.equals("A") && line != null && line.length() >= 14) {
      StreamMessage sm = emptyStreamMessage();
      boolean accelFound = false;
      try {
        sm.payload.data.put("udpCollision",
            Integer.valueOf(line.substring(line.length() - 2), 16) == 0
                ? Boolean.FALSE
                : Boolean.TRUE);
        accelFound = true;
      } catch (Exception ignored) {
      }
      try {
        float xAccel = Integer.valueOf(line.substring(0, 4), 16).shortValue() * ACCEL_CONVERT;
        float yAccel = Integer.valueOf(line.substring(4, 8), 16).shortValue() * ACCEL_CONVERT;
        float zAccel = Integer.valueOf(line.substring(8, 12), 16).shortValue() * ACCEL_CONVERT;
// Path: android-net/src/main/java/li/vin/net/Message.java
// public static final class AccelData {
// 
//   /*
//   "accel": {
//       "maxZ": 6.282417,
//       "maxX": -2.911364,
//       "maxY": -2.489982,
//       "minX": -7.853021,
//       "minY": -10.649463,
//       "minZ": -0.804456
//     }
//    */
// 
//   private Double maxX;
//   private Double maxY;
//   private Double maxZ;
//   private Double minX;
//   private Double minY;
//   private Double minZ;
// 
//   AccelData(double maxX, double maxY, double maxZ, double minX, double minY, double minZ) {
//     this.maxX = maxX;
//     this.maxY = maxY;
//     this.maxZ = maxZ;
//     this.minX = minX;
//     this.minY = minY;
//     this.minZ = minZ;
//   }
// 
//   AccelData() {
//   }
// 
//   public double maxX() {
//     if (maxX == null) return 0d;
//     return maxX;
//   }
// 
//   public double maxY() {
//     if (maxY == null) return 0d;
//     return maxY;
//   }
// 
//   public double maxZ() {
//     if (maxZ == null) return 0d;
//     return maxZ;
//   }
// 
//   public double minX() {
//     if (minX == null) return 0d;
//     return minX;
//   }
// 
//   public double minY() {
//     if (minY == null) return 0d;
//     return minY;
//   }
// 
//   public double minZ() {
//     if (minZ == null) return 0d;
//     return minZ;
//   }
// 
//   @Override
//   public String toString() {
//     return "AccelData{" +
//         "maxX=" + maxX +
//         ", maxY=" + maxY +
//         ", maxZ=" + maxZ +
//         ", minX=" + minX +
//         ", minY=" + minY +
//         ", minZ=" + minZ +
//         '}';
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
//     AccelData accelData = (AccelData) o;
//     return !(maxX != null
//         ? !maxX.equals(accelData.maxX)
//         : accelData.maxX != null) && !(maxY != null
//         ? !maxY.equals(accelData.maxY)
//         : accelData.maxY != null) && !(maxZ != null
//         ? !maxZ.equals(accelData.maxZ)
//         : accelData.maxZ != null) && !(minX != null
//         ? !minX.equals(accelData.minX)
//         : accelData.minX != null) && !(minY != null
//         ? !minY.equals(accelData.minY)
//         : accelData.minY != null) && !(minZ != null
//         ? !minZ.equals(accelData.minZ)
//         : accelData.minZ != null);
//   }
// 
//   @Override
//   public int hashCode() {
//     int result = maxX != null
//         ? maxX.hashCode()
//         : 0;
//     result = 31 * result + (maxY != null
//         ? maxY.hashCode()
//         : 0);
//     result = 31 * result + (maxZ != null
//         ? maxZ.hashCode()
//         : 0);
//     result = 31 * result + (minX != null
//         ? minX.hashCode()
//         : 0);
//     result = 31 * result + (minY != null
//         ? minY.hashCode()
//         : 0);
//     result = 31 * result + (minZ != null
//         ? minZ.hashCode()
//         : 0);
//     return result;
//   }
// }


// Path: android-net/src/main/java/li/vin/net/StreamMessage.java
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import auto.parcel.AutoParcel;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;
import li.vin.net.Message.AccelData;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;

      if (colonIndex == line.length() - 1) return; // can't end with colon
      pfx = line.substring(0, colonIndex);
      line = line.substring(colonIndex + 1);
    } else if (line.length() == 2) {
      pfx = line;
      line = null;
    } else if (line.startsWith("41")) {
      pfx = "41";
      line = line.substring(2);
    } else {
      return;
    }

    if (pfx.equals("41") && line != null && line.length() > 2) {
      processObd(line.substring(0, 2), line.substring(2), dt, subscriber);
    } else if (pfx.equals("A") && line != null && line.length() >= 14) {
      StreamMessage sm = emptyStreamMessage();
      boolean accelFound = false;
      try {
        sm.payload.data.put("udpCollision",
            Integer.valueOf(line.substring(line.length() - 2), 16) == 0
                ? Boolean.FALSE
                : Boolean.TRUE);
        accelFound = true;
      } catch (Exception ignored) {
      }
      try {
        float xAccel = Integer.valueOf(line.substring(0, 4), 16).shortValue() * ACCEL_CONVERT;
        float yAccel = Integer.valueOf(line.substring(4, 8), 16).shortValue() * ACCEL_CONVERT;
        float zAccel = Integer.valueOf(line.substring(8, 12), 16).shortValue() * ACCEL_CONVERT;
        sm.payload.data.put("accel", new AccelData(xAccel, yAccel, zAccel, xAccel, yAccel, zAccel));