@Override
  public ZoneOffsetTransition previousTransition(Instant instant) {

    long epochSec = instant.getEpochSecond();
    if (instant.getNano() > 0 && epochSec < Long.MAX_VALUE) {
      epochSec += 1; // allow rest of method to only use seconds
    }

    // check if using last rules
    long lastHistoric = this.savingsInstantTransitions[this.savingsInstantTransitions.length - 1];
    if (this.lastRules.length > 0 && epochSec > lastHistoric) {
      // search year the instant is in
      ZoneOffset lastHistoricOffset = this.wallOffsets[this.wallOffsets.length - 1];
      int year = findYear(epochSec, lastHistoricOffset);
      ZoneOffsetTransition[] transArray = findTransitionArray(year);
      for (int i = transArray.length - 1; i >= 0; i--) {
        if (epochSec > transArray[i].toEpochSecond()) {
          return transArray[i];
        }
      }
      // use last from preceeding year
      int lastHistoricYear = findYear(lastHistoric, lastHistoricOffset);
      if (--year > lastHistoricYear) {
        transArray = findTransitionArray(year);
        return transArray[transArray.length - 1];
      }
      // drop through
    }

    // using historic rules
    int index = Arrays.binarySearch(this.savingsInstantTransitions, epochSec);
    if (index < 0) {
      index = -index - 1;
    }
    if (index <= 0) {
      return null;
    }
    return new ZoneOffsetTransition(this.savingsInstantTransitions[index - 1], this.wallOffsets[index - 1],
        this.wallOffsets[index]);
  }