/**
  * Create a new BrowserID object.
  *
  * @param message The http message.
  * @param protocol The protocol name.
  * @param callbacks {@link burp.IBurpExtenderCallbacks}
  */
 public BrowserID(
     IHttpRequestResponse message, String protocol, IBurpExtenderCallbacks callbacks) {
   super(message, protocol, callbacks);
   super.setToken(findToken());
   super.setProtocolflowID(analyseProtocol());
   add(this, getProtocolflowID());
 }
  /**
   * Analyse the protocol for the right table.
   *
   * @return The protocol flow id.
   */
  @Override
  public int analyseProtocol() {
    logging.log(
        getClass(), "\nAnalyse: " + getProtocol() + " with ID: " + getToken(), Logging.DEBUG);
    ArrayList<SSOProtocol> last_protocolflow = SSOProtocol.getLastProtocolFlow();
    if (last_protocolflow != null) {
      double listsize = (double) last_protocolflow.size();
      double protocol = 0;
      double token = 0;

      long tmp = 0;
      long curr_time = 0;
      long last_time = 0;
      boolean wait = true;

      for (SSOProtocol sso : last_protocolflow) {
        if (sso.getProtocol().substring(0, 5).equals(this.getProtocol().substring(0, 5))) {
          logging.log(getClass(), sso.getProtocol(), Logging.DEBUG);
          protocol++;
        }
        if (sso.getToken().equals(this.getToken())) {
          logging.log(getClass(), sso.getToken(), Logging.DEBUG);
          token++;
        }
        if (wait) {
          wait = false;
        } else {
          curr_time = sso.getTimestamp();
          tmp += curr_time - last_time;
          logging.log(getClass(), "Diff: " + (curr_time - last_time), Logging.DEBUG);
        }
        last_time = sso.getTimestamp();
      }

      if (listsize >= 0) {
        double diff_time = ((double) tmp / listsize);
        double curr_diff_time =
            getTimestamp() - last_protocolflow.get(last_protocolflow.size() - 1).getTimestamp();
        double time_bonus = 0;
        logging.log(getClass(), "CurrDiff:" + curr_diff_time + " Diff:" + diff_time, Logging.DEBUG);
        if (curr_diff_time <= (diff_time + 4000)) {
          time_bonus = 0.35;
        }
        double prob = ((protocol / listsize) + (token / listsize) * 2) / 3 + (time_bonus);
        logging.log(getClass(), "Probability: " + prob, Logging.DEBUG);
        if (prob >= 0.6) {
          return getIDOfLastList();
        }
      }
    }
    return newProtocolflowID();
  }