code: public final Flux<Flux<T>> windowUntil(Predicate<T> boundaryTrigger, boolean cutBefore, int prefetch) {
  		return onAssembly(new FluxWindowPredicate<>(this,
  				Queues.unbounded(prefetch),
  				Queues.unbounded(prefetch),
  				prefetch,
  				boundaryTrigger,
  				cutBefore ? FluxBufferPredicate.Mode.UNTIL_CUT_BEFORE : FluxBufferPredicate.Mode.UNTIL));
  	}
docs: Split this {@link Flux} sequence into multiple {@link Flux} windows delimited by the given
  predicate and using a prefetch. A new window is opened each time the predicate
  returns true.
  <p>
  Windows are lazily made available downstream at the point where they receive their
  first event (an element is pushed, the window completes or errors).
  <p>
  If {@code cutBefore} is true, the old window will onComplete and the triggering
  element will be emitted in the new window. This variant can emit an empty window
  if the sequence starts with a separator.
  <p>
  Otherwise, the triggering element will be emitted in the old window before it does
  onComplete, similar to {@link #windowUntil(Predicate)}. This variant shouldn't
  expose empty windows, as the separators are emitted into the windows they close.
  <p>
  <img class="marble" src="doc-files/marbles/windowUntilWithCutBefore.svg" alt="">
  
  @reactor.discard This operator discards elements it internally queued for backpressure
  upon cancellation or error triggered by a data signal.
  
  @param boundaryTrigger a predicate that triggers the next window when it becomes true.
  @param cutBefore set to true to include the triggering element in the new window rather than the old.
  @param prefetch the request size to use for this {@link Flux}.
  @return a {@link Flux} of {@link Flux} windows, bounded depending
  on the predicate.