@Override
  public @NotNull ImmutableList<E> subList(int fromIndex, int toIndex) {
    // optimization: do not excessively nest SubLists one into the other
    if (this instanceof SubList) {
      List<? extends E> original = ((SubList<? extends E>)this).l;
      int originalOffset = ((SubList<?>)this).offset;
      return new SubList<>(original, fromIndex + originalOffset, toIndex + originalOffset);
    }
    return new SubList<>(this, fromIndex, toIndex);
  }
@Override
  public @NotNull ImmutableList<E> subList(int fromIndex, int toIndex)