deleteOutOfPlace(sPredicate, bUpAndDown) {
			if (!this.isOutOfPlace(sPredicate)) {
				return; // already in place
			}
			if (bUpAndDown) {
				for (;;) { // find top-most out-of-place ancestor
					const sParentPredicate = this.mPredicate2OutOfPlace[sPredicate].parentPredicate;
					if (!this.isOutOfPlace(sParentPredicate)) {
						break;
					}
					sPredicate = sParentPredicate;
				}
			}
			this.mPredicate2OutOfPlace[sPredicate].context.setOutOfPlace(false);
			delete this.mPredicate2OutOfPlace[sPredicate];
			Object.values(this.mPredicate2OutOfPlace).forEach((oOutOfPlace) => {
				if (oOutOfPlace.parentPredicate === sPredicate) {
					this.deleteOutOfPlace(oOutOfPlace.nodePredicate);
				}
			});
		}
Deletes a node and all its descendants from the out-of-place list (making them in-place).

@param {string} sPredicate - The node's key predicate
@param {boolean} [bUpAndDown] - Whether to start from top-most out-of-place ancestor

@public