code: public Retryer<R> fibonacciWait(final long multiplier, final long maximumWait) {
          return withWaitStrategy(new WaitStrategy() {
              
              @Override
              public long computeSleepTime(int previousAttemptNumber, long delaySinceFirstAttemptInMillis) {
                  long fib = fib(previousAttemptNumber);
                  long result = multiplier * fib;
  
                  if (result > maximumWait || result < 0L) {
                      result = maximumWait;
                  }
  
                  return result >= 0L ? result : 0L;
              }
  
              private long fib(long n) {
                  if (n == 0L) return 0L;
                  if (n == 1L) return 1L;
  
                  long prevPrev = 0L;
                  long prev = 1L;
                  long result = 0L;
  
                  for (long i = 2L; i <= n; i++) {
                      result = prev + prevPrev;
                      prevPrev = prev;
                      prev = result;
                  }
  
                  return result;
              }
          });
      }
docs: Sets the wait strategy which sleeps for an increasing amount of time after the first failed attempt,
  and in Fibonacci increments after each failed attempt up to the {@code maximumTime}.
  The wait time between the retries can be controlled by the multiplier.
  nextWaitTime = fibonacciIncrement * {@code multiplier}.
  
  @param multiplier
  @param maximumWait the unit of the maximumWait is {@link TimeUnit#MILLISECONDS}
  @return